2015-09-04 99 views
7

當我編譯我的驅動程序時,我定位到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,因此中斷不應該被調用,但不知何故。

+0

您是否手動聲明瞭'__security_cookie'?如果'__security_cookie == 2B992DDFA232h'這個代碼**會失敗**(調用'RtlFastFail'),因爲這意味着cookie保留其默認值(不安全)。有其他代碼(查找KeTickCount)應該計算一個新的隨機安全cookie。 – nneonneo

+0

啊是的,你是正確的@nneonneo,我沒有解釋錯誤的控制流程。要回答你的問題,不,我沒有手動聲明__security_cookie。我查看了Windows 7二進制文件,它確實使用KeTickCount計算了一個新的cookie,但是在Windows 8.1二進制文件中完全沒有相同的代碼。 – InvokeStatic

+0

我假設你在Windows 8.1系統上測試驅動程序?這個問題沒有說。 –

回答

3

Windows 8+能夠爲加載的可執行映像生成安全cookie。安全性cookie的位置存儲在數據目錄中的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是否已被替換爲 。

2

對於那些誰在Visual Studio 2015年建立的驅動程序。如果您需要驅動程序與Windows 7

  1. 您需要使用Windows 10 SDK和配套WDK(修訂必須匹配)兼容。
  2. 在您的驅動程序項目中,使用默認的目標平臺版本,即10.x.x.x和默認的平臺工具集,即WindowsKernelModeDriver10。不要在這裏改變任何東西。並且請勿觸摸_WIN32_WINNT定義。
  3. 該平臺在Driver Settings - General中指定。您可以在其中指定目標操作系統版本 - Windows 7,目標平臺 - 桌面。只有這一個。如果您指定Windows 8或Windows 8.1,它仍然會在安全Cookie檢查代碼中崩潰。

p.s.驅動程序仍將與Windows 10,8.1和8兼容。

相關問題