ref : http://blog.tinybrowser.net/archives/1424
最近在用 winddk 7600.16385.0 开发驱动, 小心谨慎的按照这篇文章设置了编译连接参数, 在编译选项关闭了 buffer security check, 但工程里要用到 wdmsec.lib 静态库, 里面链接进了符号 __security_check_cookie@4, 因此我编译始终出错, 用了各种办法问题依旧, 中间甚至试图逆向 wdmsec.lib 静态库, 用 IDA 打开一看, 发现工程浩大, 只能放弃.
G(oogle) 啊 G啊, G 了好久, 在 这里 找到了解决方案:
将 bufferoverflowU.lib 静态库加入链接依赖列表. 问题貌似解决, 但其实是不对的.

后来用 depends 打开 sys 文件一看, 链接进了 kernel32.dll,

对于 ring 3 的应用程序, 这是很好的解决办法; 但对于内核驱动, 这是绝对不可以的.
看来 这里 才是解决问题的真正方法.
在源代码的最后添加如下代码, 然后在工程设置内添加 VS_IDE_BUILD 标记. 在链接设置内将入口点从 DriverEntry 改成 GsDriverEntry. 问题解决.
02 | ULONG ___security_cookie = 0xbb40; |
03 | ULONG ___security_cookie_complement = 0xFFFF44BF; |
05 | NTSTATUS GsDriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegPath) |
07 | LARGE_INTEGER tickCount; |
08 | KeQueryTickCount(&tickCount); |
09 | if (!___security_cookie || ___security_cookie == 0xbb40) |
11 | ULONG temp = ( ULONG )&___security_cookie; |
12 | temp = ((temp >> 8 ) ^ tickCount.u.LowPart) & 0xffff; |
14 | ___security_cookie = temp; |
16 | ___security_cookie = tickCount.u.LowPart & 0xffff; |
19 | ___security_cookie_complement = ~___security_cookie; |
20 | return DriverEntry(DriverObject,RegPath); |
23 | void __fastcall __security_check_cookie( ULONG cookie) |
25 | if (cookie != ___security_cookie || cookie & 0xffff0000) |
26 | KeBugCheckEx(0x7f,cookie,___security_cookie,___security_cookie_complement,0); |
PS. 也可以这么解决, 如果 BufferSecurityCheck(/GS) 开关是打开的, 把入口点改成 GsDriverEntry@8, 并加上 BufferOverflowK.lib 静态库.
PPS. 原来, BufferOverflowK.lib 的意思是内核态的 BufferOverflow 库, BufferOverflowU.lib 是用户态的 BufferOverflow 库. That’s all.