installazione e prima configurazione del kernel · pdf filese volete potrete anche cambiare...

12
Debug del kernel di windows Scritto da Administrator Sabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23 Installazione e prima configurazione del kernel debugger Non sto qua a spiegarvi l'utilità per cui è importante eseguire un debug in modalità kernel, ma a molti sarà capitato di voler iniziare a esplorare questo mondo e imbattersi in alcuni problemi. Infatti molti siti, articoli fanno riferimento ad software sviluppati da terzi, come ad esempio Softic e , che non sono stati più portati avanti e quindi risulta veramente difficile farli funzionare. D'altra parte la Microsoft ha un suo debbuger, magari non con una grafica accativante, magari un po complicato con centinaia di comandi, ma ben mantenuto e quindi sempre aggiornato. Il pacchetto offerto dalla microsoft, scaricabile direttamente dal suo sito , comprende diversi tool, che comprendono sia applicazioni in modalità console, sia in modalità windows. Quello a cui, per brevità, faremo riferimento è il windows debugger (Windbg.exe) e nonostante vi siano tanti modi per eseguire lo stesso debug, esporremo solo alcuni di essi, perché altrimenti risulterebbe abbastanza dispersivo. Quindi dopo aver scaricato la suite " Debugging Tools for Windows " nella versione a 32 o 64-bit , a seconda delle vostre esigenze, procedete con l'installazione. Vi ricordo che sia per installare che per usare il kernel debugger è necessario avere i privilegi di amministratore. Il debugger installato, mi riferisco sempre a Windbg, può funzione in user mode che in kernel mode, ma per entrambi sarà necessario installare i simboli, a cui il debugger farà riferimento durante la sua esecuzione (vedi articolo sui symbol files ). Potete provare a scaricarvi la versione esatta dei simboli che vi occorrono sempre dal sito della Microsoft, ma sinceramente molte persone hanno incontrato problemi nella configurazione del debugger, quindi il consiglio che vi do è quello di usare quelli disponibili online dal sito della microsoft. Quindi andate nel menù File e clikkate su Symbol File Path : 1 / 12

Upload: trinhminh

Post on 11-Mar-2018

214 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

Installazione e prima configurazione del kernel debugger

Non sto qua a spiegarvi l'utilità per cui è importante eseguire un debug in modalità kernel, ma amolti sarà capitato di voler iniziare a esplorare questo mondo e imbattersi in alcuni problemi.Infatti molti siti, articoli fanno riferimento ad software sviluppati da terzi, come ad esempio Softice ,che non sono stati più portati avanti e quindi risulta veramente difficile farli funzionare. D'altraparte la Microsoft ha un suo debbuger, magari non con una grafica accativante, magari un pocomplicato con centinaia di comandi, ma ben mantenuto e quindi sempre aggiornato.

Il pacchetto offerto dalla microsoft, scaricabile direttamente dal suo sito , comprende diversitool, che comprendono sia applicazioni in modalità console, sia in modalità windows. Quello acui, per brevità, faremo riferimento è il windows debugger (Windbg.exe) e nonostante vi sianotanti modi per eseguire lo stesso debug, esporremo solo alcuni di essi, perché altrimentirisulterebbe abbastanza dispersivo.

Quindi dopo aver scaricato la suite "Debugging Tools for Windows" nella versione a 32 o64-bit , a seconda delle vostre esigenze, procedete con l'installazione. Vi ricordo che sia perinstallare che per usare il kernel debugger è necessario avere i privilegi di amministratore.

Il debugger installato, mi riferisco sempre a Windbg, può funzione in user mode che in kernelmode, ma per entrambi sarà necessario installare i simboli, a cui il debugger farà riferimentodurante la sua esecuzione (vedi articolo sui symbol files ). Potete provare a scaricarvi laversione esatta dei simboli che vi occorrono sempre dal sito della Microsoft, ma sinceramentemolte persone hanno incontrato problemi nella configurazione del debugger, quindi il consiglioche vi do è quello di usare quelli disponibili online dal sito della microsoft.

