當我編譯我的驅動程序時,我定位到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系統上測試驅動程序?這個問題沒有說。 –