xTeardx/diaphora-mcp
GitHub: xTeardx/diaphora-mcp
连接 Diaphora 与 IDA Pro 的 MCP 服务器,让 AI agent 自动执行二进制 diffing、安全补丁检测与变更分析。
Stars: 17 | Forks: 2
[阅读俄语版本](README.ru.md)
# Diaphora MCP
**Diaphora MCP** 是一个用于自动化 binary diffing 的 MCP (Model Context Protocol) 服务器。它通过 MCP 协议连接 [Diaphora](https://github.com/joxeankoret/diaphora)(diffing 引擎)和 IDA Pro(反汇编器),允许 AI agents(如 Claude Code)执行二进制文件比较、寻找安全补丁以及分析更改。
## 功能
- **导出**:将分析过的 `.i64` / `.idb` 数据库转换为 Diaphora SQLite 格式(通过 `idat.exe` headless 模式)
- **Diffing**:比较两个导出的数据库,按匹配类型和比率过滤结果
- **漏洞分析**:使用关键字匹配和启发式方法搜索与安全相关的更改
- **补丁检测**:自动检测新的边界检查、空检查、错误处理和加密更改
- **排名**:基于 CFG、复杂度跳变和安全指标,根据重要性对更改的函数进行排名
- **Call Graph**:比较调用路径(BFS,最多 N 层),并检测调用级联中的根本原因更改
- **元数据传输**:准备名称、注释和原型,以便在数据库之间传输
- **IDA Pro MCP 集成**:所有工具返回的地址和数据库路径均可直接传递给 IDA Pro MCP 工具
## 安装说明
### 1. 依赖项
- Python 3.10+
- [IDA Pro](https://hex-rays.com/IDA-pro/) 8.x / 9.x(用于通过 `idat.exe` 进行 headless 导出)
- 安装在 IDA 中的 [Diaphora](https://github.com/joxeankoret/diaphora) 插件
- [Claude Code](https://claude.ai/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_PYTHON` | 用于 diff 的 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
}
}
}
```
### 4. 准备进行 Diffing 的数据库
IDA Pro 必须首先分析二进制文件(创建 `.i64` 或 `.idb` 文件)。之后:
```
┃ export_idb_to_diaphora(idb_path="old_version.i64")
┃ export_idb_to_diaphora(idb_path="new_version.i64")
```
或者在一个命令中运行整个 pipeline:
```
┃ batch_export_and_diff(idb1="old.i64", idb2="new.i64")
```
## 快速开始
```
┃ # 1. Full pipeline: export two .i64 → diff → summary report
┃ batch_export_and_diff(idb1="v1.0.i64", idb2="v1.1.i64")
┃ # 2. If databases are already exported
┃ diff_diaphora_dbs(db1="v1.0.sqlite", db2="v1.1.sqlite")
┃ # 3. Security analysis of diff results
┃ analyze_diff_results(results_path="v1.0_vs_v1.1.diaphora")
┃ # 4. Importance ranking of changes
┃ rank_changes(results_path="v1.0_vs_v1.1.diaphora", top_n=20)
┃ # 5. Find root-cause changes
┃ find_patch_root(results_path="v1.0_vs_v1.1.diaphora")
┃ # 6. Detect probable security patches
┃ detect_security_patches(results_path="v1.0_vs_v1.1.diaphora")
┃ # 7. Generate full report
┃ summarize_patch(results_path="v1.0_vs_v1.1.diaphora")
```
## 示例(实时会话记录)
请参阅 **[examples/basic-session.md](examples/basic-session.md)**,获取一个完整的 Diaphora MCP 实际会话的分步记录——从导出两个 IDB 数据库到比较单个函数。还提供 [俄语](examples/basic-session.ru.md) 版本。
以下是服务器返回内容的预览:
**输入——比较两个 SQLite3 DLL(2015 对 2023):**
```
{"idb1_path": "old.i64", "idb2_path": "new.i64", "use_decompiler": false}
```
**输出——导出 + diff 后的摘要:**
```
{
"best_matches": 60,
"partial_matches": 993,
"multimatches": 52,
"unmatched_primary": 2647
}
```
该会话演示了 6 次 MCP 工具调用,展示了每一步的确切 JSON 输入/输出,并附带了 agent 的推理过程。
### 调查单个数据库
```
┃ # Get database export info
┃ get_export_info(db_path="app.sqlite")
┃ # Search for functions
┃ search_export_db(db_path="app.sqlite", name_pattern="%crypt%", min_instructions=50)
┃ # Retrieve pseudocode
┃ get_function_pseudocode(db_path="app.sqlite", address="401000")
```
## 项目结构
```
diaphora-mcp/
├── diaphora_mcp_server.py # Main entrypoint
├── diaphora_mcp/
│ ├── diaphora_mcp_server.py # MCP tool registration
│ ├── config.py # Path configuration and auto-detection
│ ├── models.py # Constants and models
│ ├── core/
│ │ ├── export.py # Headless export, batch pipeline
│ │ ├── diff.py # Diffing and .diaphora results reader
│ │ ├── analysis.py # Function search, compare, explain
│ │ ├── security.py # Keyword matching, patch detection
│ │ ├── ranking.py # Importance ranking
│ │ ├── graph.py # Callgraph, BFS call trees, root cause
│ │ ├── metadata.py # Metadata preparation (names, comments)
│ │ └── report.py # Overall patch report generation
│ └── utils/
│ ├── sqlite.py # SQLite helpers
│ ├── format.py # Pseudocode diff, feature vector extraction
│ └── log.py # Export logging utilities
├── _diaphora_headless.py # idat.exe -S thin wrapper
└── logs/ # Automated export logs (created dynamically)
```
## MCP 工具参考(20 个工具)
### 导出
| 工具 | 描述 |
|------|-------------|
| `export_idb_to_diaphora` | 使用 IDA headless 将 `.i64`/`.idb` 数据库导出为 SQLite 格式 |
| `batch_export_and_diff` | 完整 pipeline:导出主数据库 → 导出次数据库 → diff → 摘要 |
### Diff
| 工具 | 描述 |
|------|-------------|
| `diff_diaphora_dbs` | 对两个导出的 Diaphora SQLite 数据库进行 diff |
| `get_diff_results` | 读取带有过滤功能的 `.diaphora` diff 文件 |
| `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 分) |
### Callgraph
| 工具 | 描述 |
|------|-------------|
| `get_changed_callgraph` | 比较函数的传入和传出调用 |
| `compare_call_path` | 从某个函数遍历 callgraph(BFS 调用路径比较,最多 N 层) |
| `find_patch_root` | 检测导致调用级联的根本原因函数 |
### 元数据
| 工具 | 描述 |
|------|-------------|
| `transfer_metadata` | 准备名称、注释和原型以便批量传输 |
## IDA Pro GUI 集成(XML-RPC 桥接)
该项目内置了与正在运行的 GUI IDA Pro 会话的集成,能够直接从活动的 IDA 窗口进行即时导出,而不会产生数据库锁定冲突。
1. **自动启动**:将 [diaphora_gui_listener.py](diaphora_gui_listener.py) 复制到您的 IDA Pro `plugins/` 目录。每当 IDA 启动时,它都会在端口 `28652` 上启动一个后台 XML-RPC 服务器。
2. **智能导出**:当调用 `export_idb_to_diaphora` 时,MCP 服务器会检查端口 `28652`。如果有活动的会话,它会直接在 GUI 中运行导出。否则,它会自动回退到通过 `idat.exe` 进行 headless 后台执行。
有关配置桥接的详细说明,请参阅 [GUI_INSTRUCTIONS.md](GUI_INSTRUCTIONS.md)。
## 处理超大型数据库(10万+ 函数)
在处理极其庞大的项目时,Diaphora MCP 会应用特定的优化:
- **递归限制**:Python 递归限制会自动提升至 `100000`(`sys.setrecursionlimit`),以防止在大型 callgraph 遍历期间发生崩溃。
- **SQLite 事务优化**:在您的 `diaphora_config.py` 中,设置 `COMMIT_AFTER_EACH_GUI_UPDATE = False` 可以减少磁盘写入,从而将 GUI 导出速度提高 2 到 3 倍。
- **Hex-Rays Microcode**:当不严格要求使用反编译器时,禁用微代码导出(在 Diaphora 配置中设置 `EXPORTING_USE_MICROCODE = False`)可获得更快的导出速度。
## IDA Pro MCP 集成
像 `analyze_diff_results`、`compare_functions` 和 `find_function_match` 这样的工具会返回一个包含地址和路径的 `ida_pro_mcp` 块。此信息可以直接传递给 `ida-pro-mcp` 工具:
```
┃ # 1. Diaphora finds a suspicious function
┃ analyze_diff_results(results_path="diff.diaphora")
┃ → addr1="401000", db1="old.sqlite"
┃ # 2. IDA Pro MCP decompiles it
┃ decompile_function(address="401000")
```
## 示例
要查看 Diaphora MCP 的实际运行情况,请查看以下示例:
- [基本会话记录](examples/basic-session.md):一个实际的 MCP 会话演练,包含了每次工具调用确切的 JSON 输入/输出——从导出到函数比较。还提供 [俄语](examples/basic-session.ru.md) 版本。
## AI Agent 指南(重要)
如果您是使用此协议的 AI 编码助手(如 Claude Code),请牢记以下兼容性规则:
1. **GUI 与 Headless 导出 Schema**:
- 通过活动的 GUI 会话(`ida_mcp.py` 插件)导出会生成一个自定义 schema,其中包含 `calls`、`strings`、`structures` 等表,但**没有 `program` 表**。
- Headless 导出(通过 `idat.exe`)会生成包含 `program` 表的官方 Diaphora schema。
- **关键**:diff 引擎(`diff_diaphora_dbs`)需要官方 schema。**如果您打算比较/diff 数据库,请务必使用 headless 导出**。
2. **GUI 中锁定的数据库**:
- 当前在 GUI IDA Pro 中打开的数据库是被锁定的。尝试对其进行 headless 导出将会失败。
- 如果您需要对当前打开的数据库进行 diff,请要求用户在 GUI 中将其关闭(或打开一个虚拟数据库)以释放文件锁定,然后再触发 headless 导出。
3. **避免数据库名称冲突**:
- Diaphora 导出的数据库默认为 `.diaphora.sqlite`。
- 切勿将 `.sqlite` 用于 Diaphora 导出,因为这会与 `ida-pro-mcp` 监督程序创建的内部缓存数据库发生冲突。
## 许可证
MIT
标签:IDA Pro, MCP, 二进制比对, 云资产清单, 漏洞分析, 网络调试, 自动化, 路径探测, 逆向工具, 逆向工程