
SoftICE-like kernel debugger per Windows 11
BugChecker è un debugger kernel e user simile a SoftICE per Windows 11 (e anche Windows XP: supporta versioni di Windows da XP a 11, sia x86 che x64). BugChecker non richiede una seconda macchina collegata al sistema in fase di debug, come nel caso di WinDbg e KD. Questa versione di BugChecker (a differenza della versione originale sviluppata 20 anni fa) sfrutta l'API KD interna e non documentata in NTOSKRNL. L'API KD consente a WinDbg/KD di effettuare chiamate come lettura/scrittura della memoria virtuale, lettura/scrittura dei registri, posizionamento di un breakpoint a un indirizzo, ecc.
Al contrario, il BugChecker originale, come SoftICE, era solito "prendere il controllo" del sistema, hookando diverse API del kernel (sia esportate che private), prendendo il controllo dell'APIC, inviando IPI, ecc. Questo approccio aumenta esponenzialmente la complessità (e riduce la stabilità del sistema), poiché l'implementazione deve essere compatibile con tutte le versioni e sottoversioni supportate di Windows (a livello di firma delle funzioni) nonché con tutte le possibili configurazioni hardware supportate. Inoltre, 20 anni dopo, PatchGuard rende questa soluzione impossibile.
Al contrario, questa versione di BugChecker, intercettando le chiamate a KdSendPacket e KdReceivePacket nel kernel, si presenta alla macchina in fase di debug come un secondo sistema che esegue un debugger kernel esterno, ma, in realtà, tutto avviene sulla stessa macchina. In genere ciò si ottiene sostituendo KDCOM.DLL (che è il modulo che implementa la comunicazione via cavo seriale per l'API KD in Windows) e avviando il sistema in modalità debug kernel. Questo approccio (ispirato da VirtualKD) riduce la complessità e aumenta la stabilità e la compatibilità (e la portabilità, ad esempio, su ARM - e la modularità, poiché le capacità di debug di basso livello sono implementate dietro KdXxxPacket e potrebbero essere sostituite con un'implementazione personalizzata). Inoltre, la presenza di un debugger kernel all'avvio (sebbene "falso") fa sì che Windows disabiliti PatchGuard.
Al momento, BugChecker richiede una tastiera PS/2 per l'input e un framebuffer lineare per scrivere il suo output. Si noti che la tastiera integrata di molti laptop moderni è ancora PS/2.
Dimostrazione di BugChecker su Windows 11 22H2, all'interno di VirtualBox 7.0.4. Viene scritta una condizione di breakpoint JavaScript che cambia il flusso di esecuzione in un thread in modalità utente.
BugChecker in esecuzione in un ambiente molto limitato: un Raspberry Pi 4 (4GB di RAM), via QEMU su Windows XP (512MB di RAM). Un breakpoint viene utilizzato per registrare tutte le chiamate SYSENTER dalla modalità utente al kernel. L'indice del servizio viene memorizzato in un array JavaScript.
Esecuzione di BugChecker direttamente su hardware reale, su un HP Pavilion Dv2000, un vecchio PC con tastiera PS/2. Il sistema operativo è Windows 7 Home 32 bit.
Assicurarsi che Secure Boot sia disabilitato durante l'installazione e l'utilizzo di BugChecker. Di solito è possibile riattivarlo in seguito. Se si utilizza VMware o VirtualBox, Secure Boot può essere disabilitato nelle impostazioni della macchina virtuale.
Considerare anche l'abilitazione del menu di avvio legacy, se si utilizza Windows 8, 10 o 11, utilizzando il comando: bcdedit /set "{current}" bootmenupolicy legacy. Consente un'esperienza più fluida durante l'avvio, permettendo di selezionare l'opzione di avvio di BugChecker e allo stesso tempo di disabilitare l'Enforcement della Firma del Driver.
Il primo passo è avviare Symbol Loader:

