【发布时间】:2015-11-30 03:16:43
【问题描述】:
当我在编译驱动程序时以 Windows 8.1 为目标时,发生了一些非常奇怪的事情。
一旦加载,它就会因错误检查KERNEL_SECURITY_CHECK_FAILURE 而崩溃,第一个参数 6 表示“The stack cookie security cookie was not properly initialized by the loader”。
这可能是由于构建了仅在 Windows 8 上运行的驱动程序并尝试在早期版本的 Windows 上加载驱动程序映像造成的。为避免此问题,您必须构建驱动程序以在早期版本的 Windows 上运行”。当我面向 Windows 7 时不会出现此错误。
我能够准确找到发生此错误的位置。它发生在由GsDriverEntry 调用的__security_init_cookie 函数中。
INIT:000000014000C1B4 __security_init_cookie proc near ; CODE XREF: GsDriverEntry+10p
INIT:000000014000C1B4 mov rax, cs:__security_cookie
INIT:000000014000C1BB test rax, rax
INIT:000000014000C1BE jz short loc_14000C1DA
INIT:000000014000C1C0 mov rcx, 2B992DDFA232h
INIT:000000014000C1CA cmp rax, rcx
INIT:000000014000C1CD jz short loc_14000C1DA
INIT:000000014000C1CF not rax
INIT:000000014000C1D2 mov cs:__security_cookie_complement, rax
INIT:000000014000C1D9 retn
INIT:000000014000C1DA ; ---------------------------------------------------------------------------
INIT:000000014000C1DA
INIT:000000014000C1DA loc_14000C1DA: ; CODE XREF: __security_init_cookie+Aj
INIT:000000014000C1DA ; __security_init_cookie+19j
INIT:000000014000C1DA mov ecx, 6
INIT:000000014000C1DF int 29h ; Win8: RtlFailFast(ecx)
从这个反汇编中我们可以看到它执行了 2 次检查。
The first check checks if rax (__security_cookie) is zero and the
second check compares it to 2B992DDFA232h.
但是,__security_cookie 在我的二进制文件中声明为2B992DDFA232h,因此不应调用中断,但不知何故它确实如此。
【问题讨论】:
-
您是否手动声明了
__security_cookie?如果__security_cookie == 2B992DDFA232h,该代码将失败(调用RtlFastFail),因为这意味着cookie 保留在其默认值(不安全)。其他地方的代码(查找KeTickCount)应该计算一个新的随机安全cookie。 -
啊,是的,你是对的@nneonneo,我确实错误地解释了那个控制流。要回答您的问题,不,我没有手动声明 __security_cookie。我查看了 Windows 7 二进制文件,它确实使用 KeTickCount 计算了一个新的 cookie,但是在 Windows 8.1 二进制文件中完全缺少等效代码。
-
我假设您正在 Windows 8.1 系统上测试驱动程序?问题没有说。