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

标签 windows driver wdk

当我在编译我的驱动程序时以 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/

相关文章:

c++ - C驱动编程蓝屏死机

windows - 一致的测试环境

windows - 每当计算机锁定时让屏幕保护程序启动?

c# - NHibernate 哪个缓存用于 WinForms 应用程序

c++ - 我可以用 C++ 为 iOS 编写设备驱动程序吗?

windows - 同时从多个应用程序访问网络摄像头

用于音频处理和路由到默认音频设备的音频 Hook 或自定义音频驱动程序

c++ - 如何创建计算驱动程序?

c - Windows 驱动程序 - 在用户模式和内核模式之间传递字符串。动态大小的结构

c++ - Windows 编辑启动应用程序/C++