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

前端之家收集整理的这篇文章主要介绍了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.

猜你在找的Windows相关文章