当我编译我的驱动程序时,我定位到Windows 8.1时发生了一些非常奇怪的事情。Windows驱动程序中的__security_init_cookie导致错误检查KERNEL_SECURITY_CHECK_FAILURE
一旦它加载,就会通过错误检查KERNEL_SECURITY_CHECK_FAILURE
(第一个参数6,意思是“The stack cookie security cookie was not properly initialized by the loader
”)崩溃。
这可能是由于构建驱动程序仅在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
,因此中断不应该被调用,但不知何故。
您是否手动声明了'__security_cookie'?如果'__security_cookie == 2B992DDFA232h'这个代码**会失败**(调用'RtlFastFail'),因为这意味着cookie保留其默认值(不安全)。有其他代码(查找KeTickCount)应该计算一个新的随机安全cookie。 – nneonneo
啊是的,你是正确的@nneonneo,我没有解释错误的控制流程。要回答你的问题,不,我没有手动声明__security_cookie。我查看了Windows 7二进制文件,它确实使用KeTickCount计算了一个新的cookie,但是在Windows 8.1二进制文件中完全没有相同的代码。 – InvokeStatic
我假设你在Windows 8.1系统上测试驱动程序?这个问题没有说。 –