2015-09-04 5 views
7

Sta accadendo qualcosa di molto strano quando scelgo come destinazione Windows 8.1 quando compilo il mio driver.__security_init_cookie nel driver di Windows causa il controllo dei bug KERNEL_SECURITY_CHECK_FAILURE

Non appena viene caricato, si blocca con il bugcheck KERNEL_SECURITY_CHECK_FAILURE, il primo parametro 6, che significa "The stack cookie security cookie was not properly initialized by the loader".

Ciò potrebbe essere causato dalla creazione di un driver da eseguire solo su Windows 8 e dal tentativo di caricare l'immagine del driver su una versione precedente di Windows. Per evitare questo problema, è necessario creare il driver per eseguire su una versione precedente di Windows. "Questo errore non si verifica quando scelgo come destinazione Windows 7.

Sono stato in grado di individuare esattamente dove si verifica questo errore. sta accadendo nella funzione __security_init_cookie che è chiamato da 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) 

da questo smontaggio possiamo vedere che esegue 2 assegni.

The first check checks if rax (__security_cookie) is zero and the 
second check compares it to 2B992DDFA232h. 

Tuttavia, 012.378.è dichiarato nel mio binario come 2B992DDFA232h, e quindi l'interrupt non dovrebbe mai essere chiamato, ma in qualche modo lo è.

+0

Hai dichiarato '__security_cookie' manualmente? Tale codice fallirà ** (chiama 'RtlFastFail') se' __security_cookie == 2B992DDFA232h' perché significa che il cookie è stato lasciato al suo valore predefinito (non sicuro). C'è del codice altrove (cerca "KeTickCount") che dovrebbe calcolare un nuovo cookie di sicurezza casuale. – nneonneo

+0

Ah sì, hai ragione @nneonneo, ho interpretato il flusso di controllo in modo errato. Per rispondere alla tua domanda, no, non ho dichiarato manualmente __security_cookie. Ho dato un'occhiata al file binario di Windows 7 e ha effettivamente calcolato un nuovo cookie con KeTickCount, tuttavia il codice equivalente è completamente mancante nel file binario di Windows 8.1. – InvokeStatic

+0

Suppongo che tu stia testando il driver su un sistema Windows 8.1? La domanda non dice. –

risposta

3

Windows 8+ è in grado di generare cookie di sicurezza per l'immagine eseguibile caricata. La posizione del cookie di sicurezza è memorizzata nella directory dei dati LoadConfig nell'intestazione PE in modo che il caricatore di Windows possa sostituirlo facilmente.
Il motivo è che il sistema operativo dovrebbe essere in grado di generare il cookie in modo sicuro (ad esempio utilizzando l'istruzione RDRAND se disponibile e/o altre fonti di entropia casuale). Inoltre non è necessario copiare il codice di inizializzazione dei cookie su ogni driver.

Se il tuo driver è destinato a Windows 8 (e più recente), si aspetta che il SO inizializzi il cookie. Pertanto solleva BSOD se il cookie non è stato modificato.
D'altra parte, se il tuo driver ha come target il SO più vecchio (Windows 7), il compilatore deve generare il codice che inizializza il cookie se non era già inizializzato dal sistema operativo. In questo modo il driver è compatibile con tutte le versioni di Windows.

non ho trovato una descrizione ufficiale di questa funzionalità di Windows 8, ma qui è l'articolo che lo descrive:
Reversing Windows8: Interesting Features of Kernel Security

Quando si carica il driver del kernel, Windows 8 chiamate MiProcessLoadConfigForDriver a generare cookie di protezione , individua il vecchio cookie di sicurezza in PE e lo sostituisce.

I nuovi driver del kernel Windows8 controlleranno se i loro cookie di sicurezza sono già sostituiti da .

2

Per coloro che costruiscono i conducenti in Visual Studio 2015. Se è necessario il driver per essere compatibile con Windows 7.

  1. Hai bisogno di Windows 10 SDK e la congruenza WDK (revisioni deve corrispondere).
  2. Nel progetto del driver utilizzare la versione della piattaforma di destinazione predefinita, ad esempio 10.x.x.xe il tool di piattaforma predefinito, ad esempio WindowsKernelModeDriver10. NON cambiare nulla qui. E non toccare la definizione _WIN32_WINNT.
  3. La piattaforma è specificata in Impostazioni driver - Generale. Lì si specifica Target OS Version - Windows 7, Target Platform - Desktop. E SOLO QUESTO. Se si specifica Windows 8 o Windows 8.1, il codice di controllo del cookie di sicurezza continuerà a bloccarsi.

p.s. il driver sarà comunque compatibile con Windows 10, 8.1 e 8.

Problemi correlati