
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 в стандартных местах установки. Если не находит — можно указать переменные окружения:
В 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 |
| Инструмент | Описание |
|---|---|
detect_security_patches | Детектирование вероятных исправлений безопасности |
| Инструмент | Описание |
|---|---|
rank_changes | Ранжирование изменённых функций по важности |
| Инструмент | Описание |
|---|---|
get_changed_callgraph | Сравнение входящих/исходящих вызовов |
compare_call_path | Сравнение цепочек вызовов (BFS, N уровней) |
find_patch_root | Определение корневых функций |
| Инструмент | Описание |
|---|---|
performance_report | Агрегированный отчёт по памяти, кэшу и соединениям |
| Инструмент | Описание |
|---|---|
transfer_metadata | Подготовка данных для переноса имён/комментариев |
Проект включает в себя встроенную интеграцию с запущенной сессией GUI IDA Pro, что позволяет делать экспорт баз данных мгновенно прямо в открытом окне без конфликтов блокировки файлов.
plugins/ вашей IDA Pro. Он будет автоматически поднимать XML-RPC сервер на порту 28652 при запуске IDA.export_idb_to_diaphora MCP-сервер сначала проверит порт 28652. Если сессия активна, он сделает экспорт прямо в GUI без открытия сторонних фоновых процессов. В противном случае он автоматически откатится к фоновому headless-режиму (idat.exe).Подробные инструкции по настройке и запуску моста см. в GUI_INSTRUCTIONS.ru.md.
При работе с очень большими проектами (например, с 150k+ функциями) Diaphora MCP включает специальные оптимизации:
100000 (sys.setrecursionlimit), что предотвращает краш maximum recursion depth exceeded на больших графах вызовов.diaphora_config.py рекомендуется установить COMMIT_AFTER_EACH_GUI_UPDATE = False. Это отключает частые дисковые коммиты при обновлении GUI, ускоряя экспорт в 2-3 раза.EXPORTING_USE_MICROCODE = False в конфиге Diaphora).Инструменты 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 и Headless экспорта:
ida_mcp.py) создает упрощенную схему с таблицами calls, strings, structures, но без таблицы program.idat.exe) создает официальную схему Diaphora с таблицей program.diff_diaphora_dbs) требует официальную схему. Всегда выполняйте headless-экспорт, если планируете сравнивать/диффить базы данных.Блокировка баз данных в GUI:
Исключение конфликтов имен файлов:
.diaphora.sqlite.На проверенных IDA Pro 9.3 fixtures полный regression suite проходит: 16 passed, 1 xpassed.
Реальный staged export и Diaphora diff двух SQLite3 DLL также проверены. Для больших или GUI-открытых IDB остаются operational ограничения: нужен свободный IDA lock, корректный DIAPHORA_OUTPUT_ROOT и достаточно большой timeout 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 для diff | /usr/bin/python3 (по умолч. sys.executable) |
| Инструмент | Описание |
|---|
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 | Метаданные базы |
.sqliteida-pro-mcp