メインコンテンツへ移動
AIチュートリアル

x64dbg-MCP ServerでAIアシスタントをx64dbgに接続する

x64dbg-MCP Serverのインストール、HTTPエンドポイントの保護、MCP対応AIアシスタントの接続方法と、バイナリの読み込み、ブレークポイントの設定、レジスタの確認、メモリの読み取り、コードのトレース、モジュールの分析など、一般的なデバッグ作業について解説します。

x64dbg-MCP ServerでAIアシスタントをx64dbgに接続する

x64dbg-MCP Serverとは?

x64dbg-MCP Serverは、Model Context Protocolに対応したx64dbg用のネイティブプラグインです。HTTP上のJSON-RPCを介してx64dbgの機能を公開し、MCP互換AIアシスタントからデバッグセッションをプログラムで制御できるようにします。

アシスタントは、プロセスの読み込みやアタッチ、ブレークポイントの設定、命令のステップ実行、レジスタの調査、メモリの読み取りとパッチ適用、モジュールやスレッドの確認、文字列の抽出、参照の追跡、PE構造の解析など、多くのリバースエンジニアリング操作を実行できます。

このプラグインはZigで記述され、x64dbg内で直接動作します。Python、.NET、または別のランタイムは必要ありません。MCP 2024-11-05仕様に対応し、Streamable HTTPと従来のSSEトランスポートをサポートします。

このソフトウェアは、正当なリバースエンジニアリング、マルウェア解析、セキュリティ研究、教育、または明示的な許可を得たその他の目的にのみ使用してください。

主な機能

  • 幅広いデバッガー制御: 逆アセンブル、実行、ブレークポイント、レジスタ、メモリ、モジュール、スレッド、コールスタック、シンボル、参照、PE解析、トレース、ダンプ、PEB調査などを操作できます。
  • デバッガーイベントの網羅: 初期化、停止、ブレークポイント、例外、ステップ実行、プロセスへのアタッチ、DLLの動作、スレッドの動作などのイベントを記録します。
  • ネイティブデプロイ: 外部ランタイムやフレームワークへの依存はありません。
  • x32およびx64対応: 1つのコードベースから、x64dbgの両アーキテクチャ用プラグインをビルドできます。
  • 2種類のMCPトランスポート: Streamable HTTPを推奨しますが、従来のMCPクライアント向けにSSEもサポートします。
  • 必須認証: すべてのリクエストに有効なBearerトークンが必要です。
  • 自動起動: x64dbgの起動時にサーバーが開始します。
  • 組み込み設定: x64dbgのPluginsメニューから、バインドアドレス、ポート、トークンを設定できます。
  • クロスコンパイル: Zigを使って、Windows、WSL、Linux、macOSからWindows用プラグインをビルドできます。

統合の仕組み

x64dbgの起動時に、プラグインはx64bridge.dllおよびx64dbg.dllからデバッガーAPIのシンボルを解決します。その後、バックグラウンドスレッドでHTTPサーバーを起動します。MCPクライアントは認証済みのJSON-RPCリクエストを送信し、各MCPツールがブレークポイントの設定、メモリの読み取り、実行の再開などのx64dbg SDK呼び出しに対応します。

プラグインはx64dbgプロセス内で動作するため、デバッガーAPIと直接通信します。外部ヘルパープロセスやポーリングサービスは必要ありません。

プラグインのインストール

方法1: リリース版をインストールする

  1. プロジェクトのGitHubリリースから最新パッケージをダウンロードします。
  2. パッケージを展開します。
  3. パッケージ内のdist/ディレクトリの内容を、x64dbgインストール先のルートディレクトリにコピーします。
  4. x32版またはx64版のx64dbgを起動します。

配布パッケージはx64dbgのディレクトリ構造を再現しているため、ルートにコピーすると両アーキテクチャ用のプラグインがインストールされます。

dist/
├── x32/
│   └── plugins/
│       └── x64dbg-MCP-Server.dp32
└── x64/
    └── plugins/
        └── x64dbg-MCP-Server.dp64

サーバーは自動的に起動します。デフォルトのポートは次のとおりです。

  • x64: 0.0.0.0:9094
  • x32: 0.0.0.0:9095

方法2: ソースからビルドする

ビルドにはZig 0.16-dev以降が必要です。リポジトリのルートから次を実行します。

zig build -Doptimize=ReleaseSafe --prefix dist

このコマンドにより、dist/以下にx32とx64の両方のプラグインファイルが作成されます。リリースパッケージの場合と同じように、そのディレクトリの内容をx64dbgのルートフォルダーにコピーします。

サーバーと認証を設定する

