当我编译驱动程序时,当我以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
,因此永远不应该调用中断,但不知道它是什么。
答案 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兼容。
P.S。该驱动程序仍将与Windows 10,8.1和8兼容。