内核驱动 unresolved external symbol @__security_check_cookie@4

本文介绍了解决使用WDK 7600.16385.0开发驱动过程中遇到的编译错误的方法。通过修改源代码并添加特定标记及函数,解决了因链接__security_check_cookie@4符号导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 问题解决.

01#ifdef  VS_IDE_BUILD
02ULONG ___security_cookie = 0xbb40;
03ULONG ___security_cookie_complement = 0xFFFF44BF;
04  
05NTSTATUS GsDriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegPath)
06{
07    LARGE_INTEGER tickCount;
08    KeQueryTickCount(&tickCount);
09    if(!___security_cookie || ___security_cookie == 0xbb40)
10    {
11        ULONG temp = (ULONG)&___security_cookie;
12        temp = ((temp  >>  8 )  ^  tickCount.u.LowPart) & 0xffff;
13        if(temp)
14            ___security_cookie = temp;
15        else
16            ___security_cookie = tickCount.u.LowPart & 0xffff;
17    }
18  
19    ___security_cookie_complement = ~___security_cookie;
20    return DriverEntry(DriverObject,RegPath);
21}
22  
23void __fastcall __security_check_cookie(ULONG cookie)
24{
25    if(cookie != ___security_cookie || cookie & 0xffff0000)
26        KeBugCheckEx(0x7f,cookie,___security_cookie,___security_cookie_complement,0);
27}
28#endif  // VS_IDE_BUILD

PS. 也可以这么解决, 如果 BufferSecurityCheck(/GS) 开关是打开的, 把入口点改成 GsDriverEntry@8, 并加上 BufferOverflowK.lib 静态库.

PPS. 原来, BufferOverflowK.lib 的意思是内核态的 BufferOverflow 库, BufferOverflowU.lib 是用户态的 BufferOverflow 库. That’s all.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值