Quindi andate nel menù File e clikkate su Symbol File Path:

1 / 12

Page 2: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

Dopo di che inserite la seguente stringa:

SRV*C:websymbols*http://msdl.microsoft.com/download/symbols

Questa frase indica la cartella nel vostro hard disk "C:websymbols" come deposito locale deisymboli  recuperati dal sito della microsoft.

Ora se lanciate l'esecuzione di una applicazione sempre dal menù file, vedrete che i simboliverranno scaricati e utilizzati correttamente.

Ora passiamo alla modalità kernel, e tanto per essere chiari, vediamo di spiegare in pocheparole di cosa si tratta. Un normale debugger funziona in user mode, il che limita il monitoraggioe la modifica della memoria virtuale del programma a quella assegnata dal sistema operativo.Per maggiori dettagli su cosa sia la memoria virtuale di un processo vi consigli di leggervi ilrelativo articolo presente su questo sito, cmomunque possiamo dire ache ad ogni processoviene assegnato uno spazio di memoria diviso in 2 parti; la prima di esse la può utilizzare comevuole, la seconda è usata dal sistema operativo (kernel). Ora nella prima parte il processoscrive e legge le sue variabili, ma gli è proibito l'uso della memoria usata dal kernel. Per poterciaccedere avremo bisogno di un debugger, o una sua parte, lavori in kernel mode., ed è proprioquesto che vorremo fare usando Windbg in modalità kernel.

Se dovessimo sintetizzare il concetto potremo affermare che mentre un debugger normaleesegue il debug di un programma che è eseguito in un sistema operativo, un debugger in kernelmode esegue un debug del sitema operativo che sta ospitando il programma!

Ora ci sono tanti modi per usare questo tipo di debug:

2 / 12

Page 3: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

1. collegarsi in locale: sebbene sia il modo più banale ve lo sconsiglio perché molte delle funzionalità sono

limitate, tipo breakpoint etc.. 2. collegarsi con un cavo usb,firewire, o più comunemente un cavo seriale al pc dadebuggare:

questa è la scelta più consigliata se volete fare un debug della macchina efficiente. 3. collegarsi ad una macchina virtuale:

questa non è la scelta più professionale e neanche più efficiente, ma non sarete costretti aprocurarvi cavi o ad usare 2 pc.

Io in questo articolo vi consiglio per semplicità di usare il terzo metodo che è il più veloce epratico.

Per prima cosa occorre creare una macchina virtuale, e per fare ciò vi sono diversi softwarecome VirtualBox , VMware ,  VirtualPC e altri...

Ora non li ho testati tutti con il debugger, ma penso che siano equivalenti. Quindi per semplicitàuseremo quello della microsoft. Negli esempi successivi useremo un pc locale con Xp ed unamacchina virtuale sempre con Xp. La macchina virtuale che userò è il Virtual PC 2007, macredo sia già stato rimpiazzato dalla versione RC. Ad ogni modo qualsiasi cosa usiate i concettirimangono validi.

Scaricate e installate la macchina virtuale, il suo sistema operativo e così via..

ora dobbiamo scegliere come collegarci ad essa, considerando che probabilemente nel pclocale manco ce la avete una porta seriale (COM):

3 / 12

Page 4: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

1. Usare delle porte COM virtuali 2. Usare un "named pipe"

Connessione con delle porte COM virtuali

Per fare questo dovrete scaricarvi il software necessario ( io consiglio com0com che è gratuito esemplice da usare). Una volta scaricato e installato vi ritroverete 2 porte COM collegate tra loro. Per verificarloavviate 2 HyperTerminal e connettevi ad entrambe le porte; se tutto funziona bene vedrete chequello che scrivete in un terminale appare nell'altro e viceversa.

Se volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com:

change CNCA0 portname=COM11change CNCB0 portname=COM12

e alla fine avrete una configurazone del genere:

Ora il debug del kernel lo collego alla porta COM11 e rimarrà in attesa di dati su di essa

4 / 12

Page 5: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

