
自動バイナリ差分のためのMCPサーバー。
Diaphora MCP は、自動バイナリ差分解析のための MCP (Model Context Protocol) サーバーです。Diaphora (差分解析エンジン) と IDA Pro (逆アセンブラ) を MCP プロトコルで接続し、AI エージェント (Claude Code など) がバイナリファイルの比較、セキュリティパッチの検出、変更の分析を実行できるようにします。
.i64 / .idb データベースを Diaphora SQLite 形式に変換 (idat.exe ヘッドレスモード経由)idat.exe)git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
パッケージは標準インストール場所にある IDA Pro と Diaphora を自動検出 しようとします。見つからない場合は、以下の環境変数を設定できます。
| 変数 | 説明 | 例 |
|---|---|---|
IDAT_PATH | idat.exe へのフルパス | C:\Program Files\IDA Pro 9.3\idat.exe |
DIAPHORA_DIR | diaphora.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 時間) に設定してください。
Codex は通常、2 つの相補的な MCP サーバーを使用します。
diaphora-mcp — このプロジェクト: エクスポート、Diaphora 差分、結果分析ida-pro-mcp — 上流の IDA インスペクションサーバー (idb_open、逆コンパイル、アドレスレベルの分析用)idalib-mcp は ida-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
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/ # 自動エクスポートログ (動的に作成)
| ツール | 説明 |
|---|---|
export_idb_to_diaphora | IDA ヘッドレスを使用して .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 | 一括転送用に名前、コメント、プロトタイプを準備 |
このプロジェクトには、実行中の GUI IDA Pro セッションとの統合機能が組み込まれており、データベースロックの競合なしにアクティブな IDA ウィンドウから直接エクスポートを即座に行えます。
plugins/ ディレクトリにコピーします。IDA が起動するたびに、バックグラウンドでポート 28652 の XML-RPC サーバーが起動します。export_idb_to_diaphora を呼び出すと、MCP サーバーはポート 28652 を確認します。セッションがアクティブな場合は、GUI で直接エクスポートを実行します。そうでない場合は、自動的に idat.exe によるヘッドレスバックグラウンド実行にフォールバックします。ブリッジの設定方法の詳細については、GUI_INSTRUCTIONS.md をご覧ください。
非常に大規模なプロジェクトを処理する場合、Diaphora MCP は特定の最適化を適用します。
100000 (sys.setrecursionlimit) に引き上げられます。diaphora_config.py で COMMIT_AFTER_EACH_GUI_UPDATE = False を設定すると、ディスク書き込みが減り、GUI エクスポートが 2 ~ 3 倍高速化します。EXPORTING_USE_MICROCODE = False in Diaphora config) 。analyze_diff_results、compare_functions、find_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 コーディングアシスタント (Claude Code など) は、以下の互換性ルールに留意してください。
GUI エクスポートスキーマ vs ヘッドレスエクスポートスキーマ:
ida_mcp.py プラグイン) を介したエクスポートでは、calls、strings、structures などのテーブルを含むカスタムスキーマが生成されますが、program テーブルは含まれません。idat.exe 経由) では、program テーブルを含む公式の Diaphora スキーマが生成されます。diff_diaphora_dbs) は公式スキーマを必要とします。データベースを比較/差分する場合は、常にヘッドレスでエクスポートしてください。GUI でのロックされたデータベース:
データベース名の衝突を避ける:
<basename>.diaphora.sqlite になります。<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