当我在编译我的驱动程序时以 Windows 8.1 为目标时,发生了一些非常奇怪的事情。
一旦加载,它就会崩溃,错误检查 KERNEL_SECURITY_CHECK_FAILURE
,第一个参数 6,意思是“堆栈 cookie 安全 cookie 没有被加载程序正确初始化
”。
这可能是由于构建了仅在 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)
从这个反汇编中我们可以看到它执行了 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
header 中的 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 - Windows 驱动程序中的 __security_init_cookie 导致错误检查 KERNEL_SECURITY_CHECK_FAILURE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32389999/