Ora passiamo alla macchina virtuale, essa dovrà avere una porta COM mappata sulla portaCOM12 del pc che la ospita:

Il sistema operativo all'interno della macchina virtuale, al momento del boot iniziale, dovràessere impostato in modalità debug e connettersi alla porta COM2, che altro non è che la portaCOM12 del pc locale, la quale a sua volta è virtualmente collegata alla porta COM11 sulla qualeè in attesa il debugger. A tal fine modifichiamo il boot.ini aggiungendo una riga al suo interno,così da introdurre una scelta multipla all'avvio: [boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP Professional" /fastdetectmulti(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP dbg COM2"/fastdetect /debug /debugport=com2 /baud=115000 Al boot vedrete più o meno questo:

Se tutto è andato per il verso giusto il debugger, la prima volta, impiegherà un po di tempo perscaricarsi i simboli per la macchina che sta debuggando e poi potrete iniziare ad usarlo. Connessione con una named pipe Il metodo esposto in precedenza dovrebbe essere valido per tutti i tipi di macchine virtuali, mauno ancora più veloce perché non richiede l'uso di software esterni è quello di ricorrede a uncosì detto named pipe. La differenza è che nella finestra di collegamento del debugger dovreteinserire il nome del pipe scelto, nel mio caso "\.pipecompipe":

Per informazione se volete usare il kernel debugger in versione console (kd.exe) compreso neitools che avete scaricato la riga di comando da usare sarà: kd -k com:port=\.pipepipe name,pipe,resets=0,reconnect Continuando lo stesso nome, che avete inserito come porta seriale nel debugger, lo dovreteinserire anche nella configurazione della macchina virtuale:

In questo modo abbiamo collegato la porta COM1 del pc virtuale al pipe del pc locale su cui erain ascolto il debugger. Come nel caso precedente ora dovremo modificare il boot e inviare l'output del debug verso laporta COM prescelta, in questo caso sarà la porta COM1, quinid inserendo una riga nel boot.iniavremo: [boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP Professional" /fastdetectmulti(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP dbg COM1"/fastdetect /debug /debugport=com1 Ora se abbiamo avviato il kernel debugger sul pipe, come spiegato prima, e riavviamo lamacchina virtuale, selezionando al boot la modalità di debug, vedremo che sul windbginizieranno a comparire dei dati sul debug del pc virtuale. Uso del kernel debugger

Premetto che questa vuole essere una guida veloce e di base sull'uso del debugger, quindi nonparleremo di tutti i possibili comandi o di tutte le opzioni, ma solamente di quelle più importanti.

5 / 12

Page 6: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

Disassemblare

Il comando per disassemblare è u (unanssemble) :

u disassembla dall'indirizzo corrente (registro EIP) u  indirizzo disassembla dall'indirizzo specificato in poi u  inizio fine disassembla le istruzioni comprese nell'intervallo inizio-fine uf nomefunzione disassembla la parte di codice relativa alla funzione specificata

Una volta caricati i simboli si può usare indifferentemente un indirizzo o un nome:

u ntdll!ntopenfilentdll!NtOpenFile:7c91d59e b874000000      mov     eax,74h7c91d5a3 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)7c91d5a8 ff12            call    dword ptr [edx]7c91d5aa c21800          ret     18h7c91d5ad 90              nopntdll!ZwOpenIoCompletion:7c91d5ae b875000000      mov     eax,75h7c91d5b3 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)7c91d5b8 ff12            call    dword ptr [edx]...

Se usiamo uf otteniamo il codice disassemblato solo della funzione interessata:

uf ntdll!ntopenfilentdll!NtOpenFile:7c91d59e b874000000      mov     eax,74h7c91d5a3 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)7c91d5a8 ff12            call    dword ptr [edx]7c91d5aa c21800          ret     18h

Display

6 / 12

Page 7: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

Il comando d (display) di mostra cosa c'è nella memoria, serve quindi a leggere i dati in essacontenuti.Se non viene fornito un indirizzo verrà mostrata la memoria a partire dall'ultima volta in cui èstato usato il comando o, se questo non è mai stato utilizzato, dall'indirizzo corrente (registroEIP).

