Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
BugChecker — SoftICE-like kernel debugger per Windows 11 | Kitploit
Strumenti/GitHubGitHub/vitoplantamura/bugchecker
Analisi Dinamica (Sandboxing)Reverse EngineeringDebuggerAnalisi di Binari
GitHubvitoplantamura/bugchecker

BugChecker

SoftICE-like kernel debugger per Windows 11

Vedi Repository
1.1k1443 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

BugChecker

Introduzione

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.

Caratteristiche

  • Supporto da Windows XP a Windows 11, x86 e x64, e kernel SMP. Supporto per processi WOW64 su x64.
  • Integrazione di QuickJSPP, che è un porting di QuickJS su MSVC++. Prima di chiamare QuickJS, BugChecker salva lo stato FPU (su x86) e passa a uno stack espanso di 128KB.
  • I comandi accettano espressioni JS. Ad esempio, "U rip+rax*4" e "U MyJsFn(rax+2)" sono comandi validi. Le funzioni personalizzate possono essere definite nella finestra Script. Le variabili dei registri CPU vengono dichiarate automaticamente come variabili di scope globale da BugChecker.
  • Supporto per file di simboli PDB. I file PDB possono essere specificati manualmente o Symbol Loader può scaricarli da un server di simboli.
  • Il codice JavaScript può chiamare le seguenti funzioni asincrone: WriteReg, ReadMem, WriteMem.
  • I breakpoint possono avere una condizione JS: se la condizione restituisce 0, non si verifica alcun "breakin". Ciò consente di impostare "Logpoint" e breakpoint che possono modificare il flusso di esecuzione.
  • La finestra Log mostra i messaggi inviati al debugger kernel (ad esempio i messaggi DbgPrint).
  • Finestra JavaScript con evidenziazione della sintassi.
  • Il tasto TAB consente, dati pochi numeri, di ciclare attraverso tutti i numeri esadecimali sullo schermo o, dati pochi caratteri, di ciclare attraverso tutti i simboli contenenti quei caratteri.
  • EASTL e le coroutine C++20 rendono la creazione di nuovi comandi un gioco da ragazzi. Sentitevi liberi di inviare le vostre pull request!

Video (Youtube)

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.

Guarda il video

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.

Guarda il video

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.

Guarda il video

Istruzioni per l'installazione

Introduzione

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.

Istruzioni

Il primo passo è avviare Symbol Loader:

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.

Impostazione vm_screen per VirtualBox (Sperimentale)

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:

vm_screen

  • In Symbol Loader, impostare manualmente larghezza e altezza del framebuffer alla risoluzione massima possibile (cioè le dimensioni dello schermo del computer). Impostare lo stride a 0.
  • Il file BugChecker.dat viene creato da Symbol Loader in "C:\Windows\BugChecker".
  • L'impostazione vm_screen va aggiunta sotto "settings->framebuffer".
  • La gerarchia delle impostazioni in questo file è determinata dai caratteri di tabulazione (non spazi).
  • Il formato dell'impostazione è Command_Buffer_Start_Address (virgola) Command_Buffer_End_Address (virgola) I/O_Port_Base
  • IMPORTANTE: Nelle impostazioni della VM, sotto Display, selezionare "VBoxSVGA" come Controller grafico e deselezionare "Abilita accelerazione 3D".

Questa è una funzionalità sperimentale. In futuro, questa impostazione verrà aggiunta automaticamente da Symbol Loader.

Comandi implementati

