アップデート一覧に戻る
New releaseJul 21, 2026

diaphora-mcp v1.0.6

自動バイナリ差分のためのMCPサーバー。

共有

ロシア語で読む

Diaphora MCP

Diaphora MCP は、自動バイナリ差分解析のための MCP (Model Context Protocol) サーバーです。Diaphora (差分解析エンジン) と IDA Pro (逆アセンブラ) を MCP プロトコルで接続し、AI エージェント (Claude Code など) がバイナリファイルの比較、セキュリティパッチの検出、変更の分析を実行できるようにします。

特徴

  • エクスポート: 解析済みの .i64 / .idb データベースを Diaphora SQLite 形式に変換 (idat.exe ヘッドレスモード経由)
  • 差分解析: エクスポートされた 2 つのデータベースを比較し、マッチタイプと比率で結果をフィルタリング
  • 脆弱性分析: キーワードマッチングとヒューリスティックを使用してセキュリティに関連する変更を検索
  • パッチ検出: 新たな境界チェック、ヌルチェック、エラーハンドリング、暗号関連の変更を自動検出
  • ランキング: CFG、複雑性のジャンプ、セキュリティ指標に基づいて変更された関数を重要度順にランク付け
  • コールグラフ: コールパスを比較 (BFS、最大 N レベル)、コールカスケードにおける根本原因の変更を検出
  • メタデータ転送: データベース間での名前、コメント、プロトタイプの転送準備
  • IDA Pro MCP 統合: すべてのツールはアドレスとデータベースパスを返し、IDA Pro MCP ツールに直接渡せるようになっています

インストール

1. 依存関係

  • Python 3.10+
  • IDA Pro 8.x / 9.x (ヘッドレスエクスポート用の idat.exe)
  • IDA にインストールされた Diaphora プラグイン
  • Claude Code (またはその他の MCP 準拠クライアント)

2. パッケージのインストール

git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .

3. パス設定

パッケージは標準インストール場所にある IDA Pro と Diaphora を自動検出 しようとします。見つからない場合は、以下の環境変数を設定できます。

変数説明
IDAT_PATHidat.exe へのフルパスC:\Program Files\IDA Pro 9.3\idat.exe
DIAPHORA_DIRdiaphora.py を含むフォルダC:\Program Files\IDA Pro 9.3\plugins\diaphora-3.4.1
DIAPHORA_OUTPUT_ROOT新規エクスポートファイルに許可されるルートディレクトリD:\\diaphora-outputs
DIAPHORA_PYTHON差分解析用の Python インタプリタ/usr/bin/python3 (デフォルトは sys.executable)

Claude Code の場合、~/.claude.json (または MCP クライアントの対応する設定ファイル) で指定できます。

{
  "mcpServers": {
    "diaphora": {
      "command": "python",
      "args": ["path/to/repo/diaphora_mcp_server.py"],
      "env": {
        "IDAT_PATH": "C:\\Program Files\\IDA Pro 9.3\\idat.exe",
        "DIAPHORA_DIR": "C:\\Program Files\\IDA Pro 9.3\\plugins\\diaphora-3.4.1"
      },
      "timeout": 7200
    }
  }
}

注意: 非常に大きなバイナリ (>100 MB) の場合、timeout は最低でも 7200 (2 時間) に設定してください。

3.1. Codex とヘッドレス IDA MCP

Codex は通常、2 つの相補的な MCP サーバーを使用します。

  • diaphora-mcp — このプロジェクト: エクスポート、Diaphora 差分、結果分析
  • ida-pro-mcp — 上流の IDA インスペクションサーバー (idb_open、逆コンパイル、アドレスレベルの分析用)

idalib-mcpida-pro-mcp のヘッドレスバックエンドであり、独立した Diaphora サーバーではありません。インストール後、Codex を再起動します。

uv run ida-pro-mcp --install codex --transport streamable-http --scope global --ida-rpc http://127.0.0.1:8745/mcp

このプロジェクトでは、stdio 設定で十分です。

[mcp_servers.diaphora-mcp]
command = "python"
args = ["D:\\path\\to\\diaphora-mcp\\diaphora_mcp_server.py"]
startup_timeout_sec = 120

4. 差分解析用データベースの準備

IDA Pro が最初にバイナリを解析して (.i64 または .idb ファイルを作成) おく必要があります。その後:

┃ export_idb_to_diaphora(idb_path="old_version.i64")
┃ export_idb_to_diaphora(idb_path="new_version.i64")

または、1 つのコマンドで全パイプラインを実行します。

┃ batch_export_and_diff(idb1="old.i64", idb2="new.i64")

.i64 を結果ツールに直接渡さないでください。それは IDA データベースであり、SQLite ではありません。最初にエクスポートしてください。

クイックスタート

┃ # 1. 完全パイプライン: 2 つの .i64 をエクスポート → 差分 → サマリレポート
┃ batch_export_and_diff(idb1="v1.0.i64", idb2="v1.1.i64")
 
