Windbg Decompile Extension via LLM


Questo progetto è uno scheletro di estensione WinDbg per Windows x64 che risolve una funzione per nome o indirizzo, ricostruisce una vista deterministica del flusso di controllo e interroga direttamente un LLM dall'estensione per produrre pseudocodice.
Layout
src/extension: DLL dell'estensione WinDbg e comando !decomp.
src/shared: codice JSON, analizzatore, protocollo e verificatore condiviso dall'estensione.
scripts: helper per la build e la copia vendor.
third_party/dbgeng: copia opzionale vendored di dbgeng.h e dbgeng.lib.
third_party/zydis: albero sorgente Zydis stabile incluso in vendor, utilizzato per impostazione predefinita quando presente.
Current Scope
- assunzioni esclusivamente x64
- analisi della memoria live tramite DbgEng
- disassembly strutturato basato su Zydis per un recupero stabile di mnemonici/operandi
- recupero dell'intervallo di funzione tramite regione di simbolo, unwind ed euristiche
- recupero in stile SSA-lite per argomenti di registro in ingresso, variabili locali in stack slot, candidati di merge e condizioni di branch normalizzate
- fatti sui valori IR di basso livello con hint def-use, espressioni copia/costante canonizzate e marcatori di definizioni morte
- fatti sullo stato dei valori a livello di blocco per le definizioni reaching live-in/live-out convergenti su registri e variabili locali di stack
- fatti sulle regioni del flusso di controllo basati su dominatori per loop naturali, candidati if/else, candidati switch, metadati di induzione dei loop e metadati di range/default degli switch
- fatti sull'ABI x64 per slot shadow/home, delta dello stack pointer, riconoscimento prologo/epilogo, chiamate no-return, tail call, thunk, candidati import-wrapper e argomenti di chiamata recuperati su registro/stack
- recupero argomenti Microsoft x64 consapevole di SIMD/FP per
xmm0-xmm3, con protezioni per lo zero-idiom vettoriale per evitare falsi argomenti in ingresso
- hint di recupero dei tipi per valori di tipo puntatore, variabili locali di stack, offset di campo, array con indice scalato, confronti di tipo enum, test di bitflag e candidati vtable
- fatti su idiomi e pattern di libreria per helper di memoria/stringhe, security cookie, stack probe, allocator, inizializzatori di aggregati e caricamenti RIP-relative di globali/import
- fatti sui target di chiamata per chiamate dirette, chiamate indirette via registro/memoria, candidati virtual-call/vtable-offset, tipo di ritorno, modello dei parametri, effetti collaterali, effetti sulla memoria, hint di ownership e confidenza
- fatti di offuscamento in stile OLLVM per dispatcher di control-flow flattening, edge semantici recuperati, edge morti da predicati opachi e idiomi di sostituzione scalare di istruzioni
- fatti di prontezza alla deoffuscazione più il controllo
/deobf:on|off su se i fatti di offuscamento recuperati possono guidare la riscrittura in pseudo-C
- fatti del grafo delle evidenze che collegano fatti ad alto segnale dell'analizzatore, PDB e comportamento osservato al grounding su istruzioni/blocchi
- prompting refine-first con uno scheletro di pseudocodice generato dall'analizzatore, riepiloghi consapevoli del grafo per regioni CFG, condizioni e blocchi importanti, selezione classificata dei fatti ad alto segnale e campionamento distribuito per insiemi di fatti di grandi dimensioni
- collegamenti DML di WinDbg per la navigazione verso entry/basic-block/evidence/call-target quando la callback di output supporta DML
- modalità di risultato separate per output breve, spiegazione delle evidenze, solo fatti, prompt di debug, JSON e stile data-model
- switch di correzione utente per hint no-return, tipo, campo e rinomina
- fatti di policy di analisi consapevoli della sessione per sessioni live, dump, kernel e simil-TTD
- fatti sul comportamento osservato dal contesto corrente del debugger, inclusi campioni di argomenti di registro, hotspot di memoria e suggerimenti di query TTD quando disponibili
- classificazione RIP-relative di stringhe/globali/IAT e hint di firma del target di chiamata per il prompting LLM
- hint per il prompting LLM consapevoli del PDB caricato: prototipo, parametri/locali con scope, campo, enum e righe sorgente
- chiamate LLM dirette in-process dall'estensione
- adattatore HTTP compatibile con OpenAI o fallback mock deterministico
- passaggio di verifica sull'output LLM
WinDbg Usage
Caricare l'estensione dall'output di build, quindi eseguire !decomp su un simbolo o un indirizzo:```text
.load C:\path\to\decomp.dll
!decomp /doctor
!decomp module!FunctionName
!decomp 0x7ffb`12345678
Usa `/doctor` quando la configurazione sembra sbagliata o prima di abilitare un provider LLM:```text
!decomp /doctor
!decomp /doctor:net
/doctor non richiede un target e non chiama il provider. Riporta il percorso di configurazione/stato di caricamento, il riepilogo di provider/modello/endpoint, la presenza di autenticazione senza segreti, le impostazioni di timeout/token/chunking, il supporto DML, la classe/qualificatore di sessione, il tipo di processore e le avvertenze relative al PDB.
/doctor:net è accettato come richiesta esplicita di verifica di rete, ma attualmente segnala che il ping del provider viene saltato. L'estensione non esegue un probe di rete dalla modalità doctor.
- I valori segreti come chiavi API, token bearer, token di refresh e stringhe di query URL non vengono stampati.
I target possono essere simboli pubblici/privati, nomi di funzioni esportate o indirizzi. Se il target risolve a un indirizzo all'interno di una funzione, l'estensione tenta di recuperare l'intervallo della funzione contenente da simboli, dati di unwind ed euristiche del flusso di controllo. Metti tra virgolette i target che contengono spazi:```text
!decomp "my module!Function With Spaces"
Il percorso del comando normale esegue l'analisi locale, costruisce i fatti dell'analizzatore, chiama facoltativamente l'endpoint LLM configurato, verifica la risposta rispetto alle prove recuperate e stampa pseudo-C più confidenza, avvisi e note di incertezza:```text
!decomp ntdll!RtlAllocateHeap
!decomp kernel32!Sleep
!decomp game.exe!CheckIntegrity
L'output normale, brief e explain include un flusso di avanzamento compatto anche senza /verbose. Le esecuzioni LLM lunghe mostrano il completamento dell'analisi locale, l'avanzamento dei chunk, gli avvisi di retry, l'inizio del merge, la verifica e il suggerimento di annullamento con Ctrl+Break. Le modalità leggibili dalla macchina, come /view:json, /view:facts, /view:prompt e /view:data, sopprimono le righe di avanzamento e i link helper DML, così che gli script ricevano solo il payload richiesto.