Windbg Decompile-Erweiterung über LLM


Dieses Projekt ist ein Windows x64 WinDbg-Erweiterungsgerüst, das eine Funktion anhand des Namens oder der Adresse auflöst, eine deterministische Kontrollflussansicht rekonstruiert und direkt von der Erweiterung aus ein LLM auffordert, Pseudocode zu erzeugen.
Layout
src/extension: WinDbg-Erweiterungs-DLL und !decomp-Befehl.
src/shared: Von der Erweiterung gemeinsam genutzter JSON-, Analyzer-, Protokoll- und Verifier-Code.
scripts: Build- und Vendor-Copy-Helfer.
third_party/dbgeng: optionale vendorisierte Kopie von dbgeng.h und dbgeng.lib.
third_party/zydis: vendorisierter stabiler Zydis-Quellbaum, der standardmäßig verwendet wird, wenn vorhanden.
Aktueller Umfang
- x64-only Annahmen
- Live-Speicheranalyse über DbGEng
- Zydis-gestützte strukturierte Disassemblierung zur stabilen Mnemonic/Operanden-Wiederherstellung
- Symbolbereiche, Unwind und heuristische Funktionsbereichswiederherstellung
- SSA-lite-Wiederherstellung für eingehende Registerargumente, Stack-Slot-Lokale, Merge-Kandidaten und normalisierte Bedingungszweige
- Low-Level-IR-Wertfakten mit Def-Use-Hinweisen, kanonisierten Kopier-/Konstantausdrücken und Markern für tote Definitionen
- Block-Level-Wertzustandsfakten für konvergierte Live-In/Live-Out erreichende Definitionen über Register und Stack-Lokale
- Dominator-gestützte Kontrollflussbereichsfakten für natürliche Schleifen, If/Else-Kandidaten, Switch-Kandidaten, Schleifeninduktionsmetadaten und Switch-Bereichs-/Default-Metadaten
- x64-ABI-Fakten für Shadow/Home-Slots, Stack-Pointer-Deltas, Prolog/Epilog-Erkennung, No-Return-Aufrufe, Tail Calls, Thunks, Import-Wrapper-Kandidaten und wiederhergestellte Register-/Stack-Aufrufargumente
- SIMD/FP-bewusste Microsoft x64-Argumentwiederherstellung für
xmm0 bis xmm3 mit Vector-Zero-Idiom-Guards zur Vermeidung falscher eingehender Argumente
- Typwiederherstellungshinweise für zeigerähnliche Werte, Stack-Lokale, Feldversätze, skalierte Index-Arrays, enum-ähnliche Vergleiche, Bitflag-Tests und vtable-Kandidaten
- Idiom- und Bibliotheksmuster-Fakten für Speicher-/String-Helfer, Sicherheits-Cookies, Stack-Probes, Allokatoren, aggregierte Initialisierer und RIP-relative Global-/Import-Ladevorgänge
- Call-Target-Fakten für direkte Aufrufe, Register-/Speicher-indirekte Aufrufe, Virtual-Call/Vtable-Offset-Kandidaten, Rückgabetyp, Parametermodell, Seiteneffekte, Speichereffekte, Ownership-Hinweise und Konfidenz
- OLLVM-ähnliche Obfuskationsfakten für Control-Flow-Flattening-Dispatcher, wiederhergestellte semantische Kanten, Opaque-Predicate-Totkanten und skalare Instruktionssubstitutions-Idiome
- Deobfuskationsbereitschaftsfakten plus
/deobf:on|off-Steuerung, ob wiederhergestellte Obfuskationsfakten die Pseudo-C-Umschreibung leiten dürfen
- Evidenzgraph-Fakten, die High-Signal-Analyzer-, PDB- und beobachtete Verhaltensfakten mit der Instruktions-/Block-Verankerung verknüpfen
- Refine-First-Prompting mit einem vom Analyzer generierten Pseudocode-Gerüst, graph-bewussten Zusammenfassungen für CFG-Bereiche, Bedingungen und wichtige Blöcke, ranghoher High-Signal-Faktauswahl und gestreutem Sampling für große Faktenmengen
- WinDbg-DML-Links für Entry/Basic-Block/Evidence/Call-Target-Navigation, wenn der Ausgabe-Callback DML unterstützt
- Getrennte Ergebnis-Modi für Kurz, Evidenzerklärung, Nur-Fakten, Debug-Prompt, JSON und Data-Model-Ausgabe
- Benutzerkorrektur-Schalter für No-Return-, Typ-, Feld- und Umbenennungshinweise
- Sitzungsbewusste Analyse-Richtlinienfakten für Live-, Dump-, Kernel- und TTD-ähnliche Sitzungen
- Beobachtete Verhaltensfakten aus dem aktuellen Debugger-Kontext, einschließlich Registerargument-Samples, Speicher-Hotspots und TTD-Abfragevorschläge, falls verfügbar
- RIP-relative String/Global/IAT-Klassifikation und Call-Target-Signaturhinweise für LLM-Prompting
- Geladene-PDB-bewusste Prototyp-, Geltungsbereich-Parameter/Lokal-, Feld-, Enum- und Quellzeilen-Hinweise für LLM-Prompting
- Direkte In-Prozess-LLM-Aufrufe aus der Erweiterung
- OpenAI-kompatibler HTTP-Adapter oder deterministischer Mock-Fallback
- Verifier-Durchlauf über LLM-Ausgabe
WinDbg-Verwendung
Laden Sie die Erweiterung aus dem Build-Output und führen Sie dann !decomp gegen ein Symbol oder eine Adresse aus:```text
.load C:\path\to\decomp.dll
!decomp /doctor
!decomp module!FunctionName
!decomp 0x7ffb`12345678
Verwende `/doctor`, wenn die Einrichtung falsch aussieht oder bevor du einen LLM-Anbieter aktivierst:```text
!decomp /doctor
!decomp /doctor:net
/doctor benötigt kein Ziel und ruft den Anbieter nicht auf. Es meldet Konfigurationspfad/Ladestatus, Anbieter/Modell/Endpunkt-Zusammenfassung, Vorhandensein von Authentifizierung ohne Geheimnisse, Timeout/Token/Chunking-Einstellungen, DML-Unterstützung, Sitzungsklasse/Qualifier, Prozessortyp und PDB-Hinweise.
/doctor:net wird als explizite Netzwerkprüfanfrage akzeptiert, meldet aber derzeit, dass der Anbieter-Ping übersprungen wird. Die Erweiterung führt keine Netzwerküberprüfung aus dem Arztmodus durch.
- Geheimniswerte wie API-Schlüssel, Bearer-Tokens, Refresh-Tokens und URL-Abfragezeichenfolgen werden nicht ausgegeben.
Ziele können öffentliche/private Symbole, exportierte Funktionsnamen oder Adressen sein. Wenn das Ziel in eine Adresse innerhalb einer Funktion aufgelöst wird, versucht die Erweiterung, den umfassenden Funktionsbereich aus Symbolen, Entlade-Daten und Kontrollflussheuristiken wiederherzustellen. Setzen Sie Anführungszeichen um Ziele, die Leerzeichen enthalten:```text
!decomp "my module!Function With Spaces"
Der normale Befehlspfad führt eine lokale Analyse durch, erstellt Analyzer-Fakten, ruft optional den konfigurierten LLM-Endpunkt auf, überprüft die Antwort anhand der wiederhergestellten Beweise und gibt Pseudo-C plus Konfidenz, Warnungen und Unsicherheitshinweise aus:```text
!decomp ntdll!RtlAllocateHeap
!decomp kernel32!Sleep
!decomp game.exe!CheckIntegrity
Normale, brief- und explain-Ausgaben enthalten einen kompakten Fortschrittsstrom auch ohne /verbose. Lange LLM-Durchläufe zeigen lokale Analyseabschlüsse, Chunk-Fortschritt, Wiederholungsmeldungen, Zusammenführungsstart, Verifizierung und den Ctrl+Break-Abbruchhinweis. Maschinenlesbare Modi wie /view:json, /view:facts, /view:prompt und /view:data unterdrücken Fortschrittszeilen und DML-Hilfslinks, sodass Skripte nur die angeforderte Nutzlast erhalten.