┃ # 2. データベースがすでにエクスポートされている場合
┃ diff_diaphora_dbs(db1="v1.0.sqlite", db2="v1.1.sqlite")
 
┃ # 3. 差分結果のセキュリティ分析
┃ analyze_diff_results(results_path="v1.0_vs_v1.1.diaphora")
 
┃ # 4. 変更の重要度ランキング
┃ rank_changes(results_path="v1.0_vs_v1.1.diaphora", top_n=20)
 
┃ # 5. 根本原因の変更を検出
┃ find_patch_root(results_path="v1.0_vs_v1.1.diaphora")
 
┃ # 6. 可能性のあるセキュリティパッチを検出
┃ detect_security_patches(results_path="v1.0_vs_v1.1.diaphora")
 
┃ # 7. 完全なレポートを生成
┃ summarize_patch(results_path="v1.0_vs_v1.1.diaphora")

例 (ライブセッションのトランスクリプト)

実際の Diaphora MCP セッションの完全なステップバイステップトランスクリプトは、examples/basic-session.md をご覧ください。2 つの IDB データベースのエクスポートから個々の関数の比較までを網羅しています。ロシア語版 もあります。

以下はサーバーが返す内容のプレビューです。

入力 — 2 つの SQLite3 DLL (2015 年 vs 2023 年) を比較:

{"idb1_path": "old.i64", "idb2_path": "new.i64", "use_decompiler": false}

出力 — エクスポート + 差分後のサマリ:

{
  "best_matches": 60,
  "partial_matches": 993,
  "multimatches": 52,
  "unmatched_primary": 2647
}

このセッションでは 6 つの MCP ツール呼び出しを順に説明し、各ステップの正確な JSON 入出力とエージェントの推論を併せて示しています。

単一データベースの調査

┃ # データベースのエクスポート情報を取得
┃ get_export_info(db_path="app.sqlite")
 
┃ # 関数を検索
┃ search_export_db(db_path="app.sqlite", name_pattern="%crypt%", min_instructions=50)
 
┃ # 疑似コードを取得
┃ get_function_pseudocode(db_path="app.sqlite", address="401000")

プロジェクト構造

diaphora-mcp/
├── diaphora_mcp_server.py          # メインエントリポイント
├── diaphora_mcp/
│   ├── diaphora_mcp_server.py      # MCP ツール登録
│   ├── config.py                   # パス設定と自動検出
│   ├── models.py                   # 定数とモデル
│   ├── core/
│   │   ├── export.py               # ヘッドレスエクスポート、バッチパイプライン
│   │   ├── diff.py                 # 差分解析と .diaphora 結果リーダー
│   │   ├── analysis.py             # 関数検索、比較、説明
│   │   ├── security.py             # キーワードマッチング、パッチ検出
│   │   ├── ranking.py              # 重要度ランキング
│   │   ├── graph.py                # コールグラフ、BFS コールツリー、根本原因
│   │   ├── metadata.py             # メタデータ準備 (名前、コメント)
│   │   └── report.py               # パッチレポート全体の生成
│   └── utils/
│       ├── sqlite.py               # SQLite ヘルパー
│       ├── format.py               # 疑似コード差分、特徴ベクトル抽出
│       └── log.py                  # エクスポートログユーティリティ
├── _diaphora_headless.py           # idat.exe -S 薄いラッパー
└── logs/                           # 自動エクスポートログ (動的に作成)

MCP ツールリファレンス (21 ツール)

エクスポート

ツール説明
export_idb_to_diaphoraIDA ヘッドレスを使用して .i64/.idb データベースを SQLite 形式にエクスポート
batch_export_and_diff完全パイプライン: プライマリをエクスポート → セカンダリをエクスポート → 差分 → サマリ

差分

ツール説明
diff_diaphora_dbsエクスポートされた 2 つの Diaphora SQLite データベースを差分
get_diff_resultsフィルタリング付きで .diaphora 差分ファイルを読み取り
get_diff_summaryマッチ統計を返す

分析

ツール説明
analyze_diff_resultsセキュリティキーワードとフィルターを使用して結果をスクリーニング
compare_functions両方のデータベースで関数を並べて比較
find_function_match信頼度メトリクスで 2 番目のバイナリ内の関数をマッチング
explain_similarity類似性要因 (ニーモニック、CFG、定数、プロトタイプ、ハッシュ) を分解
detect_behavior_change関数ロジックの変更に関する自然言語サマリを提供
summarize_patch包括的な更新レポートを作成
search_export_dbエクスポートされた関数を名前/命令数/複雑性でクエリ
get_function_pseudocode関数の疑似コードとメタデータを取得
get_export_info一般的なデータベースメタデータを取得

セキュリティ

ツール説明
detect_security_patches可能性のあるセキュリティ修正を検出 (境界チェック、メモリ安全性、アンチデバッグなど)