x64dbgでPlugins > x64dbg-MCP Server > Configure MCP Server...を開きます。ダイアログで、バインドアドレス、ポート、認証トークンを変更できます。

  • MCPクライアントが同じWindowsシステム上で動作し、リモートアクセスが不要な場合は127.0.0.1を使用します。
  • WSLや、ネットワーク経由でホストに接続する必要がある別のマシンから接続する場合は0.0.0.0を使用します。
  • Copyを選択すると、現在のトークンをコピーできます。
  • Generateを選択すると、トークンを更新できます。

初回実行時にBearerトークンが自動生成されます。正しいトークンを含まないリクエストには401 Unauthorizedが返されます。サーバーが自動的に再起動するため、保存した変更は直ちに反映されます。設定はx64dbg実行ファイルと同じ場所にあるmcp_config.jsonに保存されます。

このサーバーは、暗号化されていないHTTP経由でメモリの読み取りと書き込み、プロセス操作、デバッガーコマンドの実行を提供します。Bearer認証が必須であっても、信頼できないネットワークに公開しないでください。

MCPクライアントに接続する

推奨されるStreamable HTTP設定

.mcp.jsonなどのMCPクライアント設定にサーバーエントリを追加します。x64のデフォルトポートを使用する場合は、次のように設定します。

{
  "mcpServers": {
    "x64dbg": {
      "type": "http",
      "url": "http://localhost:9094/",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN_HERE"
      }
    }
  }
}

YOUR_TOKEN_HEREをプラグイン設定ダイアログからコピーしたトークンに置き換えます。x32dbgを使用する場合は、デフォルトポートを9095に変更します。

レガシークライアント向けSSE設定

MCPクライアントがSSEのみをサポートしている場合は、sseトランスポートを選択し、エンドポイントに/sseを追加します。

{
  "mcpServers": {
    "x64dbg": {
      "type": "sse",
      "url": "http://localhost:9094/sse",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN_HERE"
      }
    }
  }
}

WSLまたはリモートアクセスを使用する場合は、localhostをWindowsホストのIPアドレスに置き換え、サーバーが0.0.0.0にバインドされていることを確認してください。

AI支援デバッグセッションを実行する

クライアント接続後、x64dbgを開き、アシスタントに一連の簡単なデバッグタスクを実行するよう依頼します。一般的なセッションは次のように開始できます。

calc.exeを読み込み、エントリーポイントでブレークしてください。

アシスタントはLoadBinary、SetBreakpoint、run、WaitForPauseを組み合わせて、実行ファイルを読み込み、実行を再開し、ブレークポイントに到達するまで待機できます。

レジスタを検査する

対象が一時停止したら、次のように依頼します。

現在のCPUレジスタを表示してください。

アシスタントはGetAllRegistersを呼び出せます。許可されたデバッグセッション中に値を変更するには、SetRegisterを使用できます。

メモリを読み取り、逆アセンブルする

現在の命令ポインター周辺のコードを検査するようアシスタントに依頼します。

現在の命令ポインターから64バイトを読み取り、次の10個の命令を逆アセンブルしてください。

これにはGetCurrentAddress、ReadMemory、Disassembleを使用できます。解析済み関数全体を検査するには、DisassembleFunctionを要求します。

コードをステップ実行する

実行ツールは、x64dbgでおなじみの操作に対応しています。

  • StepIntoはF7のように、呼び出し先へステップインします。
  • StepOverはF8のように、呼び出しをステップオーバーします。
  • StepOutは現在の関数が戻るまで実行します。
  • runはF9のように実行を再開します。
  • PauseDebugは対象を一時停止します。
  • RunToAddressは指定したアドレスに到達するまで続行します。

例:

次の3つの命令をステップオーバーしてから、現在のアドレスとコールスタックを表示してください。

アシスタントはStepOverを3回呼び出し、その後にGetCurrentAddressとGetCallStackを呼び出せます。

ブレークポイントを効果的に使用する

プラグインは、通常のソフトウェアブレークポイント、ハードウェアブレークポイント、メモリブレークポイント、条件付きブレークポイント、例外ブレークポイントをサポートしています。

条件付きブレークポイントの例

対象関数にブレークポイントを設定します。ただし、指定したx64dbg条件が真の場合のみ一時停止してください。

アシスタントは、x64dbg条件式と任意のログアクションを指定してSetConditionalBreakpointを使用できます。関連ツールで、ブレークポイントの有効化、無効化、切り替え、削除、ヒット回数のリセットを行えます。

ハードウェアブレークポイントとメモリブレークポイント

利用可能なデバッグレジスタを通じて読み取り、書き込み、実行を監視するにはSetHardwareBreakpointを使用します。ページ単位の読み取り、書き込み、実行監視が調査に適している場合は、SetMemoryBreakpointを使用します。

ブレークポイントを追加作成する前に、アシスタントにListBreakpointsを呼び出すよう依頼してください。これにより、重複したり競合したりするデバッガー状態を避けやすくなります。

モジュール、シンボル、参照を分析する

