
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.