
diaphora-mcp v1.0.5
自動バイナリ差分のための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_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 時間) に設定してください。
3.1. Codex とヘッドレス IDA MCP
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
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_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 | 一括転送用に名前、コメント、プロトタイプを準備 |
IDA Pro GUI 統合 (XML-RPC ブリッジ)
このプロジェクトには、実行中の GUI IDA Pro セッションとの統合機能が組み込まれており、データベースロックの競合なしにアクティブな IDA ウィンドウから直接エクスポートを即座に行えます。
- 自動起動: diaphora_gui_listener.py を IDA Pro の
plugins/ディレクトリにコピーします。IDA が起動するたびに、バックグラウンドでポート28652の XML-RPC サーバーが起動します。 - スマートエクスポート:
export_idb_to_diaphoraを呼び出すと、MCP サーバーはポート28652を確認します。セッションがアクティブな場合は、GUI で直接エクスポートを実行します。そうでない場合は、自動的にidat.exeによるヘッドレスバックグラウンド実行にフォールバックします。
ブリッジの設定方法の詳細については、GUI_INSTRUCTIONS.md をご覧ください。
巨大なデータベースの処理 (10 万以上の関数)
非常に大規模なプロジェクトを処理する場合、Diaphora MCP は特定の最適化を適用します。
- 再帰制限: 大規模なコールグラフ探索中のクラッシュを防ぐため、Python の再帰制限は自動的に
100000(sys.setrecursionlimit) に引き上げられます。 - SQLite トランザクション最適化:
diaphora_config.pyでCOMMIT_AFTER_EACH_GUI_UPDATE = Falseを設定すると、ディスク書き込みが減り、GUI エクスポートが 2 ~ 3 倍高速化します。 - Hex-Rays マイクロコード: デコンパイラが必須でない場合、マイクロコードのエクスポートを無効にします (
EXPORTING_USE_MICROCODE = Falsein Diaphora config) 。
IDA Pro MCP 統合
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 の動作を確認するには、以下の例をご覧ください。
- 基本セッショントランスクリプト: エクスポートから関数比較まで、すべてのツール呼び出しの正確な JSON 入出力を含む実際の MCP セッションのウォークスルー。ロシア語版 もあります。
AI エージェントガイドライン (重要)
このプロトコルを使用する AI コーディングアシスタント (Claude Code など) は、以下の互換性ルールに留意してください。
-
GUI エクスポートスキーマ vs ヘッドレスエクスポートスキーマ:
- アクティブな GUI セッション (
ida_mcp.pyプラグイン) を介したエクスポートでは、calls、strings、structuresなどのテーブルを含むカスタムスキーマが生成されますが、programテーブルは含まれません。 - ヘッドレスエクスポート (
idat.exe経由) では、programテーブルを含む公式の Diaphora スキーマが生成されます。 - 重要: 差分エンジン (
diff_diaphora_dbs) は公式スキーマを必要とします。データベースを比較/差分する場合は、常にヘッドレスでエクスポートしてください。
- アクティブな GUI セッション (
-
GUI でのロックされたデータベース:
- GUI IDA Pro で現在開かれているデータベースはロックされています。ヘッドレスでエクスポートしようとすると失敗します。
- 現在開いているデータベースを差分する必要がある場合は、ユーザーに GUI でデータベースを閉じてもらうか (またはダミーデータベースを開く)、ファイルロックを解除してからヘッドレスエクスポートをトリガーしてください。
-
データベース名の衝突を避ける:
- Diaphora エクスポートデータベースはデフォルトで
<basename>.diaphora.sqliteになります。 - Diaphora エクスポートに
<basename>.sqliteを使用しないでください。これはida-pro-mcpスーパーバイザーによって作成される内部キャッシュデータベースと競合します。
- Diaphora エクスポートデータベースはデフォルトで
検証状況と制限事項
チェックされた IDA Pro 9.3 のフィクスチャは回帰テストスイートに合格しています: 16 passed, 1 xpassed。2 つの SQLite3 DLL の実際のステージングエクスポートと Diaphora 差分も検証されました。大規模な IDB や GUI で開かれている IDB には、引き続き空いている IDA ロック、有効な DIAPHORA_OUTPUT_ROOT、および十分に大きな MCP クライアントタイムアウトが必要です。
ライセンス
MIT