Il nome del comando e la sintassi sono scelti per essere il più vicini possibile a quelli dell'originale SoftICE per NT:

  • ? espressione-javascript: Valuta un'espressione JavaScript.
  • ADDR eprocess: Passa al contesto del processo (restituisce il controllo all'OS).
  • BC lista|*: Cancella uno o più breakpoint.
  • BD lista|*: Disabilita uno o più breakpoint.
  • BE lista|*: Abilita uno o più breakpoint.
  • BL (nessun parametro): Elenca tutti i breakpoint.
  • BPX indirizzo [-t|-p|-kt thread|-kp processo] [WHEN espressione-js]: Imposta un breakpoint sull'esecuzione.
  • CLS (nessun parametro): Cancella la finestra di log.
  • COLOR [normal bold reverse help line]|[reset]: Mostra, imposta o reimposta i colori dello schermo.
  • DB/DW/DD/DQ [indirizzo] [-l lunghezza-in-byte]: Mostra la memoria come valori a 8/16/32/64 bit.
  • EB/EW/ED/EQ indirizzo -v valori-separati-da-spazi: Modifica la memoria come valori a 8/16/32/64 bit.
  • KL EN|IT: Imposta il layout della tastiera.
  • LINES [numero-righe]: Mostra o imposta il numero corrente di righe del display.
  • MOD [-u|-s] [stringa-ricerca]: Mostra informazioni sul modulo.
  • P [RET]: Esegue un passo di programma.
  • PAGEIN indirizzo: Forza il caricamento in memoria di una pagina (restituisce il controllo all'OS).
  • PROC [stringa-ricerca]: Mostra informazioni sul processo.
  • R nome-registro -v valore: Cambia il valore di un registro.
  • STACK [stack-ptr]: Scansiona lo stack alla ricerca di indirizzi di ritorno.
  • T (nessun parametro): Traccia un'istruzione.
  • THREAD [-kt thread|-kp processo]: Mostra informazioni sul thread.
  • U indirizzo|DEST: Disassembla le istruzioni.
  • VER (nessun parametro): Mostra informazioni sulla versione.
  • WD [dimensione-finestra]: Attiva/disattiva la finestra Disassembler o imposta la sua dimensione.
  • WIDTH [numero-colonne]: Mostra o imposta il numero corrente di colonne del display.
  • WR (nessun parametro): Attiva/disattiva la finestra Registri.
  • WS [dimensione-finestra]: Attiva/disattiva la finestra Script o imposta la sua dimensione.

Istruzioni per la compilazione

Prerequisiti

  • Visual Studio 2019
  • Windows Driver Kit 7.1.0

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.

Descrizione dei progetti Visual Studio

  • BugChecker: questo è il driver kernel di BugChecker, dove è implementato l'intero debugger. I file di output "Release|x86" e "Release|x64" sono inclusi nel pacchetto finale. Durante l'inizializzazione, il driver carica il suo file di configurazione in "\SystemRoot\BugChecker\BugChecker.dat" (anche tutti i file di simboli sono memorizzati in questa directory) e poi tenta di localizzare "KDCOM.dll" nello spazio kernel. Se trovato, tenta di chiamare la sua funzione esportata "KdSetBugCheckerCallbacks", hookando così KdSendPacket e KdReceivePacket.
  • SymLoader: questo è Symbol Loader. Solo il file di output "Release|x86" è incluso nel pacchetto finale. Symbol Loader viene utilizzato per modificare la configurazione di BugChecker (la configurazione viene scritta in "\SystemRoot\BugChecker\BugChecker.dat"), per scaricare file PDB e per installare il modulo KDCOM.dll personalizzato.
  • KDCOM: questo è il modulo KDCOM.dll personalizzato che NTOSKRNL carica all'avvio del sistema. Esporta la funzione "KdSetBugCheckerCallbacks" che il driver chiama per hookare KdSendPacket e KdReceivePacket.
  • pdb: questo è il progetto Ghidra "pdb". La versione originale restituisce il contenuto di un file PDB sull'output standard in formato xml. Il codice è stato modificato per generare invece un file BCS.
  • NativeUtil: poiché Symbol Loader è un'applicazione WOW64 in Windows x64, le chiamate a quelle API che devono essere effettuate da immagini native dell'architettura sono state spostate qui (ad esempio le chiamate all'API di installazione di dispositivi e driver).
  • HttpToHttpsProxy: questa è un'applicazione ASP.NET Core la cui funzione è quella di fungere da proxy internet per Symbol Loader quando eseguito in Windows XP. Poiché XP ha un supporto TLS obsoleto, Symbol Loader non può scaricare file da un server di simboli arbitrario. Dopo aver distribuito questa applicazione in un IIS sulla stessa rete, è possibile scaricare file da un server di simboli in Windows XP anteponendo "http://<INDIRIZZO_IP_SERVER_IIS>/HttpToHttpsProxy/" all'URL del server in Symbol Loader.

Crediti

  • VirtualKD: il primo POC di BugChecker è stato costruito modificando VirtualKD.
  • BazisLib: il codice dietro il pulsante "Copy/Replace Kdcom + Add Boot Entry" in Symbol Loader proviene da VirtualKD e utilizza BazisLib.
  • EASTL: Non è possibile utilizzare MSVC++ STL qui. EASTL è un'ottima alternativa.
  • Ghidra: il progetto "pdb" in BugChecker proviene da Ghidra. È stato modificato per generare file BCS.
  • Zydis: per la finestra del disassemblatore in BugChecker.
  • QuickJSPP, che è un porting di QuickJS su MSVC++: per il motore JavaScript integrato nel driver kernel.
  • ReactOS: per le definizioni dei tipi interni del KD Windows.
  • SerenityOS: per le funzioni di manipolazione bitmap di basso livello utilizzate dall'allocatore di memoria di BugChecker. Poiché ho iniziato BugChecker dopo aver visto un video di Andreas (dopo 10 anni di astinenza da C/C++ e da qualsiasi tipo di programmazione di basso livello), volevo includere un piccolo pezzo di SerenityOS in BugChecker.
Scarica lo strumento
  • X (nessun parametro): Esce dallo schermo di BugChecker.