
diaphora-mcp v1.0.5
MCP server 用于自动化二进制差异比较。
Diaphora MCP
Diaphora MCP 是一个用于自动二进制差异分析的 MCP(模型上下文协议)服务器。它通过 MCP 协议连接 Diaphora(差异分析引擎)和 IDA Pro(反汇编器),使得 AI 代理(如 Claude Code)能够执行二进制文件比较、发现安全补丁并分析变更。
特性
- 导出:将分析后的
.i64/.idb数据库转换为 Diaphora SQLite 格式(通过idat.exe无头模式) - 差异分析:比较两个导出的数据库,按匹配类型和比率过滤结果
- 漏洞分析:使用关键词匹配和启发式方法搜索与安全相关的变更
- 补丁检测:自动检测新增的边界检查、空指针检查、错误处理和加密变更
- 排名:根据 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 通常使用两个互补的 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")
或者一步运行完整流程:
┃ 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/ # 自动导出日志(动态创建)
MCP 工具参考(21 个工具)
导出
| 工具 | 描述 |
|---|---|
export_idb_to_diaphora | 使用 IDA 无头模式将 .i64/.idb 数据库导出为 SQLite 格式 |
batch_export_and_diff | 完整流程:导出主库 → 导出次库 → 差异分析 → 摘要 |
差异分析
| 工具 | 描述 |
|---|---|
diff_diaphora_dbs | 对两个导出的 Diaphora SQLite 数据库进行差异分析 |
get_diff_results | 读取带过滤器的 .diaphora 差异文件 |
get_diff_summary | 返回匹配统计信息 |
分析
| 工具 | 描述 |
|---|---|
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 | 检索通用数据库元数据 |
安全
| 工具 | 描述 |
|---|---|
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 微码:当不严格要求反编译器时,禁用微码导出(在 Diaphora 配置中设置
EXPORTING_USE_MICROCODE = False),以加快导出速度。
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 的实际运行效果,请参阅以下示例:
AI 代理指南(重要)
如果您是使用此协议的人工智能编码助手(如 Claude Code),请牢记以下兼容性规则:
-
GUI 导出与无头导出的模式:
- 通过活动 GUI 会话(
ida_mcp.py插件)导出将生成一个自定义模式,其中包含calls、strings、structures等表,但没有program表。 - 无头导出(通过
idat.exe)将生成官方的 Diaphora 模式,其中包含program表。 - 关键:差异分析引擎(
diff_diaphora_dbs)需要官方模式。如果您打算比较/差异分析数据库,请始终使用无头导出。
- 通过活动 GUI 会话(
-
GUI 中锁定的数据库:
- 当前在 GUI IDA Pro 中打开的数据库处于锁定状态。尝试对其进行无头导出将失败。
- 如果您需要对当前打开的数据库进行差异分析,请要求用户在 GUI 中关闭它(或打开一个虚拟数据库)以释放文件锁,然后触发无头导出。
-
避免数据库名称冲突:
- Diaphora 导出数据库默认命名为
<basename>.diaphora.sqlite。 - 切勿将
<basename>.sqlite用于 Diaphora 导出,因为这会与ida-pro-mcp监控程序创建的内部缓存数据库发生冲突。
- Diaphora 导出数据库默认命名为
验证状态与限制
经过检查的 IDA Pro 9.3 固定装置通过了回归测试套件:16 passed, 1 xpassed。还验证了对两个 SQLite3 DLL 的实际分阶段导出和 Diaphora 差异分析。对于大型或 GUI 打开的 IDB,仍需要空闲的 IDA 锁、有效的 DIAPHORA_OUTPUT_ROOT 以及足够大的 MCP 客户端超时设置。
许可证
MIT