
自動バイナリ差分のためのMCPサーバー。
AIアシスタントから、IDAで解析済みの2つのバイナリを比較します。Diaphora MCPは保存されたIDAデータベースをエクスポートし、Diaphoraを実行して、AIが対応する関数とそのコールグラフを調査できるようにします。
デフォルトのインターフェースには、比較に焦点を当てた10個のツールがあります。Diaphoraがマッチを提供し、AIが実際のコードを読み取って変更を説明します。
クイックスタート · 例 · ツール · トラブルシューティング
old.i64 + new.i64 → headless export → SQLite exports + diff results
↓
summary → matched code → call graph
idat.exe/idat64を備えたIDA Pro、およびインストール済みのDiaphoraプラグイン。.i64/.idbデータベースとして保存されていること。IDAとDiaphoraは別々にインストールします。diffスキーマの検証は現在Diaphora 3.4.1を対象としています。他のスキーマでは互換性の更新が必要になる場合があります。diffに使用するPythonインタプリタには、Diaphoraのスタンドアロン依存関係がインストールされている必要があります。
git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .
New-Item -ItemType Directory -Force C:\diaphora-outputs | Out-Null
クライアントのMCP設定にこのエントリを追加します。リポジトリ、IDA、Diaphoraのパスは、ご自身のインストールパスに置き換えてください。このプロジェクトをインストールした環境のPython実行ファイルを使用してください。
{
"mcpServers": {
"diaphora": {
"command": "C:/src/diaphora-mcp/.venv/Scripts/python.exe",
"args": ["C:/src/diaphora-mcp/diaphora_mcp_server.py"],
"env": {
"IDAT_PATH": "C:/Program Files/IDA Professional 9.3/idat.exe",
"DIAPHORA_DIR": "C:/Program Files/IDA Professional 9.3/plugins/diaphora",
"DIAPHORA_OUTPUT_ROOT": "C:/diaphora-outputs"
}
}
}
}
クライアントはstdio経由でサーバーを起動します。別途起動するWebサービスはありません。コードや環境を変更した後は、MCPサーバーを再起動してください。接続に成功すると、以下に示す10個のツールが利用可能になります。
Use Diaphora to compare C:/analysis/old.i64 (old) against
C:/analysis/new.i64 (new). Save output under C:/diaphora-outputs/run-001.
Export headlessly with assembly detail, keep the exports, show a summary,
then inspect partial matches and explain the code changes in the interesting
functions. Use the result mapping when comparing functions and call graphs.
毎回新しい実行ディレクトリを選択してください。既存の生成済みターゲットが上書きされることはありません。
以下のJSONブロックはMCPツールの引数であり、シェルコマンドではありません。アシスタントは指定されたツールを直接呼び出すことができます。パスと0x401000は例です。ご自身の実行で返されたパスとアドレスを使用してください。
ツール: batch_export_and_diff。oldが常に最初の入力、newが2番目です。
{
"idb1_path": "C:/analysis/old.i64",
"idb2_path": "C:/analysis/new.i64",
"output_dir": "C:/diaphora-outputs/run-001",
"export_mode": "headless",
"use_decompiler": false,
"summaries_only": false,
"cleanup": false,
"limit": 100,
"unmatched_limit": 50
}
これにより、Hex-Raysを必要とせずにアセンブリの詳細が保持されます。必要なエクスポートプロファイルを選択してください:
| 詳細 | use_decompiler | summaries_only | 用途 |
|---|---|---|---|
| マッチングサマリー | false | true | 高速な初回パス。詳細なコードなし |
| アセンブリ | false | false | デコンパイラなしで逆アセンブリを比較 |
| アセンブリ + 疑似コード | true | false | 互換性のあるHex-Raysデコンパイラでのコードレビュー。低速 |
出力パスは常にレスポンスから取得してください:
OLD_SQLITE = steps.export1.output
NEW_SQLITE = steps.export2.output
RESULTS = steps.diff.output
この例では、生成されるファイルはrun-001配下のold.diaphora.sqlite、new.diaphora.sqlite、old_vs_new.diaphoraです。入力のベース名が同じ場合、old_/new_という異なるエクスポート名が生成されます。後で関数を調査するためにcleanup=falseのままにしてください。
ツール: get_diff_summary。
{
"results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora"
}
ツール: get_diff_results。このページは比率の低い部分マッチから始まります。
{
"results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora",
"match_type": "partial",
"min_ratio": 0.0,
"limit": 50,
"offset": 0,
"unmatched_limit": 50,
"unmatched_offset": 0,
"sort_by": "ratio",
"sort_order": "asc"
}
partialはDiaphoraのマッチカテゴリを選択するものであり、動作変更を保証するものではありません。サポートされているすべてのカテゴリにはmatch_type="all"を使用してください。レスポンスには、カテゴリ別の件数、フィルタ後の合計、マッチ、未マッチ行、next_offset、next_unmatched_offsetが含まれます。
続行するには、返された次のオフセットを次の呼び出しにコピーし、同じフィルタとソートを維持します。たとえば、それらが50と50の場合、offset=50とunmatched_offset=50を使用します。次のオフセットがnullの場合は、そのリストが終了したことを意味するため、それ以上進めないでください。2つのリストは独立して進みます。ページサイズは正の値である必要があり、上限は5000です。最も強いマッチを先に調査するにはsort_order="desc"を使用してください。
ツール: compare_functions。
{
"db1_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"db2_path": "C:/diaphora-outputs/run-001/new.diaphora.sqlite",
"address": "0x401000",
"match_results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora"
}
レスポンスには、function_old、function_new、利用可能なアセンブリ/疑似コード、測定された差分、同一性の証拠が含まれます。addressの代わりにnameを使用できます。両方のセレクタが指定された場合、addressが優先されます。名前で選択する場合はaddressを省略してください。
ツール: **get_changed_callgraph**は上記と同じ引数を受け付けます。変更を報告する前に対応する呼び出し元/呼び出し先のアドレスを変換し、未解決の隣接ノードと確認済みのエッジ差分を分離します。
16進数入力を明確にするために、0xプレフィックス付きのアドレスを推奨します。利用可能な場合はmatch_results_pathを指定してください。これはリベースと名前変更された関数を処理します。アドレスが同じだけでは同一性を確立できません。曖昧または欠落したマッチは、削除と見なされるのではなく未解決のままになります。ペアを手動で検証した場合は、address2またはname2を明示的に指定できます。
ツール: search_export_db。name_patternはSQL LIKEを使用します。%は任意のシーケンスにマッチします。
{
"db_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"name_pattern": "%parse%",
"min_instructions": 20,
"limit": 20
}
ツール: get_function_pseudocodeは、その名前にもかかわらず、利用可能な疑似コードおよびアセンブリを返します。
{
"db_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"address": "0x401000"
}
疑似コードが空の場合は、互換性のあるデコンパイラを使用して、use_decompiler=trueとsummaries_only=falseで新しい実行ディレクトリにエクスポートを再実行してください。エクスポートのメタデータを調査するには、db_pathを指定してget_export_infoを使用してください。
ツール: diff_diaphora_dbs。これはIDAエクスポートをスキップし、既存の公式SQLiteエクスポートを比較します。
{
"db1_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"db2_path": "C:/diaphora-outputs/run-001/new.diaphora.sqlite",
"output_path": "C:/diaphora-outputs/another-diff.diaphora"
}
1つの新しいエクスポートには、idb_path、新しいoutput_path、export_mode="headless"を指定してexport_idb_to_diaphoraを使用してください。
| ツール | 目的 |
|---|---|
export_idb_to_diaphora | 保存された1つのIDAデータベースをエクスポート |
batch_export_and_diff | 両方のデータベースをエクスポートして比較 |
diff_diaphora_dbs | 既存のエクスポートを比較 |
get_diff_summary | マッチ統計と範囲を限定した例 |
get_diff_results | フィルタ、ソート、ページングされた結果 |
get_export_info | エクスポートのメタデータと件数 |
search_export_db | 関数の検索 |
get_function_pseudocode | アセンブリ/疑似コードの読み取り |
compare_functions | 解決されたold/newペアの比較 |
get_changed_callgraph | マッピングされた呼び出し元/呼び出し先の比較 |
正確なシグネチャはMCPのtools/listで確認できます。ツールリファレンスを参照してください。
| モード | 動作 |
|---|---|
headless | IDAをヘッドレスで起動し、diffスキーマを検証。比較に推奨 |
auto | アクティブなGUIブリッジを試し、次にヘッドレスにフォールバック |
gui | 正しい開いているGUIセッションを要求。ヘッドレスへのフォールバックなし |
batch_export_and_diffにはheadlessが必要です。
| 環境変数 | 意味 |
|---|---|
IDAT_PATH | IDAヘッドレス実行ファイルへの絶対パス |
DIAPHORA_DIR | Diaphoraスクリプトを含むディレクトリ |
DIAPHORA_OUTPUT_ROOT | 新しいエクスポートとdiff結果のための既存の許可されたルート |
DIAPHORA_PYTHON | オプションのdiffインタプリタ。デフォルトはMCPサーバーのインタプリタ |
DIAPHORA_ENABLE_LEGACY_TOOLS | 正確に1で以前の21ツールインターフェースを有効化 |
レガシーマッチング、特徴スコア、セキュリティトリアージ、レポート、メタデータ、診断はオプトインのままです。有効にするには、設定のenvオブジェクトに以下のエントリを追加して再起動してください:
{
"DIAPHORA_ENABLE_LEGACY_TOOLS": "1"
}
これらのツールはヒューリスティックを使用します。そのスコアは、意味的な等価性、セキュリティ修正、因果関係を証明するものではありません。設定 · GUIセットアップ。