A seconda della lettera da cui è seguito questo comando mostra i dati in formati differenti

db Mostra i byte di dati sia in esadecimale che in ASCII (di default mostra 128 byte) dW Mostra le word di dati sia in esadecimale che in ASCII (di default 64 byte) dd Mostra le doubleword di dati (di default 32 double word) dps Mostra e traduce una tabella di puntatori (di default 128) dg Mostra i segment descriptos di un range di memoria

Vediamo qualche esempio:

dd //Mostra 32 double word partendo dall'indirizzo correntedd 772c8192 //Mostra 32 double word partendo dall'indirizzo 0x772c8192dd 772c8192 772c8212 //Mostra le double words comprese nel range[0x772c8192-0x772c8212]dd 772c897e L21 //Mostra 0x21 DWORDS a partire dall'indirizzo 0x772c897e

Controllo del processo

I principali comandi per il controllo del processo li troviamo nella interfaccia grafica e sono:

Esegue il codice fino al prossimo breakpoint Esegue fino alla successiva istruzione (esegue passo passo entrando all'interno di una chiamata) Ferma il debug del processo, terminando lo stesso e tutti i suoi threads

7 / 12

Page 8: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

Ferma il debug del processo temporaneamente, restituendo la possibilità di controllo al debugger. In kernel mode si fermerà tutto il sistema sul pc target. Esegue fino alla successiva istruzione (esegue passo passo entrando all'interno di una chiamata) Esegue la successiva istruzione (esegue passo passo senza entrare nelle chimate di funzione) Esegue il codice fino alla istruzione selezionata Esegue il codice fino al successivo return

Se lavoriamo da console potremo usufruire sullo stesso tipo di funzionalità, anzi se andrete asbirciare un po nell'help del debugger sono molti di più. Ad ogni modo vi riporto i principali:

- g (go) Esegue il codice fino al prossimo breakpoint. - t (trace) Esegue fino alla successiva istruzione (esegue passo passo entrando all'internodi una chiamata).

- p (step) Esegue la successiva istruzione (esegue passo passo senza entrare nellechimate di funzione).

- gu (go up) Esegue il codice fino al successivo ritorno di funzione.

- q (quit) Esce dal debugger e termina il programma oggetto del debug. - Ctrl-C (break) Mette in pausa il processo restituendo il controllo al debugger.

Se si usa il comando "q" in kernel mode verrà scollegato il debugger e congelata l'esecuzionedel sistema operativo sulla macchina target, senza poter più agire su di essa. Se si vuoleevitare ciò, ma allo stesso tempo scollegare il kebugger, meglio procedere con i seguenticomandi:

kd> bc *kd> gkd> <Ctrl-B><Enter>

Spieghiamo con la prima istruzione viene cancellato ogni breakpoint, con la seconda si mette in

8 / 12

Page 9: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

esecuzione il sistema target. Con l'ultima istruzione si scollega il kernel debugger dal sistematarget e termina il debugger.

Quando si interrompe con un Ctrl-C o un break l'esecuzione del debugger, il pc target vienebloccato e viene attivato il debugger con tutte le sue funzioni e apparirà una informazione deltipo:

Break instruction exception - code 80000003 (first chance)nt!RtlpBreakWithStatusInstruction:805103fa cc int 3kd>

se volessimo provocare un break sin dall'inizio dell'avvio del pc target, potremo farlo lanciandoad esempio il kernel debugger (kd.exe) con l'opzione -b .

Il comando !process mostra i dati relativi a molti processi oppure ad un particolare processo esi usa nella forma

!process CodiceProcesso Flags

Il primo parametro è l'identificativo del processo oppure l'indirizzo base della sua strutturaEPROCESS. Se viene usato il valore 0 verranno elencato tutti i processi in esecuzione.Il secondo parametro è un valore a 5-bit che indica il livello di dettaglio col quale il processoviene mostrato. Se è 0 questo sarà minimo se è 31 sarà massimo.

kd> !process 0 0.... NT ACTIVE PROCESS IX.M' ••••PROCESS 82bS3bd8 5essionId: none Cid: 0004 Peb: 00000000 ParentCid: 000DirSase: 00122000 ObjectTable: 868000b0 Handle(ount: 416.Image: SystemPROCESS 83a6e2d0 5essionId: none Cid: 0170 Peb: 7ffdf000 ParentCld: 004DirBase: 12f3f000 ObjectTable: 883be618 Handle(ount: 28.Image: smss.exePROCESS 83a312d0 SessionId: 0 Cid: 01b4 Peb: 7ffdf000 ParentCid: 01a8DlrSase: ll11e000 ObjectTable: 883f5428 Handle(ount: 418.Image: csrss .exe

Se prendiamo ad esempio un elemento di questa lista, magari il processo smss.exe, vedremoche il valore 83a6e2d0 sarà  l'indirizzo lineare della sua struttura EPROCESS. Il campo Cid,che vale

9 / 12

Page 10: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

0170, è il suo identificativo.

Se avessimo usato il comando !process 0170 15 avremo ottenuto informazioni dettagliate sulprocesso 0170 ovvero smss.exe.

Ogni processo in esecuzione è rappresentato da un executive process block, cioè da unastruttura EPROCESS. Questa contiene molti campi, anche annidati, che conservano tutte leinformazioni sul processo e anche i puntatori ad altri blocchi. Per esempio il campo Peb dellaEPROCESS punta al process enviroment block(PEB), che contiene informazioni sulla immagine del processo, le DLL importate etc..

Se per esempio volessimo mostrare i dati relativi al PEB di un particolare processo prima ditutto dovremo focalizzare l'analisi su di esso col comando .process che prende comeparamentro l'indirizzo base della EPROCESS:

kd> .process 83a312d0Implicit process is now 83a312d0

a questo punto potremo lanciare il comando !peb che ci mostrerà tutti i dati relativi al processo smss.execontenuti nella struttura PEB.

Registri

Per visualizzare i dati contenuti dentro i registri del processoresi usa il comando r, che in kernelmode deve essere preceduto dal processore al quale ci si vuole riferire, dato che è possibilileavere più processori.Se la r viene seguita da una M allora verrà utilizzata una maschera, che permetterà la

10 / 12

Page 11: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

visualizzazione di particolare registri:

Bit Value Description 01 0x10x2 Displays the basic integer registers. (Setting one or both of these bits has the same effect.) 2 0x4 Displays the floating-point registers. 3 0x8 Displays the segment registers. 4 0x10 Displays the MMX registers. 5 0x20 Displays the debug registers. In kernel mode, setting this bit also displays the CR4 register. 6 0x40 Displays the SSE XMM registers. 7 0x80 (Kernel mode only) Displays the CR0, CR1, and CR3 registers. 8 0x100 (Kernel mode only) Displays the descriptor and task state registers.

Facciamo un esempio:

kd> 0rM 80

mi farà vedere i registri cr0, cr1 e cr3 del processore 1.

Gestione dei breakpoint

Sempre nell'ottica di gestire il fluso del codice possiamo inserire come in altri debugger deibreakpoint, in modo da interrompere l'esecuzione del codice in quei punti e restituire il controlloal debugger. I principali comandi sono:

- bl Elenca tutti i breakpoint esistenti - bc BreakpointID Cancella il breakpoint identificato dal codice

- bp NomeFunzione inserisce un breakpoint all'inizio del codice relativo alla funzionespecificata - bp Inserisce un breakpoint nella posizione attuale, che è quella specificata nel registro IP

11 / 12

Page 12: Installazione e prima configurazione del kernel · PDF fileSe volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com: change CNCA0 portname=COM11 change

Debug del kernel di windows

Scritto da AdministratorSabato 10 Ottobre 2009 18:27 - Ultimo aggiornamento Martedì 13 Ottobre 2009 08:23

12 / 12