内核驱动 unresolved external symbol @__security_check_cookie@4
最近在用 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. 问题解决.
#ifdef VS_IDE_BUILD
ULONG ___security_cookie = 0xbb40;
ULONG ___security_cookie_complement = 0xFFFF44BF;
NTSTATUS GsDriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegPath)
{
LARGE_INTEGER tickCount;
KeQueryTickCount(&tickCount);
if(!___security_cookie || ___security_cookie == 0xbb40)
{
ULONG temp = (ULONG)&___security_cookie;
temp = ((temp >> 8 ) ^ tickCount.u.LowPart) & 0xffff;
if(temp)
___security_cookie = temp;
else
___security_cookie = tickCount.u.LowPart & 0xffff;
}
___security_cookie_complement = ~___security_cookie;
return DriverEntry(DriverObject,RegPath);
}
void __fastcall __security_check_cookie(ULONG cookie)
{
if(cookie != ___security_cookie || cookie & 0xffff0000)
KeBugCheckEx(0x7f,cookie,___security_cookie,___security_cookie_complement,0);
}
#endif // VS_IDE_BUILD
PS. 也可以这么解决, 如果 BufferSecurityCheck(/GS) 开关是打开的, 把入口点改成 GsDriverEntry@8, 并加上 BufferOverflowK.lib 静态库.
PPS. 原来, BufferOverflowK.lib 的意思是内核态的 BufferOverflow 库, BufferOverflowU.lib 是用户态的 BufferOverflow 库. That’s all.
延伸阅读:
C 语言库函数的连接
编译器的一些参数

近期评论