Windows驱动程序中的__security_init_cookie导致错误检查KERNEL_SECURITY_CHECK_FAILURE

Inv*_*tic 7 windows driver wdk

当我编译驱动程序时,当我以Windows 8.1为目标时,会发生一些非常奇怪的事情.

一旦加载,它就会与bugcheck崩溃KERNEL_SECURITY_CHECK_FAILURE,第一个参数6,意思是" The stack cookie security cookie was not properly initialized by the loader".

这可能是由于构建驱动程序仅在Windows 8上运行并尝试在早期版本的Windows上加载驱动程序映像引起的.要避免此问题,您必须构建驱动程序以在早期版本的Windows上运行". 当我以Windows 7为目标时,不会发生此错误.

我能够找到这个错误发生的确切位置.它发生在__security_init_cookie被调用的函数中GsDriverEntry.

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)
Run Code Online (Sandbox Code Playgroud)

从这个反汇编中我们可以看到它执行了2次检查.

The first check checks if rax (__security_cookie) is zero and the 
second check compares it to 2B992DDFA232h.
Run Code Online (Sandbox Code Playgroud)

但是,__security_cookie在我的二进制文件中声明为2B992DDFA232h,因此永远不应该调用中断,但不知何故它是.

小智 5

Windows 8+ 能够为加载的可执行映像生成安全 cookie。安全 cookie 的位置存储在标题中的LoadConfig数据目录中,PE以便 Windows 加载程序可以轻松替换它。
原因是操作系统应该能够以安全的方式生成 cookie(例如,使用RDRAND可用的指令和/或其他随机熵源)。也不需要将 cookie 初始化代码复制到每个驱动程序。

如果您的驱动程序面向 Windows 8(和更新版本),它希望操作系统初始化 cookie。因此,BSOD如果 cookie 没有改变,它就会引发。
另一方面,如果您的驱动程序面向较旧的操作系统(Windows 7),则编译器必须生成初始化 cookie 的代码(如果操作系统尚未初始化)。这样,驱动程序与所有 Windows 版本兼容。

我还没有找到有关此 Windows 8 功能的任何官方描述,但这里有一篇描述它的文章:
Reversing Windows8: Interesting Features of Kernel Security

在加载内核驱动程序时,Windows 8 调用 MiProcessLoadConfigForDriver 生成安全 cookie,在 PE 中定位旧的安全 cookie 并替换它。

新的 Windows8 内核驱动程序将检查其安全 cookie 是否已被替换。