Diaphora MCP 是一个用于自动二进制差异分析的 MCP(模型上下文协议)服务器。它通过 MCP 协议连接 Diaphora(差异分析引擎)和 IDA Pro(反汇编器),使得 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。如果未找到,您可以设置以下环境变量:
对于 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 通常使用两个互补的 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")
或者一步运行完整流程:
┃ batch_export_and_diff(idb1="old.i64", idb2="new.i64")
不要将 .i64 直接传递给结果工具:它是 IDA 数据库,不是 SQLite。请先将其导出。
┃ # 1. 完整流程:导出两个 .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")
请参阅 examples/basic-session.md 以获取完整的逐步会话记录——从导出两个 IDB 数据库到比较单个函数。另有俄文版。
以下是服务器返回内容的预览:
输入 — 比较两个 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 | 对两个导出的 Diaphora SQLite 数据库进行差异分析 |
get_diff_results | 读取带过滤器的 .diaphora 差异文件 |
get_diff_summary | 返回匹配统计信息 |
| 工具 | 描述 |
|---|---|
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),以加快导出速度。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 的实际运行效果,请参阅以下示例:
如果您是使用此协议的人工智能编码助手(如 Claude Code),请牢记以下兼容性规则:
GUI 导出与无头导出的模式:
ida_mcp.py 插件)导出将生成一个自定义模式,其中包含 calls、strings、structures 等表,但没有 program 表。idat.exe)将生成官方的 Diaphora 模式,其中包含 program 表。diff_diaphora_dbs)需要官方模式。如果您打算比较/差异分析数据库,请始终使用无头导出。GUI 中锁定的数据库:
避免数据库名称冲突:
<basename>.diaphora.sqlite。<basename>.sqlite 用于 Diaphora 导出,因为这会与 ida-pro-mcp 监控程序创建的内部缓存数据库发生冲突。经过检查的 IDA Pro 9.3 固定装置通过了回归测试套件:16 passed, 1 xpassed。还验证了对两个 SQLite3 DLL 的实际分阶段导出和 Diaphora 差异分析。对于大型或 GUI 打开的 IDB,仍需要空闲的 IDA 锁、有效的 DIAPHORA_OUTPUT_ROOT 以及足够大的 MCP 客户端超时设置。
MIT
| 变量 | 描述 | 示例 |
|---|
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) |
| 工具 | 描述 |
|---|
analyze_diff_results | 使用安全关键词和过滤器筛选结果 |
compare_functions | 在两个数据库中对函数进行并排比较 |
find_function_match | 在第二个二进制文件中匹配函数,附带置信度指标 |
explain_similarity | 分解相似性因素(助记符、CFG、常量、原型、哈希) |
detect_behavior_change | 提供函数逻辑变化的自然语言摘要 |
summarize_patch | 生成全面的更新报告 |
search_export_db | 按名称/指令/复杂度查询导出的函数 |
get_function_pseudocode | 获取函数的伪代码和元数据 |
get_export_info | 检索通用数据库元数据 |