解决XP DDK编译的native程序在win2k下蓝屏的问题
最近写一个 native 程序,使用 xp ddk 编译,发现编出来的程序在 win2k 下运行会导致蓝屏,经过分析,发现原来是链接了一个 win2k 下的 ntdll.dll 未
实现的一个函数 RtlUnhandledExceptionFilter,所以加载时导致蓝屏。
尝试用 xp ddk 带的 Windows 2000 的 build 环境去编译,结果是
1>LINK : error LNK2001: unresolved external symbol _NtProcessStartupForGS@4 1>bufferoverflow.lib(gs_support.obj) : error LNK2019: unresolved external symbol __imp__RtlUnhandledExceptionFilter@4 referenced in function ___report_gsfailure
看来不设法把对 RtlUnhandledExceptionFilter 的引用去掉是解决不了这个问题了。
继续用 IDA 简单分析一下,发现这个函数是被 security_check_cookie 所调用到,我们知道 security_check_cookie 这个函数是微软最新的编译器自动添加到函数的尾部,用来检测函数是否存在堆栈发生缓存溢出的错误,如果是普通应用程序,我们可以通过把 c/c++ 的编译选项 Buffer Security Check 关掉,这样就不使用编译器的 /GS 开关,就不会自动添加 security_check_cookie 这个函数了,可是在native程序里如何去掉 /GS 开关呢。
查找 DDK 目录下的所有包含 /GS 的文件,发现文件 i386mk.inc 里面有个 BUFFER_OVERFLOW_CHECKS 和 /GS 相关,在 sources 文件里加入一句 BUFFER_OVERFLOW_CHECKS=0,重新用 xp ddk 编译,发现编出来的 exe 里面没有再链接 RtlUnhandledExceptionFilter 函数了,放在 win2k下运行,也不蓝屏了,问题解决了。
分类: DDK / Drivers
我当时还以为是你自己用到了这个函数呢 呵呵
原来是其他函数去调用它导致变成蓝瓶的好喝的了~~