ランキング

ツール説明
rank_changes変更された関数を重要度でランク付け (0-100 スコア)

コールグラフ

ツール説明
get_changed_callgraph関数の着信コールと発信コールを比較
compare_call_path関数からコールグラフを探索 (BFS コールパス比較、最大 N レベル)
find_patch_rootコールカスケードの原因となる根本原因関数を検出

パフォーマンス

ツール説明
performance_report集約されたメモリ、キャッシュ、接続統計を返す

メタデータ

ツール説明
transfer_metadata一括転送用に名前、コメント、プロトタイプを準備

IDA Pro GUI 統合 (XML-RPC ブリッジ)

このプロジェクトには、実行中の GUI IDA Pro セッションとの統合機能が組み込まれており、データベースロックの競合なしにアクティブな IDA ウィンドウから直接エクスポートを即座に行えます。

  1. 自動起動: diaphora_gui_listener.py を IDA Pro の plugins/ ディレクトリにコピーします。IDA が起動するたびに、バックグラウンドでポート 28652 の XML-RPC サーバーが起動します。
  2. スマートエクスポート: export_idb_to_diaphora を呼び出すと、MCP サーバーはポート 28652 を確認します。セッションがアクティブな場合は、GUI で直接エクスポートを実行します。そうでない場合は、自動的に idat.exe によるヘッドレスバックグラウンド実行にフォールバックします。

ブリッジの設定方法の詳細については、GUI_INSTRUCTIONS.md をご覧ください。

巨大なデータベースの処理 (10 万以上の関数)

非常に大規模なプロジェクトを処理する場合、Diaphora MCP は特定の最適化を適用します。

  • 再帰制限: 大規模なコールグラフ探索中のクラッシュを防ぐため、Python の再帰制限は自動的に 100000 (sys.setrecursionlimit) に引き上げられます。
  • SQLite トランザクション最適化: diaphora_config.pyCOMMIT_AFTER_EACH_GUI_UPDATE = False を設定すると、ディスク書き込みが減り、GUI エクスポートが 2 ~ 3 倍高速化します。
  • Hex-Rays マイクロコード: デコンパイラが必須でない場合、マイクロコードのエクスポートを無効にします (EXPORTING_USE_MICROCODE = False in Diaphora config) 。

IDA Pro MCP 統合

analyze_diff_resultscompare_functionsfind_function_match などのツールは、アドレスとパスを含む ida_pro_mcp ブロックを返します。この情報は直接 ida-pro-mcp ツールに渡すことができます。

┃ # 1. Diaphora が不審な関数を発見
┃ analyze_diff_results(results_path="diff.diaphora")
┃   → addr1="401000", db1="old.sqlite"
 
┃ # 2. IDA Pro MCP がそれを逆コンパイル
┃ decompile_function(address="401000")

Diaphora MCP の動作を確認するには、以下の例をご覧ください。

AI エージェントガイドライン (重要)

このプロトコルを使用する AI コーディングアシスタント (Claude Code など) は、以下の互換性ルールに留意してください。

  1. GUI エクスポートスキーマ vs ヘッドレスエクスポートスキーマ:

    • アクティブな GUI セッション (ida_mcp.py プラグイン) を介したエクスポートでは、callsstringsstructures などのテーブルを含むカスタムスキーマが生成されますが、program テーブルは含まれません
    • ヘッドレスエクスポート (idat.exe 経由) では、program テーブルを含む公式の Diaphora スキーマが生成されます。
    • 重要: 差分エンジン (diff_diaphora_dbs) は公式スキーマを必要とします。データベースを比較/差分する場合は、常にヘッドレスでエクスポートしてください
  2. GUI でのロックされたデータベース:

    • GUI IDA Pro で現在開かれているデータベースはロックされています。ヘッドレスでエクスポートしようとすると失敗します。
    • 現在開いているデータベースを差分する必要がある場合は、ユーザーに GUI でデータベースを閉じてもらうか (またはダミーデータベースを開く)、ファイルロックを解除してからヘッドレスエクスポートをトリガーしてください。
  3. データベース名の衝突を避ける:

    • Diaphora エクスポートデータベースはデフォルトで <basename>.diaphora.sqlite になります。
    • Diaphora エクスポートに <basename>.sqlite を使用しないでください。これは ida-pro-mcp スーパーバイザーによって作成される内部キャッシュデータベースと競合します。

検証状況と制限事項

チェックされた IDA Pro 9.3 のフィクスチャは回帰テストスイートに合格しています: 16 passed, 1 xpassed。2 つの SQLite3 DLL の実際のステージングエクスポートと Diaphora 差分も検証されました。大規模な IDB や GUI で開かれている IDB には、引き続き空いている IDA ロック、有効な DIAPHORA_OUTPUT_ROOT、および十分に大きな MCP クライアントタイムアウトが必要です。

ライセンス

MIT

カテゴリ