Se necessario, disabilitare i driver del display facendo clic sul pulsante "Disable Display Drvs". La stessa operazione può essere eseguita in Gestione dispositivi di Windows. Dopo aver disabilitato i driver del display, rimangono disabilitati anche dopo un riavvio del sistema. Possono essere riattivati in qualsiasi momento successivo quando non si utilizza BugChecker.
Il punto è che BugChecker necessita di un framebuffer lineare con un formato di 32 bit per pixel per disegnare la sua interfaccia. Quando si disabilitano i driver del display, Windows elimina l'accelerazione hardware per il disegno della sua UI e torna alla modalità di compatibilità VGA. Se si esegue su hardware reale o VMware, è necessario disabilitare i driver del display. Se si esegue su VirtualBox, è necessario disabilitare i driver del display o impostare l'impostazione vm_screen in BugChecker.dat, come descritto di seguito. Se si esegue su QEMU, non è necessario disabilitare i driver del display, ma assicurarsi di specificare il dispositivo di visualizzazione "-vga std".
Si noti che la modalità di compatibilità VGA potrebbe limitare la risoluzione massima dello schermo. VMware è limitato a una risoluzione massima di 1152x864. QEMU con il dispositivo di visualizzazione "-vga std" non soffre di questa limitazione.
È interessante notare che se BugChecker è installato su un sistema con più di una scheda grafica, è possibile disabilitare i driver del display di una sola scheda grafica, che sarà la scheda collegata allo schermo che mostrerà l'interfaccia di BugChecker. La seconda scheda (impostata come display principale) manterrà tutte le sue funzionalità di accelerazione 2D e 3D, incluso il supporto OpenGL e DirectX (NOTA: testato su VMware, con Windows 11 e un display DisplayLink).
Quindi fare clic su "Start Driver", poi su "Auto Detect" e infine su "Save". "Auto Detect" dovrebbe essere in grado di determinare automaticamente larghezza, altezza, indirizzo fisico e stride del framebuffer. Tuttavia, è possibile specificare queste impostazioni manualmente (non dimenticare di fare clic su "Save" al termine). Se "Stride" è 0, viene calcolato automaticamente come "Larghezza" * 4 all'avvio del driver. "Address" (cioè l'indirizzo fisico del framebuffer) può essere ottenuto in Gestione dispositivi di Windows, facendo clic su "Proprietà" del dispositivo di visualizzazione, nella scheda "Risorse".
Quindi fare clic su "Callback" nella sezione "KDCOM Hook Method", poi su "Copy/Replace Kdcom" e infine si può riavviare il sistema.
Questa procedura di configurazione deve essere eseguita una sola volta e i driver del display possono essere riattivati, se necessario. Quando si utilizza BugChecker, tuttavia, i driver del display devono essere nuovamente disabilitati, se richiesto dalla propria configurazione.
L'impostazione vm_screen in BugChecker.dat consente di aprire l'interfaccia del debugger di BugChecker in VirtualBox senza specificare in anticipo una risoluzione dello schermo in Symbol Loader e senza disabilitare i driver del display.
L'idea è di scrivere direttamente alle porte I/O e al Command Buffer del dispositivo di visualizzazione virtuale per ottenere la risoluzione corrente dello schermo e notificare all'hypervisor eventuali aggiornamenti nel framebuffer.
Questa soluzione è stata ispirata dal driver X.org xf86-video-vmware.
Questa soluzione funziona solo per VM VirtualBox e modificando manualmente il file BugChecker.dat:

Questa è una funzionalità sperimentale. In futuro, questa impostazione verrà aggiunta automaticamente da Symbol Loader.
Il nome del comando e la sintassi sono scelti per essere il più vicini possibile a quelli dell'originale SoftICE per NT:
Nota: WDK deve essere installato nella sua posizione predefinita, cioè X:\WinDDK, dove X è l'unità in cui sono salvati i sorgenti di BugChecker.
Una guida passo passo per la compilazione del driver kernel è disponibile qui.