giovedì 18 luglio 2019

03 - Debug con Visual Studio e WinDbg Preview

In questa lezione si esamineranno i passaggi necessari per avviare il debug di un driver in Visual Studio o in WinDbg Preview. A tal proposito si può prendere, come esempio o cavia, il driver HelloKernel sviluppato nella lezione precedente (si veda [1]). Sebbene debuggare con VS possa rappresentare, almeno all'inizio, un elemento di continuità delle proprie abitudini, ci si rende inevitabilmente conto che tale metodo di debugging è molto più lento rispetto all'uso di WinDbg e per questo motivo consiglio di famigliarizzare con quest'ultimo tool il prima possibile (a meno che non si sia disposti ad aspettare decine di secondi ad ogni comando passato alla command line di VS).




Visual Studio

In Visual Studio, aperto come amministratore, impostare un breakpoint alla riga di codice di interesse, ad esempio in DriverEntry. Poi selezionare Debug -> Connetti a processo




In Tipo di connessione selezionare Windows Kernel Mode Debugger ed in Destinazione della connessione selezionare il nome del Guest.




Quando nella Debugger Immediate Window è indicata la scritta Waiting to reconnect…




premere il tasto pausa o dare CTRL+ALT+PAUSA




Il Guest a questo punto è bloccato. Dare il comando g attraverso la riga di comando per far ripartire il Guest (in alternativa si può anche premere F5)




Copiare l'intera cartella di destinazione della compilazione del driver (quella che contiene i file con estensione SYS, PDB, ecc.) sul Guest ed usare KdManager per installarlo ed avviarlo come fatto nella lezione precedente (si veda [1]). Non appena si preme il tasto Run di KdManager il debugger dovrebbe intercettare il breakpoint se questo è stato impostato in DriverEntry. Altrimenti lo intercetterà quando verrà eseguita la relativa riga di codice.




A questo punto Visual Studio mette a disposizione varie finestre per tracciare le variabili locali, i thread, i moduli, lo stack di chiamate, ecc. Inoltre fornisce una finestra con riga di comando per inviare comandi direttamente al debugger.








WinDbg Preview

Installare WinDbg Preview dal Microsoft Store e successivamente aggiungere una nuova variabile di sistema

Nome: _NT_SYMBOL_PATH
Valore: SRV*C:\Symbols*https://msdl.microsoft.com/download/symbols




Aprire WinDbg come amministratore ed in File -> Settings controllare che il valore della nuova variabile di sistema sia in Symbol path




In File -> Start Debugging selezionare Attach to kernel ed impostare la tab COM come nell'immagine sotto facendo attenzione ad applicare la spunta alla voce Initial break.




A questo punto WinDbg dovrebbe essere pronto a ricevere i comandi




Provare a dare un comando qualsiasi, tipo dt nt!_IRP per vedere se funziona

kd> dt nt!_IRP
+0x000 Type : Int2B
+0x002 Size : Uint2B
+0x004 AllocationProcessorNumber : Uint2B
+0x006 Reserved : Uint2B
+0x008 MdlAddress : Ptr64 _MDL
+0x010 Flags : Uint4B
+0x018 AssociatedIrp :
+0x020 ThreadListEntry : _LIST_ENTRY
+0x030 IoStatus : _IO_STATUS_BLOCK
+0x040 RequestorMode : Char
+0x041 PendingReturned : UChar
+0x042 StackCount : Char
+0x043 CurrentLocation : Char
+0x044 Cancel : UChar
+0x045 CancelIrql : UChar
+0x046 ApcEnvironment : Char
+0x047 AllocationFlags : UChar
+0x048 UserIosb : Ptr64 _IO_STATUS_BLOCK
+0x050 UserEvent : Ptr64 _KEVENT
+0x058 Overlay :
+0x068 CancelRoutine : Ptr64 void
+0x070 UserBuffer : Ptr64 Void
+0x078 Tail : (unnamed-tag)



A quel punto si può andare alla tab Source e premere il pulsante Open Source File…, selezionando il sorgente in cui si vuole inserire un breakpoint.




Posizionarsi sulla riga dove si vuole inserire il breakpoint e premere F9 o il tasto sinistro del mouse per selezionare Insert or Remove Breakpoint




Per accertarsi che il breakpoint sia stato inserito e sia attivo dare il comando bl




Se è tutto ok, dare il comando g per continuare l'esecuzione del sistema operativo che si sta debuggando (può essere necessario darlo anche più di una volta). Dopo aver premuto Run in KdManager (come visto in precedenza per il debugging in VS) se il timestamp del file sorgente corrisponde alle informazioni conservate nel file PDB allora il breakpoint verrà intercettato (a questo scopo si ricordi sempre di ricompilare quando si effettua anche la minima modifica al file sorgente, anche se questa riguardasse solo un commento ad un'istruzione).




A quel punto si può usare la tab File per eseguire le istruzioni in modalità debugging oppure si possono usare i relativi tasti della tastiera. Un'altra alternativa è quella di digitare ed eseguire i relativi comandi (si vedano [2] e [3]).







Riferimenti:

[1] 02 - Hello Kernel !!!
[2] http://windbg.info/doc/2-windbg-a-z.html
[3] https://bsodtutorials.files.wordpress.com/2014/11/windbg-cheat-sheet.pdf

Nessun commento:

Posta un commento