サーバーは、低レベルデバッグからより広範なプログラム分析へ移行するための複数のツールを提供します。

  • ListModulesは、読み込まれたモジュール、ベースアドレス、サイズを報告します。
  • AnalyzeModuleは、PEセクション、エントリーポイント、イメージサイズを調べます。
  • GetImportsとGetExportsは、インポートテーブルとエクスポートテーブルを検査します。
  • SearchSymbolsは、パターンに一致するシンボルを検索します。
  • GetFunctionsは、解析済みの関数とラベルを一覧表示します。
  • GetReferencesは、対象アドレスへのCALLおよびJMP参照を検索します。
  • FindPatternはモジュールメモリをスキャンし、??ワイルドカードをサポートします。
  • GetStringsは、モジュールのメモリからASCII文字列を抽出します。
  • DetectOEPは、パックされた実行ファイルの元のエントリーポイントの特定に役立ちます。

実用的な分析依頼の例:

読み込まれたモジュールを一覧表示し、メイン実行ファイルを分析して、そのASCII文字列を抽出し、選択した関数への参照を表示してください。

高度なヒント

イベントを考慮したワークフローを使用する

実行を再開した直後に対象が一時停止したと仮定しないでください。run、ブレークポイント操作、その他の非同期デバッガー操作の後には、WaitForPauseまたはWaitForEventを使用します。GetEventLogで、最近のブレークポイント、例外、DLLの読み込み、関連イベントを確認できます。

個別のステップを繰り返す代わりにトレースする

短い命令履歴を取得するには、TraceIntoを使用して、呼び出し先へステップインしながらアドレスと逆アセンブル結果を記録します。呼び出しをステップオーバーする場合はTraceOverを使用します。多数の個別ステップ要求を発行するより便利です。

式をまとめて検査する

EvalExpressionは、アドレス、レジスタ、算術式などのx64dbg式を評価します。複数の値をまとめて監視する必要がある場合は、WatchExpressionsを使用して1回の要求で複数の式を評価します。

分析状態を保存して復元する

CommentOrLabelAtAddressとブックマークツールを使用して、重要な場所に注釈を付けます。SaveDatabaseを呼び出すと、x64dbgデータベースを.dd64または.dd32ファイルとして保存できます。

パッチは慎重に適用する

WriteMemToAddressはバイト列をパッチし、Assembleは指定したアドレスにアセンブル済みの命令を書き込みます。パッチを適用する前に既存のバイト列を確認し、変更内容を記録しておきます。GetPatchesで変更を確認し、RestorePatchesで元のバイト列に復元できます。

プロセス構造体を調査する

GetPEBでProcess Environment Blockのフィールドを調査し、GetSEHChainでx32のStructured Exception Handlerチェーンを確認し、GetArgumentsでレジスタまたはスタックから関数の引数を調査します。FollowPointerを使用すると、指定したレベル数のポインタチェーンを逆参照できます。

ネットワークへの露出を最小限に抑える

リモート接続が必要でない限り、127.0.0.1を優先してください。0.0.0.0にバインドする必要がある場合は、信頼できるネットワーク制御でアクセスを制限し、トークンを保護してください。露出が疑われる場合はトークンをローテーションします。トランスポートは暗号化されたHTTPSではなくHTTPであることに注意してください。

便利な運用ツール

  • GetDebugStateはデバッグセッションがアクティブかどうかを確認し、PIDと命令ポインタを報告します。
  • AttachProcessはPIDを指定して、実行中のプロセスにx64dbgをアタッチします。
  • ExecuteDebuggerCommandはx64dbgのコマンドを直接実行します。
  • ListCommandsByCategoryはMCPクライアントによる利用可能なツールの検出に役立ちます。
  • GetThreads、SwitchThread、SuspendThread、ResumeThreadはスレッドコンテキストを管理します。
  • GetMemoryMapとGetDumpableRegionsは、メモリの読み取りやダンプの前にメモリ領域を特定します。
  • DumpMemoryは選択したメモリ範囲を保存し、DumpModuleはモジュール全体を保存します。
  • StopDebugは現在のセッションを終了し、RestartDebugはセッションを再起動します。

まとめ

x64dbg-MCP Serverは、外部ランタイムを必要とせずに、x64dbgのネイティブデバッグ機能をMCP互換のAIアシスタントに接続します。正しいx32およびx64プラグインをインストールし、生成されたBearerトークンをコピーして、HTTPまたはSSEエンドポイントを設定すれば、自然言語のリクエストを通じて完全なデバッグワークフローを実行できます。

まずはローカル専用のバインドアドレスと、読み取り専用の簡単な調査タスクから始めてください。その後、イベントを意識したステップ実行、条件付きブレークポイント、トレース、PE解析、慎重に制御されたメモリ変更へと進みます。サーバーは必ず許可された対象に対して使用し、暗号化されていないHTTPインターフェースを信頼できないネットワークに公開しないでください。