WinDbg x64-Erweiterung, die Live-Funktionen disassembliert und ein LLM nutzt, um verifizierten Pseudocode zu erzeugen.


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.
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.libthird_party/zydis: vendorisierter stabiler Zydis-Quellbaum, der standardmäßig verwendet wird, wenn vorhanden.xmm0 bis xmm3 mit Vector-Zero-Idiom-Guards zur Vermeidung falscher eingehender Argumente/deobf:on|off-Steuerung, ob wiederhergestellte Obfuskationsfakten die Pseudo-C-Umschreibung leiten dürfenLaden 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.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.
Verwenden Sie /view:*, um auszuwählen, was Sie sehen möchten. Dies hält die Befehlsfläche klein: Eine Option steuert alle Ausgabemodi.```text
!decomp /view:brief module!HotPath
!decomp /view:explain module!BranchyFunction
!decomp /view:json module!FunctionName
!decomp /view:facts module!FunctionName
!decomp /view:prompt module!FunctionName
!decomp /view:data module!FunctionName
!decomp /view:analyzer module!FunctionName
!decomp /view:plan module!FunctionName
- `brief` gibt Ziel, Konfidenz, Zusammenfassung und die erste Unsicherheit oder Verifier-Warnung aus.
- `explain` fügt Abschnitte für Beweise, Kontrollfluss, Typ-Hinweis, beobachtetes Verhalten und Call-Target hinzu.
- `json` gibt maschinenlesbares JSON der Anfrage und Antwort aus.
- `facts` gibt nur Analyzer-Fakten aus und deaktiviert den LLM-Pfad.
- `prompt` gibt den genauen System-Prompt, User-Prompt und Prompt-Fakten aus. Es deaktiviert den LLM-Aufruf.
- `data` gibt einen stabilen JSON-Snapshot aus, der für WinDbg JavaScript/NatVis-ähnliche Automatisierung gedacht ist.
- `analyzer` gibt den deterministischen Analyzer-only-Pseudocode-Pfad aus, ohne den LLM aufzurufen.
- `plan` führt eine lokale Analyse durch und gibt einen Preflight-Plan aus, ohne den LLM aufzurufen oder den Ergebniscache zu aktualisieren. Es enthält Ziel/Modul/Bereich-Anzahlen, PDB-Verfügbarkeit, Sitzungsrichtlinie, geschätztes Chunking, promptgrößenrelevante Zählungen und praktische Empfehlungen.
Verwenden Sie `/verbose`, wenn ein Befehl hängt oder Sie den vollständigen Fortschrittsstrom sehen möchten:```text
!decomp /verbose module!SlowFunction
!decomp /verbose /view:json module!SlowFunction
/verbose gibt lokale Phasen aus, wie Zielauflösung, Funktionsbereichswiederherstellung, Byte-Lesevorgänge, Disassemblierung, Analyse-Faktenkonstruktion, PDB/Session-Anreicherung, Pseudocode-Tokenisierung und Verifikator-Ergebnisse./verbose auch Prompt-Größen, Anfrage-Token-Budgets, HTTP-Verbindungs-/Sende-/Empfangsphasen, Antwort-Chunk-Größen, Finish-Grund, extrahierte Modell-JSON-Vorschau, Wiederholungsversuche und Wiederholungsentscheidungen auf Basis von Verifikator-Feedback aus./verbose ersetzt den kompakten Fortschrittsstrom durch die vollständige Ablaufverfolgung. Verwenden Sie es, wenn die kompakten Fortschrittszeilen nicht ausreichen, um zu diagnostizieren, wo Zeit verbraucht wird.!decomp-Befehls drücken Sie Ctrl+Break in WinDbg, um eine Abbrechung anzufordern. Die Erweiterung prüft auf Unterbrechungen zwischen lokalen Analysephasen und während des Wartens auf den LLM-Worker und fordert dann die aktive synchrone HTTP-E/A zum Anhalten auf.Legacy-Aliasnamen wie /brief, /explain, /json, /facts-only, /debug-prompt, /data-model, /dx und /no-llm funktionieren weiterhin für alte Skripte, aber neue Beispiele verwenden /view:*.
Fenster-Viewer:```text !decomp /view:window module!FunctionName !decomp /view:window /view:explain module!FunctionName
- `/view:window` führt den normalen `!decomp`-Ergebnispfad für das Ziel aus und öffnet das vollständig gerenderte Ergebnis in einem separaten Viewer.
- Der Viewer verwendet denselben Antwort-Renderer wie der Konsolenpfad und öffnet dann ein natives Win32-modelloses Werkzeugfenster, das dem Debugger-Fenster gehört, wenn eines gefunden werden kann.
- Die Debugger-Ausgabe meldet das Handle des nativen Viewer-Fensters. Wenn das Viewer-Fenster nicht erstellt werden kann, gibt der Befehl eine Warnung aus und fällt auf das normale Konsolenergebnis zurück.
- DML-only-Links werden als Textbeschriftungen mit ihren Befehlstrings im Viewer dargestellt. Wenn RichEdit verfügbar ist, verwendet das Fenster ein GitHub-ähnliches RTF-Layout mit Abschnittsüberschriften, Metadaten-Styling und Pseudo-Code-Hervorhebung; andernfalls fällt es auf Klartext zurück.
- Wenn die aktuelle Sitzung zwischengespeicherte Ergebnisse enthält, zeigt der Viewer eine Verlaufsliste auf der linken Seite, sodass Sie zwischen der aktuellen Ausgabe und früheren Dekompilierungsergebnissen wechseln können, ohne die Analyse erneut auszuführen.
- `/view:json`, `/view:facts`, `/view:prompt` und `/view:data` bleiben maschinenlesbare Konsolenausgaben und werden nicht an den Viewer umgeleitet.```text
!decomp /limit:deep module!LargeFunction
!decomp /limit:huge module!VeryLargeFunction
!decomp /limit:12000 module!VeryLargeFunction
!decomp /timeout:120000 module!SlowFunction
/limit:deep erhöht das Anweisungslimit auf 8192./limit:huge erhöht das Anweisungslimit auf 16384./limit:N setzt ein explizites Anweisungslimit./timeout:MS überschreibt das Request-Timeout für diesen Aufruf.decomp.llm.json gesteuert; das Anweisungslimit auf der Kommandozeile kontrolliert, wie viel lokalen Code die Erweiterung vor dem Prompt wiederherzustellen versucht./deep, /huge und /maxinsn:N werden weiterhin unterstützt.Verschleierungsbewusste Dekompilierung:```text !decomp /deobf:on module!FlattenedFunction !decomp /deobf:off module!FlattenedFunction !decomp /view:facts /deobf:off module!FlattenedFunction
- `/deobf:on` ist die Voreinstellung. Der Analyzer gibt weiterhin rohe Fakten aus, aber die Wiederherstellung des Dispatchers mit hoher Konfidenz im OLLVM-Stil, undurchsichtige Dead-Edge-Nachweise, Substitutionsidiome und semantische CFG-Overlays können Prompt-Fakten, Merge-Policy, Verifier-Conflict-Policy und strukturierte Pseudo-C-Wiederherstellung leiten.
- `/deobf:off` behält `obfuscation`, `semantic_control_flow` und `deobfuscation_readiness`-Fakten sichtbar, deaktiviert aber sichere Rewrite-Aktionen, behält die Kontrollfluss-Strukturierung auf dem rohen CFG bei und weist Prompt-/Merge-/Verifier-Pfade an, die rohe verschleierte Form beizubehalten.
- Verwenden Sie `/deobf:off`, wenn Sie den Dispatcher, den Bogus-Branch oder die Substitutionsoberfläche direkt inspizieren möchten, anstatt die Erweiterung aufzufordern, eine entschleierte Struktur wiederherzustellen.
- `/deobfuscation:on|off` wird als längeres Alias akzeptiert.
Cache und Replay-Helfer:```text
!decomp /view:json module!FunctionName
!decomp /last:json
!decomp /view:explain module!FunctionName
!decomp /last:explain
!decomp /view:facts module!FunctionName
!decomp /last:facts
!decomp /view:data module!FunctionName
!decomp /last:data
!decomp /view:prompt module!FunctionName
!decomp /last:prompt
!decomp /history
!decomp /refresh module!FunctionName
!decomp /last:2:explain
!decomp /last:2:json
/last:json gibt die vorherige Anfrage/Antwort im JSON-Format aus, ohne die Analyse erneut durchzuführen./last:explain rendert das vorherige vollständige Ergebnis mit dem Erklärungsteil neu, ohne die Analyse oder das LLM erneut aufzurufen./last:facts gibt die Analyse-Fakten aus dem vorherigen Ergebnis aus, ohne die Analyse erneut durchzuführen./last:data gibt den vorherigen Datenmodell-Schnappschuss aus, ohne die Analyse erneut durchzuführen./last:prompt gibt den vorherigen Prompt-Dump aus, ohne die Analyse erneut durchzuführen./history listet den arbeitsspeicherinternen Ergebnis-Ringpuffer auf. Index 1 ist das neueste Ergebnis./refresh <target> umgeht die persistente Artefakt-Wiedergabe für dieses Ziel, führt eine frische lokale Analyse und LLM-Analyse durch und ersetzt das gespeicherte Artefakt nach einem erfolgreichen LLM-gestützten Ergebnis./last:N:explain, /last:N:json, /last:N:facts, /last:N:data und /last:N:prompt spielen ein älteres, zwischengespeichertes Ergebnis nach Historienindex ab, ohne die lokale Analyse oder das LLM erneut aufzurufen./last:*-Modi sind Terminal-Wiedergabebefehle. Wenn ein Ziel im selben Befehl vorhanden ist, wird das zwischengespeicherte Artefakt abgespielt und es wird keine lokale Analyse oder LLM-Anfrage für dieses Ziel gestartet.artifact-Ordner neben der geladenen decomp.dll gespeichert. Der Bediener benötigt keinen separaten Speicherbefehl.request, response, data_model, debug_prompt und ein kernel_build-Objekt mit Win32/KD-Versionswerten, Build-String, optionalem NtBuildLab und einem Build-Fingerabdruck.!decomp <target>-Befehls automatisch den Pfad artifact\<kernel_build>\... nach der Zielauflösung und Wiederherstellung der Funktions-RVA. Wenn der gespeicherte kernel_build mit dem aktuellen Betriebssystem-Build übereinstimmt, spielt die Erweiterung das Artefakt ab, ohne Funktionsbytes zu lesen, lokale Analyseschritte durchzuführen oder das LLM aufzurufen./last:*-Ansichten, sodass ein Klick auf explain, json, facts, prompt oder data-model keinen neuen Decompilierungsdurchlauf startet./last-json, /last-explain, /last-facts, /last-data-model, /last-dx und /last-prompt bleiben unterstützt.DML-Navigation:
actions-Zeile mit klickbaren Links explain, json, facts, prompt, data-model und history für dasselbe Ziel.nav-Zeile mit Links zur Entry-Disassembly, zum Entry-Breakpoint und zur letzten Artefakt-Wiedergabe.Sitzungsbezogene und beobachtete Verhaltensdetails:
/view:json, /view:facts, /view:prompt und der normale LLM-Modus enthalten session_policy.session_policy zeichnet die Debug-Klasse, Qualifikation, Ausführungsart, Analysestrategie, Dump/Live/Kernel-Flags und ob TTD-Unterstützung geladen zu sein scheint.observed_behavior zeichnet das aktuelle rip, rsp, die Rücksprungadresse (falls lesbar), Stichproben der Microsoft x64-Registerargumente (rcx, rdx, r8, r9), wiederholte Speicherzugriffs-Hotspots und vorgeschlagene TTD-Befehle auf.ttdext.dll oder TTDReplay.dll im Debugger-Prozess geladen ist, fügt die Erweiterung vorgeschlagene dx @$cursession.TTD.Calls(...)-Abfragen hinzu, anstatt stillschweigend vorzutäuschen, dass bereits Tracedaten gesammelt wurden.Benutzerkorrekturschalter ermöglichen das Patchen von Analyse-Fakten über die Befehlszeile, wenn dem Debugger ausreichende semantische Informationen fehlen:```text !decomp /fix:noreturn:FatalError module!FunctionName !decomp /fix:type:rcx=MY_TYPE* module!FunctionName !decomp /fix:field:[rcx+18h]=uint32_t module!FunctionName !decomp /fix:rename:v3=request module!FunctionName !decomp /fix:clear
- `/fix:noreturn:name` behandelt übereinstimmende Aufrufe als keine Rückkehr für Fallback-Disassemblierung, CFG-Wiederherstellung, ABI-Fakten und Verifier-Prüfungen.
- `/fix:type:expr=TYPE` fügt einen High-Confidence-Benutzertyphinweis hinzu.
- `/fix:field:expr=TYPE` fügt einen High-Confidence-Benutzerfeldhinweis hinzu.
- `/fix:rename:old=new` fügt einen Umbenennungshinweis hinzu und wendet die Umbenennung auf die finalen Pseudocode-Bezeichner an.
- `/fix:clear` löscht alle sitzungspersistenten Korrekturüberschreibungen.
Die Umgebungsvariable `DECOMP_NORETURN_OVERRIDES` wird weiterhin unterstützt. Die Befehlszeilenwerte von `/fix:noreturn:` werden für die aktuelle WinDbg-Sitzung über den ursprünglichen Umgebungsbefehl gelegt.
Korrekturschalter sind sitzungspersistent:
- `/fix:noreturn:`, `/fix:type:`, `/fix:field:` und `/fix:rename:` werden von der geladenen Erweiterung gemerkt und bei späteren `!decomp`-Ausführungen wiederverwendet.
- `/fix:clear` löscht alle sitzungspersistenten Korrekturen und stellt den no-return-Umgebungsoverride auf seinen ursprünglichen Wert zum Zeitpunkt des Ladens der Erweiterung zurück.
- Die veralteten `/noreturn:`, `/type:`, `/field:`, `/rename:` und `/clear-overrides` werden weiterhin unterstützt.
Fehlerhafte Korrekturwerte werden ignoriert und in `uncertainties` gemeldet, anstatt zwischengespeichert zu werden. Beispielsweise wird `/fix:type:rcx` ignoriert, da es kein `expr=TYPE`-Paar enthält.
Empfohlener Untersuchungsablauf:
1. Starten Sie mit `!decomp /view:facts target`, um zu bestätigen, dass der Funktionsbereich, Blöcke, Aufrufe, Importe, PDB-Daten und Sitzungsfakten sinnvoll aussehen.
2. Verwenden Sie `!decomp /view:plan target`, um die Aufteilung, Prompt-Größe, Zeitüberschreitungsrisiko und Symbolqualität abzuschätzen, bevor Sie eine LLM-Anfrage starten.
3. Verwenden Sie `!decomp /view:prompt target`, wenn Prompt-Größe, Sprache oder Evidenzauswahl falsch aussehen.
4. Führen Sie `!decomp target` für das vollständige verifizierte Pseudo-C-Ergebnis aus.
5. Verwenden Sie `!decomp /refresh target`, wenn ein vorhandenes persistentes Artefakt wiedergegeben wird, Sie aber eine frische Analyse benötigen.
6. Wenn das Ergebnis falsch aussieht, führen Sie `!decomp /view:explain target` aus und prüfen Sie Verifier-Warnungen, Evidenzabdeckung und vorgeschlagene Korrekturen.
7. Fügen Sie gezielte Korrekturen wie `/fix:noreturn:`, `/fix:type:`, `/fix:field:` oder `/fix:rename:` hinzu und führen Sie dasselbe Target erneut aus.
8. Verwenden Sie `/history` und indizierte `/last:N:*`-Wiedergaben, wenn Sie mehrere aktuelle Ergebnisse vergleichen.
9. Erfassen Sie `/view:json` oder `/last:json`, wenn Sie Fehler melden oder das Verhalten über Builds hinweg vergleichen.
## Analyzer Fact Surface
Aktuelle Analyzer-Fakten werden absichtlich über `/view:json`, `/view:facts`, `/view:prompt` und den normalen LLM-Modus mitgeführt. Hochwertige Felder, die zuerst überprüft werden sollten:
- `stack_pointer` zeichnet per-Instruction-Stack-Deltas, frame-relative Aliase und Vertrauenswürdigkeit auf.
- `call_arguments` zeichnet wiederhergestellte Register- und Stack-Argumente an Aufrufstellen auf, einschließlich nahegelegener Cross-Block-Stack-Speicherungen, wenn die Evidenz stark genug ist.
- `pdb.prototype_parameters` zeichnet strukturierte Prototyp-Parameternamen, Typen, Ordinalzahlen, ABI-Positionen und Quellvertrauenswürdigkeit auf.
- `control_flow` enthält Schleifeninduktionsvariablen, Startwerte, Schritte, Grenzen, Richtung, Switch-Tabellenadresse, Fall-Ziele, Standardziel, Bereichsgrenzen, Vorzeichen und Indexausdruck, falls wiederhergestellt.
- `callee_summaries` und Aufrufziel-Fakten enthalten direkte, indirekte und virtuelle Aufruf-/Vtable-Kandidaten sowie bekannte Win32/NT/Rtl-Speicher-, Allokations-, Freigabe- und Statussemantiken.
- `obfuscation` legt OLLVM-artige Flattening-Dispatcher-Kandidaten, Zustandsvariablen, wiederhergestellte semantische Kanten, opake Prädikate und Skalar-Substitutionsidiome offen.
- `semantic_control_flow` legt wiederhergestellte lebende/tote Kanten offen, die aus Obfuscation-Fakten abgeleitet wurden und auch dann zur Überprüfung verfügbar bleiben, wenn `/deobf:off` verwendet wird.
- `deobfuscation_readiness` legt `enabled`, sichere Rewrite-Aktionen, blockierte Annahmen, Prioritätsfaktpfade, Zählungen und Vertrauenswürdigkeit offen. Wenn deaktiviert, zeichnet es die Richtlinienentscheidung auf und blockiert den deobfuscierten Kontrollfluss-Rewrite.
- Die Prompt-Faktauswahl ordnet Signale mit hohem Wert zuerst ein, bewahrt dann die Verteilung mit Spread-Sampling, sodass große Funktionen nicht alle niederfrequenten Evidenzen verlieren.
## Empfohlenes dbgeng-Setup
Der schnellste Weg besteht darin, den Header und die Importbibliothek in das Projekt zu übernehmen.
Erwartetes Vendor-Layout:```text
third_party\dbgeng\inc\dbgeng.h
third_party\dbgeng\lib\dbgeng.lib
Sie können sie manuell kopieren oder das Hilfsskript verwenden.
powershell -ExecutionPolicy Bypass -File .\scripts\Prepare-DbgengVendor.ps1 ` -SourceRoot 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64'
### Vendor-Kopie aus expliziten Dateipfaden vorbereiten```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Prepare-DbgengVendor.ps1 `
-HeaderPath 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sdk\inc\dbgeng.h' `
-LibraryPath 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbgeng.lib'
Sobald third_party\dbgeng existiert, wird Build.ps1 es automatisch bevorzugen und Sie benötigen normalerweise kein DEBUGGERS_ROOT.
Das Repository kann entweder Folgendes verwenden:
third_party\zydis-QuelleFetchContentStandardmäßig ist das Verhalten auto, was third_party\zydis bevorzugt, falls vorhanden, und andernfalls beim CMake-Konfigurieren auf das Abrufen von Zydis zurückfällt.
Erwartete Vendor-Verzeichnisstruktur:```text third_party\zydis\CMakeLists.txt third_party\zydis\include\Zydis\Zydis.h third_party\zydis\dependencies\zycore\CMakeLists.txt
Aktualisieren oder erstellen Sie die Anbieterkopie:```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Prepare-ZydisVendor.ps1
Sie können auch von einem bereits heruntergeladenen lokalen Quellbaum auslagern:```powershell powershell -ExecutionPolicy Bypass -File .\scripts\Prepare-ZydisVendor.ps1 ` -SourcePath 'C:\path\to\zydis'
## Build
Empfohlener Weg ist eine Visual Studio Developer PowerShell oder Developer-Eingabeaufforderung.
Die erstellte `decomp.dll` bettet nun eine Windows-Dateiversion aus `version.txt` ein.
### Normaler Build```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Build.ps1 -Reconfigure
cmake --build build --config Debug ctest --test-dir build -C Debug --output-on-failure cmake --build build --config Release ctest --test-dir build -C Release --output-on-failure
`decomp_snapshot_tests` umfasst die Analyzer/Protocol/Verifier-Verträge für wiederhergestellte Stack-Argumente, SIMD/FP ABI-Eingaben, Nullidiom-Unterdrückung für Vektoren, Schleifeninduktionspräferenz, Switch-Metadaten, Metadaten virtueller Aufrufe, Obfuskationsfakten im OLLVM-Stil, die `/deobf:off`-Richtlinie, bekannte API-Zusammenfassungen, Prompt-Faktenauswahl und Verifier-Verankerungsprüfungen.
### Legacy dbgeng Build```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Build-Legacy.ps1 -Reconfigure
powershell -ExecutionPolicy Bypass -File .\scripts\Invoke-ReleaseBuild.ps1
Dieses Skript erhöht die letzte Komponente in `version.txt` um `1`, erzwingt eine Neukonfiguration und erstellt dann die Release-DLL. Zum Beispiel wird aus `1.0.0.7` `1.0.0.8`.
### Common options
- `-Configuration Release|Debug`
- `-Clean`
- `-Reconfigure`
- `-ConfigureOnly`
- `-Verbose`
- `-ZydisSource Auto|Vendor|Fetch`
- `-ZydisVendorDir 'C:\path\to\zydis'`
- `-DebuggersRoot 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64'`
- `-DbgengIncludeDir 'E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\inc'`
- `-DbgengLibrary 'E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\lib\dbgeng.lib'`
### Vendor-first-Beispiel```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Build.ps1 `
-Configuration Release `
-ZydisSource Vendor `
-Reconfigure `
-Verbose
powershell -ExecutionPolicy Bypass -File .\scripts\Build.ps1 -Configuration Release
-DbgengIncludeDir 'E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\inc' -DbgengLibrary 'E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\lib\dbgeng.lib'
-Reconfigure
Das Build-Skript versucht automatisch, Folgendes zu finden:
- `cmake.exe` aus PATH, eigenständigem CMake oder dem in Visual Studio gebündelten CMake
- `third_party\dbgeng` unter dem Projektstammverzeichnis
- `DEBUGGERS_ROOT` aus Umgebungsvariablen oder üblichen Windows Kits-Speicherorten
Die Zydis-Quellauswahl funktioniert wie folgt:
- `Auto`: bevorzugt `third_party\zydis`, andernfalls wird `Zydis` während der Konfiguration abgerufen
- `Vendor`: erfordert einen nutzbaren `third_party\zydis`-Baum oder den mit `-ZydisVendorDir` übergebenen Pfad
- `Fetch`: ignoriert den Vendor-Baum und lässt CMake immer `Zydis` herunterladen
`DEBUGGERS_ROOT` kann auf ein Debugger-Rootverzeichnis verweisen, das eines dieser Layouts verwendet:
- `sdk\inc\dbgeng.h` und `sdk\lib\dbgeng.lib`
- `sdk\inc\dbgeng.h` und `sdk\lib\amd64\dbgeng.lib`
- `sdk\inc\dbgeng.h` und `sdk\lib\x64\dbgeng.lib`
- `sdk\inc\dbgeng.h` und `dbgeng.lib`
- `inc\dbgeng.h` und `lib\dbgeng.lib`
- `inc\dbgeng.h` und `lib\amd64\dbgeng.lib`
- `inc\dbgeng.h` und `lib\x64\dbgeng.lib`
- `dbgeng.h` und `dbgeng.lib`
Wenn Ihre Installation keinem dieser Layouts entspricht, übergeben Sie die CMake-Pfade direkt:```powershell
cmake -S . -B build-manual -G "Visual Studio 17 2022" -A x64 `
-DDBGENG_INCLUDE_DIR='E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\inc' `
-DDBGENG_LIBRARY='E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\lib\dbgeng.lib'
cmake --build build-manual --config Release
Wenn Ihre dbgeng.h zu alt ist und der Build bei GetSymbolEntryOffsetRegions oder GetSymbolEntryString fehlschlägt, verwenden Sie Build-Legacy.ps1 oder übergeben Sie die CMake-Option manuell.
Mit DECOMP_USE_SYMBOL_ENTRY_APIS=OFF greift die Erweiterung zurück auf:
GetFunctionEntryByOffset für x64-unwind-basierte BereichswiederherstellungGetNameByOffset plus heuristische Disassemblierung, wenn Unwind-Metadaten fehlenDie Erweiterung verbraucht automatisch Symbole und Typinformationen, die WinDbg bereits für die Zielmodule geladen hat.
Es gibt zwei praktische Stufen der PDB-Anreicherung:
Wie sich dies auf die Pseudocode-Generierung auswirkt:
arg1 in PDB-Namen wie ctx umbenannt werdenctx->State erhaltenstate == StateRunning erhaltenWichtige Einschränkungen:
Das aktuelle Verhalten ist automatisch. Es gibt keinen separaten Konfigurationsschalter für die PDB-Nutzung; die Qualität hängt davon ab, was WinDbg bereits geladen hat und ob der aktuelle Bereich mit der Zielfunktion abgeglichen werden kann.
Platzieren Sie decomp.llm.json neben decomp.dll.
Diese Datei ist nicht nur für Netzwerk-LLM-Einstellungen.
provider, endpoint, model, Token-Budgets und Chunking-Einstellungen beeinflussen den LLM-Pfad.display_language beeinflusst die natürliche Sprache, die in Zusammenfassungen und Unsicherheiten verwendet wird.syntax_highlighting beeinflusst die Pseudocode-Darstellung in WinDbg, wenn DML-bewusste Ausgabe verfügbar ist.display_language und syntax_highlighting werden weiterhin für /view:analyzer und Mock-Provider-Ausgabe verwendet.Beispiel:```json { "provider": "openai-compatible", "endpoint": "https://api.openai.com/v1/chat/completions", "model": "gpt-5.4-2026-03-05", "api_key_env": "OPENAI_API_KEY", "timeout_ms": 120000, "max_completion_tokens": 12000, "force_chunked": false, "chunk_trigger_instructions": 900, "chunk_trigger_blocks": 36, "chunk_block_limit": 24, "chunk_count_limit": 16, "chunk_completion_tokens": 6000, "merge_completion_tokens": 12000, "display_language": { "mode": "auto", "tag": "en-US", "name": "English" }, "syntax_highlighting": { "keyword_color": "warnfg", "type_color": "emphfg", "function_name_color": "srcid", "identifier_color": "wfg", "number_color": "changed", "string_color": "srcstr", "char_color": "srcchar", "comment_color": "subfg", "preprocessor_color": "verbfg", "operator_color": "srcannot", "punctuation_color": "srcpair" } }
ChatGPT-Abonnementbeispiel:```json
{
"provider": "chatgpt",
"model": "gpt-5.5",
"chatgpt_auth_file": "%USERPROFILE%\\.codex\\auth.json",
"timeout_ms": 120000,
"max_completion_tokens": 12000,
"force_chunked": false,
"chunk_trigger_instructions": 900,
"chunk_trigger_blocks": 36,
"chunk_block_limit": 24,
"chunk_count_limit": 16,
"chunk_completion_tokens": 6000,
"merge_completion_tokens": 12000,
"reasoning_effort": "medium"
}
Für provider: "chatgpt" ist endpoint optional und standardmäßig auf https://chatgpt.com/backend-api/codex/responses gesetzt. Eine Basis-URL wie https://chatgpt.com/backend-api/codex wird ebenfalls akzeptiert und zu /responses normalisiert. Die Erweiterung liest tokens.access_token und tokens.refresh_token aus der konfigurierten Auth-Datei, aktualisiert abgelaufene JWT-Zugriffstokens über OpenAI OAuth und schreibt das aktualisierte Token-Set zurück in diese Datei. Die Standard-Auth-Datei ist %USERPROFILE%\.codex\auth.json, sodass ein Codex CLI ChatGPT-Login direkt wiederverwendet werden kann. Die Erweiterung startet keinen Browser oder OAuth-Login-Fluss aus WinDbg heraus; wenn die Auth-Datei fehlt, ungültig oder nicht mehr aktualisierbar ist, führen Sie codex login außerhalb von WinDbg aus und wiederholen Sie !decomp. Für einmalige Tests verwenden Sie access_token oder access_token_env anstelle einer Auth-Datei. api_key, api_key_env, DECOMP_LLM_API_KEY und OPENAI_API_KEY sind für OpenAI-kompatible API-Key-Anbieter reserviert und werden vom ChatGPT-Anbieter ignoriert.
Unterstützte Schlüssel:
providerendpointmodelapi_keyapi_key_envaccess_tokenaccess_token_envchatgpt_auth_filereasoning_efforttimeout_msmax_completion_tokensforce_chunkedchunk_trigger_instructionschunk_trigger_blockschunk_block_limitchunk_count_limitchunk_completion_tokensmerge_completion_tokensdisplay_languagesyntax_highlightingUnterstützte display_language-Schlüssel:
modetagnamedisplay_language.mode akzeptiert:
autofixedUnterstützte syntax_highlighting-Schlüssel:
keyword_colortype_colorfunction_name_coloridentifier_colornumber_colorstring_colorchar_colorcomment_colorpreprocessor_coloroperator_colorpunctuation_colorWie syntax_highlighting-Farbwerte funktionieren:
<col fg="...">.verbfg, warnfg, emphfg, srcid und ähnliche Namen nicht auf jedem Rechner eine universelle Farbe ab.#FF8800. Die effektive Farbe stammt von WinDbg, nicht von decomp.llm.json.Praktische Konsequenz:
syntax_highlighting, anstatt anzunehmen, dass die Erweiterung Ihre Einstellung ignoriert.Wann die Hervorhebung sichtbar ist:
/view:json-Ausgabe wird nicht DML-gerendert. Stattdessen enthält sie pseudo_c_tokens, damit externe Tools ihr eigenes Syntax-Highlighting anwenden können.Häufige DML-Vordergrundplätze:
wfg
Standard-Vordergrundtext des Fensters.normfg
Normaler Text des Befehlsfensters.emphfg
Hervorgehobener Text. Microsoft dokumentiert dies standardmäßig als hellblau, aber das genaue Aussehen hängt dennoch vom Theme ab.warnfg
Warntext.errfg
Fehlertext.verbfg
Ausführlicher Text.changed
Geänderte Daten. Microsoft dokumentiert dies standardmäßig als rot.Häufige quellorientierte DML-Vordergrundplätze:
srcnum
Numerische Konstanten.srcchar
Zeichenkonstanten.srcstr
Zeichenkettenkonstanten.srcid
Bezeichner.srckw
Schlüsselwörter.srcpair
Klammern oder passende Symbolpaare.srccmnt
Kommentare.srcdrct
Direktiven.srcspid
Spezielle Bezeichner.srcannot
Quellanmerkungen oder anmerkungsähnliche Elemente.Beispiele:
verbfg bedeutet "Ausführlicher Vordergrundplatz", nicht "ein bestimmtes benanntes Blau".warnfg bedeutet "Warnungs-Vordergrundplatz", nicht "immer gelb oder orange".function_name_color: "srcid" bedeutet "Funktionsnamen mit WinDbgs Bezeichnerplatz rendern".Wenn Sie Farben auf einem dunklen Theme einstellen:
function_name_color: "emphfg" oder function_name_color: "verbfg", wenn Funktionsnamen mit srcid zu dunkel wirken.identifier_color: "normfg" oder identifier_color: "wfg" für allgemeine Symbole, die lesbar bleiben, aber Schlüsselwörter nicht überlagern sollen.comment_color: "subfg" bei, wenn Sie möchten, dass Kommentare zurücktreten, ohne ganz zu verschwinden.Offizielle Referenz:
Das eingecheckte decomp.llm.json.example enthält nur gültige Einstellungen der obersten Ebene, die die Erweiterung tatsächlich liest.
Referenzbeispiele:
Folgen Sie der PC-UI-Sprache:```json { "display_language": { "mode": "auto" } }
Englisch erzwingen:```json
{
"display_language": {
"mode": "fixed",
"tag": "en-US",
"name": "English"
}
}
Koreanisch erzwingen:```json { "display_language": { "mode": "fixed", "tag": "ko-KR", "name": "Korean" } }
Dunkles Syntax-Highlighting-Voreinstellung:```json
{
"syntax_highlighting": {
"keyword_color": "warnfg",
"type_color": "emphfg",
"function_name_color": "srcid",
"identifier_color": "wfg",
"number_color": "changed",
"string_color": "verbfg",
"char_color": "srcchar",
"comment_color": "subfg",
"preprocessor_color": "normfg",
"operator_color": "srcannot",
"punctuation_color": "srcpair"
}
}
Helles Syntax-Highlighting-Voreinstellung:```json { "syntax_highlighting": { "keyword_color": "emphfg", "type_color": "warnfg", "function_name_color": "srcid", "identifier_color": "normfg", "number_color": "changed", "string_color": "verbfg", "char_color": "srcchar", "comment_color": "subfg", "preprocessor_color": "srcannot", "operator_color": "wfg", "punctuation_color": "subfg" } }
Beispiel für `/view:json`-Antwortdetails:
- Die JSON-Antwort enthält `pseudo_c` und `pseudo_c_tokens`.
- `pseudo_c_tokens` ist ein deterministischer Token-Stream, der sich für externes Syntax-Highlighting eignet.
- Die serialisierte Anfrage enthält `preferred_natural_language_tag` und `preferred_natural_language_name`, die die aufgelöste Anzeigesprache nach Anwendung von `display_language.mode` widerspiegeln.
- Analysatorfakten enthalten jetzt P0-Qualitätsfelder: `ir_values`, `block_value_states`, `control_flow` und `abi`.
- `ir_values` legt SSA-ähnliche Wert-IDs, Definitionsstellen, Ziele, kanonische Ausdrücke, Nutzungsverknüpfungen, Konstanten/Kopier-Flags und Hinweise auf tote Definitionen offen.
- `block_value_states` legt pro Basisblock lebendige Eingangs-/Ausgangs-Reaching-Definitionen, kanonische Werte, Speicherklasse, Konvergenzzustand und Konfidenz offen.
- `stack_pointer` legt pro Anweisung Stack-Deltas, frame-relative Aliase, rohe Basis/Offsets und Konfidenz offen.
- `control_flow` legt strukturierte Bereichskandidaten wie `natural_loop`, `if_else_candidate` und `switch_candidate` mit Blocknachweisen, Schleifeninduktionsmetadaten, Switch-Tabellen/Default/Bereichsmetadaten, Vorzeichen, Indexausdrücken und Konfidenz offen.
- `abi` legt Microsoft-x64-Shadow-Space-Annahmen, Home-Slot-Nachweise, Frame/Prolog/Epilog-Erkennung, No-Return-Call-Nachweise, Tail-Call-Kandidaten, Thunk-Kandidaten, Import-Wrapper-Kandidaten und wiederhergestellte Aufrufargumente aus Registern und Stack-Speichern offen.
- Analysatorfakten enthalten jetzt auch P1-semantische Felder: `type_hints`, `idioms` und `callee_summaries`.
- `type_hints` legt Zeiger-, lokal-, Feld-Offset-, arrayartige, enumartige, bitflagartige und Vtable-Kandidaten-Nachweise mit Quelle und Konfidenz offen. Wenn PDB-Daten verfügbar sind, werden auch bereichsbezogene Parameter/Lokale, Feldhinweise und Enum-Konstanten in diesen vereinheitlichten Typ-Hint-Stream aufgenommen.
- `idioms` legt Ersetzungen auf höherer Ebene für erkannte Hilfsaufrufe und Compilermuster offen, wie Speicherkopieren/Füllen, Zeichenfolgenkopieren, Security-Cookie-Prüfungen, Stack-Probes, Allokations/Free-Helfer, Aggregatinitialisierer und RIP-relativierte globale/Import-Ladevorgänge.
- `callee_summaries` legt direkte und indirekte Aufgerufene-Rückgabetyp-, Parameter-Modell-, Seitenwirkungs-, Speicherwirkungs-, Eigentums-, Quellen- und Konfidenzhinweise offen; symbol-/typanreicherte Aufrufziele ersetzen die anfänglichen heuristischen Zusammenfassungen, wenn WinDbg sie auflösen kann, und virtuelle Aufrufkandidaten enthalten Zielausdrücke sowie Vtable-Offsets, wenn diese wiederhergestellt wurden.
- Bekannte Win32/NT/Rtl-API-Zusammenfassungen beschreiben Speicherkopieren/Füllen/Nullen, Allokation, Freigabe, Status- und Fehlerverhalten, wenn Symbolnamen verfügbar sind.
- Prompt-Fakten enthalten `analyzer_skeleton` und `graph_summary`, sodass das Modell einen evidenzgestützten Entwurf verfeinert, anstatt von einer leeren Seite zu beginnen.
- `graph_summary` liefert Eintrittsblock, Kontrollflussregionen, normalisierte Bedingungen und repräsentative hochsignalisierende Blöcke mit einer expliziten Abschneideregel. Die Prompt-Faktenauswahl ordnet jetzt hochsignalisierende Einträge und verwendet Spread-Sampling, um große Faktenmengen repräsentativ zu halten.
- `evidence_graph` legt hochsignalisierende Faktenknoten und Herkunftskanten offen, sodass IR-Werte, Blockwertzustände, Speicherzugriffe, Aufrufziele, Typ-Hinweise, PDB-Hinweise und beobachtetes Verhalten auf Anweisungs- und Blocknachweise zurückverfolgt werden können.
- `obfuscation`, `semantic_control_flow` und `deobfuscation_readiness` legen OLLVM-artige Wiederherstellungsfakten offen und ob die Deobfuskations-Umschreibungsanleitung für den aktuellen Befehl aktiviert ist.
- Die Verifiziererantwort enthält legacy `warnings` sowie strukturierte `issues`-Einträge. Jeder Issue trägt `severity`, `code`, `message` und optional `evidence`, sodass Tools Fehler wie `branch.true_target_not_successor` getrennt von risikofirmeren Warnungen filtern können.
- Verifiziererprüfungen vergleichen jetzt normalisierte Branch-True/False-Ziele mit CFG-Nachfolgern, vergleichen die Pseudocode-Branchdichte mit wiederhergestellten bedingten Verzweigungen, gleichen direkte Aufgerufene-Zusammenfassungen mit Pseudocode-Aufrufeffekten ab, validieren die Verankerung von Evidence-Graph-Knoten/Kanten und überprüfen Blockwertzustandsreferenzen auf wiederhergestellte Blöcke und IR-Werte.
- Normale und Explain-Ausgaben können einen prägnanten Abschnitt `suggested fixes` enthalten. Dabei handelt es sich um konservative `/fix:*`-Befehle, die aus Verifiziererproblemen, PDB-gestützten Umbenennungsmöglichkeiten oder wiederholten beobachteten Speicher-Hotspots abgeleitet werden. DML-bewusste Ausgabe rendert sofort anwendbare Vorschläge als anklickbare Wiederholungslink für dasselbe Ziel; Platzhalter-Feldtypvorschläge bleiben Klartext, bis `TYPE` ersetzt wird.
- Im LLM-Modus speist die Erweiterung Verifiziererprobleme automatisch in einen erneuten Prompt ein. Der erneute Versuch wird beibehalten, wenn er die Verifiziererqualität bewahrt oder verbessert; andernfalls wird die ursprüngliche Antwort mit einer hinzugefügten Unsicherheitsnotiz beibehalten.
- `session_policy` und `observed_behavior` legen WinDbg-spezifischen Kontext offen, wie Live/Dump/Kernel/TTD-ähnliche Richtlinie, Registerargument-Stichproben des aktuellen Frames, Speicher-Hotspots und vorgeschlagene Trace-Abfragen.
- Die serialisierte Anfrage enthält jetzt auch ein `pdb`-Objekt, wenn Symbol-/Typdaten verfügbar sind.
- `pdb.availability` meldet die Anreicherungsstufe wie `none`, `symbols`, `typed` oder `scoped`.
- `pdb.params`, `pdb.locals`, `pdb.field_hints`, `pdb.enum_hints` und `pdb.source_locations` sind als maschinenlesbare semantische Hinweise für externe Werkzeuge oder Offline-Analyse gedacht.
Optionale Umgebungsüberschreibungen:
- `DECOMP_LLM_PROVIDER`
- `DECOMP_LLM_ENDPOINT`
- `DECOMP_LLM_MODEL`
- `DECOMP_LLM_API_KEY`
- `OPENAI_API_KEY`
- `DECOMP_LLM_CHATGPT_ACCESS_TOKEN`
- `DECOMP_LLM_CODEX_ACCESS_TOKEN`
- `KERNFORGE_CODEX_ACCESS_TOKEN`
- `DECOMP_LLM_CHATGPT_AUTH_FILE`
- `DECOMP_LLM_CODEX_AUTH_FILE`
- `KERNFORGE_CODEX_AUTH_FILE`
- `DECOMP_LLM_REASONING_EFFORT`
- `DECOMP_LLM_TIMEOUT_MS`
- `DECOMP_LLM_MAX_COMPLETION_TOKENS`
- `DECOMP_LLM_FORCE_CHUNKED`
- `DECOMP_LLM_CHUNK_TRIGGER_INSTRUCTIONS`
- `DECOMP_LLM_CHUNK_TRIGGER_BLOCKS`
- `DECOMP_LLM_CHUNK_BLOCK_LIMIT`
- `DECOMP_LLM_CHUNK_COUNT_LIMIT`
- `DECOMP_LLM_CHUNK_COMPLETION_TOKENS`
- `DECOMP_LLM_MERGE_COMPLETION_TOKENS`
- `DECOMP_NORETURN_OVERRIDES`
Komma- oder Semikolon-getrennte Funktionsnamenfragmente, die während der Fallback-Disassemblierung, CFG-Nachfolger-Wiederherstellung, ABI-Fakten und Verifiziererprüfungen als No-Return-Ziele behandelt werden. Beispiel: `DECOMP_NORETURN_OVERRIDES=MyAbort;PanicAndExit`.
Hinweis zur Qualitätspriorität:
- Die Erweiterung unterstützt jetzt eine mehrstufige Analyse in Blöcken für große Funktionen.
- Der Analysator sendet IR-Wertfakten, Blockwertzustände, Kontrollflussregionen, Evidence-Graph-Fakten und x64-ABI/No-Return-Nachweise vor der Verfeinerung an das LLM, sodass `/view:analyzer`, `/view:json` und der normale LLM-Modus alle dieselbe P0-Evidenzbasis teilen.
- Der Verifizierer gleicht Schleifen-, Switch-, No-Return-, Branch-Ziele, Rückgabeverhalten, Aufgerufene-Aufrufeffekte, Evidence-Graph-Verankerung, Blockwertzustandskonsistenz, Evidenzabdeckung und verdächtige Identifikatorbehauptungen mit Analysatornachweisen ab. Er senkt das Vertrauen, wenn selbstbewusste Prosa wiederhergestellte Fakten überholt, und kennzeichnet jedes Problem mit einem stabilen Schweregrad-/Code-Paar.
- Wenn Verifiziererrückmeldungen Schemafehler, Faktenkonflikte oder sehr niedriges angepasstes Vertrauen feststellen, führt der LLM-Pfad einen automatischen erneuten Versuch durch, wobei die Verifiziererprobleme an den Prompt angehängt werden.
- Ein guter Ausgangspunkt für Cloud-Modelle ist `max_completion_tokens=12000`, `chunk_completion_tokens=6000` und `merge_completion_tokens=12000`, mit `force_chunked=false` und Blockauslösern um `900 instructions` oder `36 blocks`.
- Behalten Sie `force_chunked=true` nur für Belastungstests der Blockpipeline bei. Qualitätsorientierte Dekompilation von abgeflachten oder dispatcher-lastigen Funktionen benötigt normalerweise einen einzelnen Prompt, bis die Funktion groß genug ist, um die konfigurierten Blockauslöser zu überschreiten.
- Halten Sie `timeout_ms` für Cloud-Modelle hoch. `120000` ist ein sichererer Ausgangspunkt als `15000`.
- Wenn die Qualität bei riesigen Funktionen immer noch schwach ist, erhöhen Sie `chunk_count_limit` vor dem Verkleinern von `/limit:N`.
- Wenn kein Endpunkt konfiguriert ist, fällt die Erweiterung auf den deterministischen Mock-Provider zurück.
- Selbst wenn die Erweiterung `/view:analyzer` oder den Mock-Provider verwendet, wirken sich `display_language` und `syntax_highlighting` immer noch auf das aus, was der Benutzer sieht.
## WinDbg Smoke Test
1. Erstellen Sie mit `Build.ps1` oder `Build-Legacy.ps1`.
2. Platzieren Sie `decomp.llm.json` neben der erstellten `decomp.dll`.
3. Starten Sie WinDbg. Umgebungsvariablen sind nur optionale Überschreibungen.
4. Laden Sie die Erweiterung.
5. Validieren Sie den Nur-Analysator-Modus, bevor Sie den LLM-Pfad aktivieren.```text
.load C:\path\to\decomp.dll
!decomp /view:analyzer ntdll!RtlAllocateHeap
!decomp /view:facts kernel32!Sleep
Dann validiere den LLM-Modus:```text !decomp ntdll!RtlAllocateHeap !decomp /view:json ntdll!RtlAllocateHeap !decomp 0x7ffb`12345678
Erwartete Überprüfungen:
- `target`, `entry` und `module` sollten konsistent aufgelöst werden
- `regions` sollten für normale Funktionen nicht null sein
- `/view:analyzer` sollte weiterhin die Analyzer-Konfidenz und den Pseudocode-Stub ausgeben
- Der LLM-Modus sollte `summary`, `pseudo_c`, `pseudo_c_tokens` und `verified` ausfüllen
- Die `/view:json`-Ausgabe sollte `preferred_natural_language_tag` und `preferred_natural_language_name` in der serialisierten Anfrage enthalten
- Wenn private oder umfangreiche PDBs geladen sind, sollte `/view:json` auch `pdb.prototype`, `pdb.params` und möglicherweise `pdb.locals` enthalten
- Bei typisierten Strukturen und Enums kann `/view:json` `pdb.field_hints` und `pdb.enum_hints` enthalten
## ChatGPT-Abonnement-Beispiel```powershell
$env:DECOMP_LLM_PROVIDER = "chatgpt"
$env:DECOMP_LLM_MODEL = "gpt-5.5"
$env:DECOMP_LLM_CHATGPT_AUTH_FILE = "$env:USERPROFILE\.codex\auth.json"
$env:DECOMP_LLM_TIMEOUT_MS = "120000"
Wenn die Auth-Datei ein Refresh-Token enthält, aktualisiert die Erweiterung ein abgelaufenes Access-Token, bevor die Anfrage gesendet wird. DECOMP_LLM_CHATGPT_ACCESS_TOKEN kann für einen temporären Bearer-Token verwendet werden, aber der Pfad zur Auth-Datei ist für normale WinDbg-Sitzungen besser, da er den Token-Ablauf übersteht. Die Erweiterung öffnet während !decomp niemals einen Browser; führen Sie codex login außerhalb von WinDbg aus, wenn ein interaktiver ChatGPT-Login erforderlich ist.
$env:DECOMP_LLM_ENDPOINT = "http://127.0.0.1:11434/v1/chat/completions" $env:DECOMP_LLM_MODEL = "qwen2.5-coder:14b" $env:DECOMP_LLM_API_KEY = "ollama"
### LM Studio```powershell
$env:DECOMP_LLM_ENDPOINT = "http://127.0.0.1:1234/v1/chat/completions"
$env:DECOMP_LLM_MODEL = "local-model"
$env:DECOMP_LLM_API_KEY = "lm-studio"
$env:DECOMP_LLM_ENDPOINT = "http://127.0.0.1:8000/v1/chat/completions" $env:DECOMP_LLM_MODEL = "Qwen/Qwen2.5-Coder-14B-Instruct" $env:DECOMP_LLM_API_KEY = "local"