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

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

一旦加载,它就会与错误检查KERNEL_Security_CHECK_FAILURE,第一个参数6崩溃,这意味着“堆栈cookie安全cookie没有被加载器正确初始化”.

这可能是由于构建驱动程序仅在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,因此永远不应该调用中断,但不知怎的.

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

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

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

When loading the kernel driver,Windows 8 calls MiProcessLoadConfigForDriver to
generate security cookie,locates old security cookie in PE and replaces it.

New Windows8 kernel drivers will check if their security cookies are already replaced.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...