
MCP сервер для автоматизированного бинарного диффинга.
Diaphora MCP — это MCP-сервер для автоматизированного бинарного диффинга. Он соединяет Diaphora (движок диффинга) и IDA Pro (дизассемблер) через протокол MCP, позволяя ИИ-агентам (Claude Code, etc.) выполнять сравнение бинарных файлов, находить security-патчи и анализировать изменения.
git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
Пакет пытается автоматически найти IDA и 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 для diff | /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 часа).
В Codex обычно регистрируются два разных сервера:
diaphora-mcp — этот проект: экспорт, Diaphora diff и анализ результатов;ida-pro-mcp — upstream-сервер IDA для idb_open, декомпиляции и инспекции адресов.idalib-mcp — headless backend внутри ida-pro-mcp, а не отдельный Diaphora tool.
После установки upstream-пакета перезапустите 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 должна проанализировать сравниваемые бинарники (создать .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 напрямую в results tools: это IDA database, а не SQLite. Сначала выполните export.
Полный пошаговый разбор реальной сессии Diaphora MCP — examples/basic-session.ru.md.
Там показан процесс от экспорта двух .i64 до сравнения конкретных функций, с реальными JSON-запросами и ответами сервера на каждом шаге, а также комментариями агента.
Краткий тизер:
Вход: сравнение двух 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
}
┃ # 1. Полный пайплайн: экспорт двух .i64 → diff → отчёт
┃ 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. Security-анализ результатов
┃ 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. Детектирование security-патчей
┃ detect_security_patches(results_path="v1.0_vs_v1.1.diaphora")
┃ # 7. Полный отчёт
┃ summarize_patch(results_path="v1.0_vs_v1.1.diaphora")
┃ # Метаданные базы
┃ 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 # Headless-экспорт, batch pipeline
│ │ ├── diff.py # Диффинг и чтение .diaphora
│ │ ├── analysis.py # Поиск, сравнение, объяснение функций
│ │ ├── security.py # Keyword matching, детектирование патчей
│ │ ├── ranking.py # Ранжирование по важности
│ │ ├── graph.py # Call graph, BFS, root cause
│ │ ├── metadata.py # Перенос имён/типов/комментариев
│ │ └── report.py # Полный отчёт по патчу
│ └── utils/
│ ├── sqlite.py # DB helpers
│ ├── format.py # Pseudocode diff, feature extraction
│ └── log.py # Логирование экспортов
├── _diaphora_headless.py # Wrapper для idat.exe -S
└── logs/ # Логи экспортов (создаётся автоматически)
| Инструмент | Описание |
|---|---|
export_idb_to_diaphora | Экспорт .i64/.idb в .sqlite через idat.exe |
batch_export_and_diff | Полный пайплайн: экспорт → экспорт → diff → сводка |
| Инструмент | Описание |
|---|---|
diff_diaphora_dbs | Дифф двух экспортированных .sqlite баз |
get_diff_results | Чтение .diaphora файла с фильтрацией |
get_diff_summary | Сводка по diff |
| Инструмент | Описание |
|---|---|
analyze_diff_results | Security-фильтрация |
compare_functions | Side-by-side сравнение двух версий функции |
find_function_match | Поиск соответствия функции между версиями |
explain_similarity | Разбор факторов сходства |
detect_behavior_change | NL-описание изменения логики |
summarize_patch | Полный отчёт по обновлению |
search_export_db | Поиск функций по имени/размеру/сложности |
get_function_pseudocode | Псевдокод функции из базы |
get_export_info | Метаданные базы |