!chkimg
L'estensione !chkimg rileva il danneggiamento nelle immagini dei file eseguibili confrontandoli con la copia in un archivio simboli o in un altro repository di file.
!chkimg [Options] [-mmw LogFile LogOptions] [Module]
Parametri
Opzioni Qualsiasi combinazione delle opzioni seguenti:
-p **** SearchPath
Cerca in modo ricorsivo il file in SearchPath prima di accedere al server dei simboli.
-f
Corregge gli errori nell'immagine. Ogni volta che l'analisi rileva differenze tra il file nell'archivio simboli e l'immagine in memoria, il contenuto del file nell'archivio simboli viene copiato sull'immagine. Se si esegue il debug in tempo reale, è possibile creare un file di dump prima di eseguire l'estensione !chkimg -f .
-Nar
Impedisce lo spostamento dell'immagine mappata del file nel server dei simboli. Per impostazione predefinita, quando la copia del file si trova nel server dei simboli e mappata in memoria, !chkimg sposta l'immagine del file nel server dei simboli. Tuttavia, se si usa l'opzione -nar , l'immagine del file dal server non viene spostata.
L'immagine eseguibile già in memoria (ovvero quella che viene analizzata) viene spostata, perché il debugger riloca sempre le immagini caricate.
Questa opzione è utile solo se il sistema operativo ha già spostato l'immagine originale. Se l'immagine non è stata spostata, !chkimg e il debugger spostano l'immagine. L'uso di questa opzione è raro.
-ss **** SectionName
Limita l'analisi a tali sezioni i cui nomi contengono la stringa SectionName. L'analisi includerà qualsiasi sezione non eliminabile il cui nome contiene questa stringa. SectionName fa distinzione tra maiuscole e minuscole e non può superare 8 caratteri.
-come
Fa sì che l'analisi includa tutte le sezioni dell'immagine ad eccezione delle sezioni scartate. Per impostazione predefinita, (se non si usa -as o -ss), l'analisi ignora le sezioni scrivibili, le sezioni che non sono eseguibili, le sezioni con "PAGE" nel nome e le sezioni scartabili.
-r **** StartAddress **** EndAddress
Limita l'analisi all'intervallo di memoria che inizia con StartAddress e termina con EndAddress. All'interno di questo intervallo vengono analizzate tutte le sezioni che in genere verrebbero analizzate. Se una sezione si sovrappone parzialmente a questo intervallo, viene analizzata solo quella parte della sezione che si sovrappone a questo intervallo. L'analisi è limitata a questo intervallo anche se si usa anche l'opzione -as o -ss .
-nospec
Fa sì che l'analisi includa le sezioni riservate di Hal.dll e Ntoskrnl.exe. Per impostazione predefinita, !chkimg non controlla alcune parti di questi file.
-noplock
Visualizza le aree che non corrispondono con un valore di byte di 0x90 (un'istruzione nop ) e un valore di byte di 0xF0 (un'istruzione di blocco ). Per impostazione predefinita, queste mancate corrispondenze non vengono visualizzate.
-Np
Determina il riconoscimento delle istruzioni con patch.
-d
Visualizza un riepilogo di tutte le aree non corrispondenti durante l'analisi. Per altre informazioni su questo testo di riepilogo, vedere la sezione Osservazioni.
-Db
Visualizza aree non corrispondenti in un formato simile al comando del debugger del database. Di conseguenza, ogni riga di visualizzazione mostra l'indirizzo del primo byte nella riga, seguito da un massimo di 16 valori di byte esadecimali. I valori dei byte sono immediatamente seguiti dai valori ASCII corrispondenti. Tutti i caratteri non stampabili, ad esempio i ritorni a capo e i feed di riga, vengono visualizzati come punti (.). I byte non corrispondenti sono contrassegnati da un asterisco (*).
-lo **** lines
Limita il numero di righe di output visualizzate da -d o -db al numero di righe.
-v
Visualizza informazioni dettagliate.
-mmw
Crea un file di log e registra l'attività di !chkimg in questo file. Ogni riga del file di log rappresenta una singola mancata corrispondenza.
LogFile
Specifica il percorso completo del file di log. Se si specifica un percorso relativo, il percorso è relativo al percorso corrente.
LogOptions
Specifica il contenuto del file di log. LogOptions è una stringa costituita da una concatenazione di varie lettere. Ogni riga del file di log contiene diverse colonne separate da virgole. Queste colonne includono gli elementi specificati dalle lettere di opzione seguenti, nell'ordine in cui le lettere vengono visualizzate nella stringa LogOptions . È possibile includere più volte le opzioni seguenti. È necessario includere almeno un'opzione.
Opzione Log | Informazioni incluse nel file di log |
---|---|
v |
Indirizzo virtuale della mancata corrispondenza |
r |
Offset (indirizzo relativo) della mancata corrispondenza all'interno del modulo |
s |
Simbolo che corrisponde all'indirizzo della mancata corrispondenza |
S |
Nome della sezione che contiene la mancata corrispondenza |
e |
Valore corretto previsto nella posizione di mancata corrispondenza |
w |
Valore non corretto che si trovava nella posizione di mancata corrispondenza |
LogOptions può includere anche alcune opzioni aggiuntive o nessuna delle opzioni aggiuntive seguenti.
Opzione Log | Effetto |
---|---|
o |
Se esiste già un file con il nome LogFile , il file esistente viene sovrascritto. Per impostazione predefinita, il debugger aggiunge nuove informazioni alla fine di qualsiasi file esistente. |
tString |
Aggiunge una colonna aggiuntiva al file di log. Ogni voce in questa colonna contiene String. L'opzione tString è utile se si aggiungono nuove informazioni a un file di log esistente ed è necessario distinguere i nuovi record dal vecchio. Non è possibile aggiungere spazio tra t e String. Se si usa l'opzione tIString , deve essere l'opzione finale in LogOptions, perché String viene usata per includere tutti i caratteri presenti prima dello spazio successivo. |
Ad esempio, se LogOptions è rSewo, ogni riga del file di log contiene l'indirizzo relativo e il nome della sezione del percorso di mancata corrispondenza e i valori previsti e effettivi in tale posizione. Questa opzione comporta anche la sovrascrittura di qualsiasi file precedente. È possibile usare l'opzione -mmw più volte se si desidera creare diversi file di log con opzioni diverse. È possibile creare fino a 10 file di log contemporaneamente.
Modulo
Specifica il modulo da controllare. Il modulo può essere il nome del modulo, l'indirizzo iniziale del modulo o qualsiasi indirizzo contenuto nel modulo. Se si omette Module, il debugger usa il modulo che contiene il puntatore all'istruzione corrente.
DLL
Windows XP e versioni successive |
Ext.dll |
Osservazioni:
Quando si usa !chkimg, confronta l'immagine di un file eseguibile in memoria con la copia del file che risiede in un archivio simboli.
Tutte le sezioni del file vengono confrontate, ad eccezione delle sezioni che sono scartate, che non sono eseguibili, che hanno "PAGE" nel nome o che provengono da INITKDBG. È possibile modificare questo comportamento usando le opzioni -ss, -as o -r .
!chkimg visualizza qualsiasi mancata corrispondenza tra l'immagine e il file come errore di immagine, con le eccezioni seguenti:
Gli indirizzi occupati dalla tabella indirizzi di importazione (IAT) non vengono controllati.
Alcuni indirizzi specifici in Hal.dll e Ntoskrnl.exe non vengono controllati, perché alcune modifiche si verificano quando vengono caricate queste sezioni. Per controllare questi indirizzi, includere l'opzione -nospec .
Se il valore di byte 0x90 è presente nel file e se il valore 0xF0 è presente nel byte corrispondente dell'immagine (o viceversa), questa situazione viene considerata una corrispondenza. In genere, il server dei simboli contiene una versione di un file binario presente sia nelle versioni uniprocessore che in quelle multiprocessore. In un processore basato su x86, l'istruzione di blocco è 0xF0 e questa istruzione corrisponde a un'istruzione nop (0x90) nella versione uniprocessor. Se si desidera che !chkimg visualizzi questa coppia come non corrispondente, impostare l'opzione -noplock .
Nota Se si usa l'opzione -f per correggere le mancate corrispondenze dell'immagine, !chkimg corregge solo le mancate corrispondenze che considera errori. Ad esempio, !chkimg non modifica un byte 0x90 in un byte 0xF0 a meno che non si includa -noplock.
Quando si include l'opzione -d , !chkimg visualizza un riepilogo di tutte le aree non corrispondenti durante l'analisi in corso. Ogni mancata corrispondenza viene visualizzata su due righe. La prima riga include l'inizio dell'intervallo, la fine dell'intervallo, le dimensioni dell'intervallo, il nome del simbolo e l'offset corrispondenti all'inizio dell'intervallo e il numero di byte dall'ultimo errore (tra parentesi). La seconda riga è racchiusa tra parentesi quadre e include i valori di byte esadecimali previsti, due punti e quindi i valori di byte esadecimali effettivamente rilevati nell'immagine. Se l'intervallo è più lungo di 8 byte, vengono visualizzati solo i primi 8 byte prima dei due punti e dopo i due punti. Nell'esempio seguente viene illustrata questa situazione.
be000015-be000016 2 bytes - win32k!VeryUsefulFunction+15 (0x8)
[ 85 dd:95 23 ]
In alcuni casi, un driver modifica parte del kernel di Microsoft Windows usando hook, reindirizzamento o altri metodi. Anche un driver che non si trova più nello stack potrebbe aver modificato parte del kernel. Puoi usare l'estensione !chkimg come strumento di confronto dei file per determinare quali parti del kernel di Windows (o qualsiasi altra immagine) vengono modificate dai driver e esattamente come vengono modificate le parti. Questo confronto è più efficace sui file di dump completi.
Controllare ogni modulo caricato
È anche possibile usare !chkimg insieme all'estensione !for_each_module per controllare l'immagine di ogni modulo caricato. Nell'esempio seguente viene illustrata questa situazione.
!for_each_module !chkimg @#ModuleName
!analizza esempio
Si supponga di riscontrare un controllo di bug, ad esempio e iniziare usando !analyze.
kd> !analyze
....
BugCheck 1000008E, {c0000005, bf920e48, baf75b38, 0}
Probably caused by : memory_corruption
CHKIMG_EXTENSION: !chkimg !win32k
....
In questo esempio, l'output !analyze suggerisce che si è verificato un danneggiamento della memoria e include una riga CHKIMG_EXTENSION che suggerisce che Win32k.sys potrebbe essere il modulo danneggiato. Anche se questa riga non è presente, è possibile considerare possibili danneggiamenti nel modulo sopra lo stack. Iniziare usando !chkimg senza opzioni, come illustrato nell'esempio seguente.
kd> !chkimg win32k
Number of different bytes for win32k: 31
L'esempio seguente mostra che esistono effettivamente danneggiamenti della memoria. Usare !chkimg -d per visualizzare tutti gli errori per il modulo Win32k.
kd> !chkimg win32k -d
bf920e40-bf920e46 7 bytes - win32k!HFDBASIS32::vSteadyState+1f
[ 78 08 d3 78 0c c2 04:00 00 00 00 00 01 00 ]
bf920e48-bf920e5f 24 bytes - win32k!HFDBASIS32::vHalveStepSize (+0x08)
[ 8b 51 0c 8b 41 08 56 8b:00 00 00 00 00 00 00 00 ]
Number of different bytes for win32k: 31
Quando si tenta di disassemblare l'immagine danneggiata della seconda sezione elencata, potrebbe verificarsi l'output seguente.
kd> u win32k!HFDBASIS32::vHalveStepSize
win32k!HFDBASIS32::vHalveStepSize:
bf920e48 0000 add [eax],al
bf920e4a 0000 add [eax],al
bf920e4c 0000 add [eax],al
bf920e4e 0000 add [eax],al
bf920e50 7808 js win32k!HFDBASIS32::vHalveStepSize+0x12 (bf920e5a)
bf920e52 d3780c sar dword ptr [eax+0xc],cl
bf920e55 c20400 ret 0x4
bf920e58 8b510c mov edx,[ecx+0xc]
Usare quindi !chkimg -f per correggere il danneggiamento della memoria.
kd> !chkimg win32k -f
Warning: Any detected errors will be fixed to what we expect!
Number of different bytes for win32k: 31 (fixed)
È ora possibile disassemblare la visualizzazione corretta e visualizzare le modifiche apportate.
kd> u win32k!HFDBASIS32::vHalveStepSize
win32k!HFDBASIS32::vHalveStepSize:
bf920e48 8b510c mov edx,[ecx+0xc]
bf920e4b 8b4108 mov eax,[ecx+0x8]
bf920e4e 56 push esi
bf920e4f 8b7104 mov esi,[ecx+0x4]
bf920e52 03c2 add eax,edx
bf920e54 c1f803 sar eax,0x3
bf920e57 2bf0 sub esi,eax
bf920e59 d1fe sar esi,1
Analizzare il danneggiamento dell'archiviazione e della memoria
Il danneggiamento casuale di file e memoria può essere difficile da analizzare. Uno strumento da considerare in alcune situazioni consiste nell'abilitare un controllo di memoria aggiuntivo, ad esempio usando il verificatore del driver. Per informazioni su Driver Verifier, vedere Driver Verifier.
Per testare la memoria fisica, usare lo strumento Diagnostica memoria Windows. Viene usato e altre tecniche generali sono descritte in Dati dello schermo blu.
Usare l'utilità di analisi del disco per identificare gli errori del file system. Selezionare e tenere premuto (o fare clic con il pulsante destro del mouse) sull'unità da analizzare e selezionare Proprietà. Selezionare Strumenti. Selezionare il pulsante Controlla ora .