実行中の関数を逆アセンブルし、LLMを使用して検証済みの擬似コードを生成するWinDbg x64拡張機能。


このプロジェクトは、Windows x64 WinDbg 拡張スケルトンであり、名前またはアドレスで関数を解決し、決定論的な制御フロービューを再構築し、拡張機能から直接 LLM に問い合わせて擬似コードを生成するものです。
src/extension: WinDbg 拡張 DLL と !decomp コマンド。src/shared: 拡張機能で共有される JSON、アナライザー、プロトコル、検証コード。scripts: ビルドおよびベンダーコピーのヘルパー。third_party/dbgeng: オプションでベンダー提供の dbgeng.h と dbgeng.lib のコピー。third_party/zydis: ベンダー提供の安定版 Zydis ソースツリー。存在する場合、デフォルトで使用されます。xmm0 から xmm3 までの SIMD/FP 対応 Microsoft x64 引数復元。偽の受信引数を回避するためのベクトルゼロイディオムガード付き/deobf:on|off に加えた難読化解除準備ファクトビルド出力から拡張機能をロードし、シンボルまたはアドレスに対して !decomp を実行します。```text
.load C:\path\to\decomp.dll
!decomp /doctor
!decomp module!FunctionName
!decomp 0x7ffb`12345678
セットアップが正しくないように見える場合、またはLLMプロバイダーを有効化する前に `/doctor` を使用してください:```text
!decomp /doctor
!decomp /doctor:net
/doctor は対象を必要とせず、プロバイダーを呼び出しません。設定ファイルのパス/読み込み状態、プロバイダー/モデル/エンドポイントの概要、シークレットを含まない認証情報の有無、タイムアウト/トークン/チャンク化設定、DML サポート、セッションクラス/修飾子、プロセッサタイプ、および PDB の注意事項を報告します。/doctor:net は明示的なネットワークチェック要求として受け入れられますが、現在はプロバイダーの ping がスキップされることを報告します。この拡張機能は doctor モードからネットワークプローブを実行しません。ターゲットは、パブリック/プライベートシンボル、エクスポートされた関数名、またはアドレスにすることができます。ターゲットが関数内のアドレスに解決される場合、拡張機能はシンボル、アンワインドデータ、および制御フローヒューリスティックから包含関数の範囲を復元しようとします。スペースを含むターゲットは引用符で囲んでください:```text !decomp "my module!Function With Spaces"
通常のコマンドパスは、ローカル解析を実行し、アナライザーファクトを構築し、オプションで設定されたLLMエンドポイントを呼び出し、復元された証拠に対して応答を検証し、疑似Cコードに加えて信頼度、警告、不確実性の注記を出力します:```text
!decomp ntdll!RtlAllocateHeap
!decomp kernel32!Sleep
!decomp game.exe!CheckIntegrity
通常の brief および explain 出力には、/verbose を指定しなくてもコンパクトな進捗ストリームが含まれます。長時間のLLM実行では、ローカル分析の完了、チャンクの進捗、再試行通知、マージ開始、検証、Ctrl+Breakによるキャンセルのヒントが表示されます。/view:json、/view:facts、/view:prompt、/view:data などの機械可読モードでは、進捗行とDMLヘルパーリンクが抑制されるため、スクリプトは要求されたペイロードのみを受け取ります。
/view:* を使用して表示内容を選択します。これによりコマンド体系が小さく保たれ、1つのオプションですべての出力モードを制御できます。```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` は、ターゲット、信頼度、要約、および最初の不確実性または検証警告を表示します。
- `explain` は、evidence、control-flow、type-hint、observed-behavior、call-target の各セクションを追加します。
- `json` は、機械可読なリクエストとレスポンスの JSON を表示します。
- `facts` は、analyzer のファクトのみを表示し、LLM パスを無効にします。
- `prompt` は、正確なシステムプロンプト、ユーザープロンプト、およびプロンプトファクトを表示します。LLM 呼び出しを無効にします。
- `data` は、WinDbg JavaScript/NatVis スタイルの自動化を目的とした、安定した JSON スナップショットを表示します。
- `analyzer` は、LLM を呼び出さずに、決定的な analyzer 専用の疑似コードパスをレンダリングします。
- `plan` は、LLM を呼び出さず、結果キャッシュも更新せずにローカル分析を実行し、プリフライトプランを表示します。これには、target/module/range の数、PDB の可用性、セッションポリシー、推定チャンキング、プロンプトサイズに関連するカウント、および実用的な推奨事項が含まれます。
コマンドが停止しているように見える場合、または完全な進捗ストリームを確認したい場合は、`/verbose` を使用してください:```text
!decomp /verbose module!SlowFunction
!decomp /verbose /view:json module!SlowFunction
/verbose は、ターゲット解決、関数範囲の復元、バイト読み取り、逆アセンブル、アナライザのファクト構築、PDB/セッションの拡充、疑似コードのトークン化、検証結果などのローカルステージを表示します。/verbose はプロンプトサイズ、リクエストトークンの予算、HTTP 接続/送信/受信ステージ、レスポンスチャンクサイズ、完了理由、抽出されたモデル JSON のプレビュー、再試行回数、検証フィードバックによる再試行の決定も表示します。/verbose はコンパクトな進捗ストリームを完全なトレースに置き換えます。コンパクトな進捗行だけでは時間の消費箇所を特定できない場合に使用します。!decomp コマンド中に、WinDbg で Ctrl+Break を押すとキャンセルを要求できます。拡張機能は、ローカル解析ステージ間および LLM ワーカーの待機中に割り込みをチェックし、アクティブな同期 HTTP I/O の停止を要求します。/brief、/explain、/json、/facts-only、/debug-prompt、/data-model、/dx、/no-llm などのレガシーエイリアスは古いスクリプトでも引き続き動作しますが、新しい例では /view:* を使用します。
ウィンドウビューア:```text !decomp /view:window module!FunctionName !decomp /view:window /view:explain module!FunctionName
- `/view:window` は対象に対して通常の `!decomp` 結果パスを実行し、レンダリングされた完全な結果を別のビューアで開きます。
- ビューアはコンソールパスと同じレスポンスレンダラを使用し、その後、デバッガウィンドウが見つかった場合にはそのウィンドウが所有するネイティブなWin32モードレスツールウィンドウを開きます。
- デバッガ出力には、ネイティブビューアのウィンドウハンドルが報告されます。ビューアウィンドウを作成できない場合、コマンドは警告を表示し、通常のコンソール結果にフォールバックします。
- DML専用リンクは、ビューア内ではコマンド文字列付きのテキストラベルとして表示されます。RichEditが利用可能な場合、ウィンドウはセクション見出し、メタデータのスタイル、擬似コードのハイライトを備えたGitHubスタイルのRTFレイアウトを使用します。それ以外の場合はプレーンテキストにフォールバックします。
- 現在のセッションに以前のキャッシュ結果がある場合、ビューアは左側に履歴リストを表示するため、分析を再実行せずに現在の出力と以前の逆コンパイル結果を切り替えることができます。
- `/view:json`、`/view:facts`、`/view:prompt`、`/view:data` はマシンリーダブルなコンソール出力のままであり、ビューアにはリダイレクトされません。
大きな関数:```text
!decomp /limit:deep module!LargeFunction
!decomp /limit:huge module!VeryLargeFunction
!decomp /limit:12000 module!VeryLargeFunction
!decomp /timeout:120000 module!SlowFunction
/limit:deep は命令上限を 8192 に引き上げます。/limit:huge は命令上限を 16384 に引き上げます。/limit:N は明示的な命令上限を設定します。/timeout:MS はこの呼び出しのリクエストタイムアウトを上書きします。decomp.llm.json によって制御され、コマンドラインの命令上限は、プロンプト実行前に拡張機能が復元を試みるローカルコードの量を制御します。/deep、/huge、/maxinsn:N は引き続きサポートされます。難読化対応の逆コンパイル:```text !decomp /deobf:on module!FlattenedFunction !decomp /deobf:off module!FlattenedFunction !decomp /view:facts /deobf:off module!FlattenedFunction
- `/deobf:on` がデフォルトです。アナライザは引き続き生のファクトを出力しますが、信頼度の高い OLLVM 風ディスパッチャ復元、不透明なデッドエッジの証明、置換イディオム、意味的 CFG オーバーレイが、プロンプトファクト、マージポリシー、検証器の競合ポリシー、構造化された疑似 C 復元を導く場合があります。
- `/deobf:off` は `obfuscation`、`semantic_control_flow`、`deobfuscation_readiness` の各ファクトを表示したままにしますが、書き換えの安全なアクションを無効にし、制御フロー構造化を生の CFG に対して行い、プロンプト/マージ/検証器の各経路に難読化された元の形状を保持するよう指示します。
- ディスパッチャ、偽の分岐、置換の表面を直接調査したい場合は、拡張機能に難読化解除された構造の復元を依頼する代わりに `/deobf:off` を使用してください。
- `/deobfuscation:on|off` はより長いエイリアスとして受け付けられます。