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

时间:2015-09-04 04:19:22

标签: windows driver wdk

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

一旦加载,它就会与错误检查enchant(); window.onload = function() { game = new Game(...); game.onload = function() {...}; game.start(); } 崩溃,第一个参数6,这意味着" KERNEL_SECURITY_CHECK_FAILURE"。

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

我能够确切地找到发生此错误的位置。它发生在由The stack cookie security cookie was not properly initialized by the loader调用的__security_init_cookie函数中。

GsDriverEntry

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

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)

但是,The first check checks if rax (__security_cookie) is zero and the second check compares it to 2B992DDFA232h. 在我的二进制文件中声明为__security_cookie,因此永远不应该调用中断,但不知道它是什么。

2 个答案:

答案 0 :(得分:3)

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

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

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

  

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

     

新的Windows8内核驱动程序将检查其安全cookie是否已经存在   更换。

答案 1 :(得分:2)

对于那些在Visual Studio 2015中构建驱动程序的人。如果您需要驱动程序与Windows 7兼容。

  1. 您需要Windows 10 sdk并匹配WDK(修订必须匹配)。
  2. 在您的驱动程序项目中使用默认目标平台版本,即10.x.x.x和默认平台工具集,即WindowsKernelModeDriver10。这里不要改变任何东西。并且不要触摸_WIN32_WINNT定义。
  3. 平台在“驱动程序设置 - 常规”中指定。在那里你指定目标操作系统版本 - Windows 7,目标平台 - 桌面。而且只有这一个。如果您指定Windows 8或Windows 8.1,它仍将在安全cookie检查代码中崩溃。
  4. P.S。该驱动程序仍将与Windows 10,8.1和8兼容。