
diaphora-mcp v1.0.5
MCP сервер для автоматизированного бинарного диффинга.
Diaphora MCP
Diaphora MCP — это MCP-сервер для автоматизированного бинарного диффинга. Он соединяет Diaphora (движок диффинга) и IDA Pro (дизассемблер) через протокол MCP, позволяя ИИ-агентам (Claude Code, etc.) выполнять сравнение бинарных файлов, находить security-патчи и анализировать изменения.
Возможности
- Экспорт: конвертация проанализированных .i64/.idb в формат Diaphora SQLite (через idat.exe headless)
- Диффинг: сравнение двух экспортированных баз, фильтрация результатов по типу совпадения и ratio
- Анализ уязвимостей: поиск security-релевантных изменений по ключевым словам и эвристикам
- Детектирование патчей: автоматическое обнаружение новых проверок границ, null-checks, обработки ошибок, крипто-изменений
- Ранжирование: сортировка изменённых функций по важности (CFG, сложность, security-индикаторы)
- Call Graph: сравнение цепочек вызовов (BFS, до N уровней), поиск корневых изменений
- Перенос метаданных: подготовка данных для переноса имён/комментариев/прототипов между базами
- Интеграция с IDA Pro MCP: все инструменты возвращают адреса и пути для прямого вызова IDA Pro MCP
Установка
1. Зависимости
- Python 3.10+
- IDA Pro 8.x / 9.x (для headless-экспорта через idat.exe)
- Diaphora — плагин для IDA (установлен в IDA)
- Claude Code (или любой MCP-клиент)
2. Установка пакета
git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
3. Конфигурация путей
Пакет пытается автоматически найти 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 часа).
3.1. Codex и headless IDA MCP
В 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
4. Подготовка баз для диффа
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/ # Логи экспортов (создаётся автоматически)
Все MCP-инструменты (21 шт)
Export
| Инструмент | Описание |
|---|---|
export_idb_to_diaphora | Экспорт .i64/.idb в .sqlite через idat.exe |
batch_export_and_diff | Полный пайплайн: экспорт → экспорт → diff → сводка |
Diff
| Инструмент | Описание |
|---|---|
diff_diaphora_dbs | Дифф двух экспортированных .sqlite баз |
get_diff_results | Чтение .diaphora файла с фильтрацией |
get_diff_summary | Сводка по diff |
Analysis
| Инструмент | Описание |
|---|---|
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 | Метаданные базы |
Security
| Инструмент | Описание |
|---|---|
detect_security_patches | Детектирование вероятных исправлений безопасности |
Ranking
| Инструмент | Описание |
|---|---|
rank_changes | Ранжирование изменённых функций по важности |
Callgraph
| Инструмент | Описание |
|---|---|
get_changed_callgraph | Сравнение входящих/исходящих вызовов |
compare_call_path | Сравнение цепочек вызовов (BFS, N уровней) |
find_patch_root | Определение корневых функций |
Performance
| Инструмент | Описание |
|---|---|
performance_report | Агрегированный отчёт по памяти, кэшу и соединениям |
Metadata
| Инструмент | Описание |
|---|---|
transfer_metadata | Подготовка данных для переноса имён/комментариев |
Интеграция с GUI IDA Pro (XML-RPC Мост)
Проект включает в себя встроенную интеграцию с запущенной сессией GUI IDA Pro, что позволяет делать экспорт баз данных мгновенно прямо в открытом окне без конфликтов блокировки файлов.
- Автоматический запуск: Скопируйте файл diaphora_gui_listener.py в папку
plugins/вашей IDA Pro. Он будет автоматически поднимать XML-RPC сервер на порту28652при запуске IDA. - Умный экспорт: При вызове
export_idb_to_diaphoraMCP-сервер сначала проверит порт28652. Если сессия активна, он сделает экспорт прямо в GUI без открытия сторонних фоновых процессов. В противном случае он автоматически откатится к фоновому headless-режиму (idat.exe).
Подробные инструкции по настройке и запуску моста см. в GUI_INSTRUCTIONS.ru.md.
Работа с гигантскими базами данных (100k+ функций)
При работе с очень большими проектами (например, с 150k+ функциями) Diaphora MCP включает специальные оптимизации:
- Лимит рекурсии: В коде плагина лимит рекурсии Python автоматически поднят до
100000(sys.setrecursionlimit), что предотвращает крашmaximum recursion depth exceededна больших графах вызовов. - Оптимизация транзакций SQLite: В
diaphora_config.pyрекомендуется установитьCOMMIT_AFTER_EACH_GUI_UPDATE = False. Это отключает частые дисковые коммиты при обновлении GUI, ускоряя экспорт в 2-3 раза. - Отключение микрокода: При работе с огромными базами без декомпилятора рекомендуется отключить экспорт микрокода Hex-Rays (
EXPORTING_USE_MICROCODE = Falseв конфиге Diaphora).
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 в действии, ознакомьтесь с подробными примерами:
- Разбор реальной сессии Diaphora MCP — полный транскрипт с JSON-запросами и ответами сервера на каждом шаге.
Руководство для ИИ-агентов (Важно)
Если вы являетесь ИИ-помощником (например, Claude Code) и используете этот протокол, помните о следующих правилах совместимости:
-
Различия схем GUI и Headless экспорта:
- Экспорт через активную GUI-сессию (плагин
ida_mcp.py) создает упрощенную схему с таблицамиcalls,strings,structures, но без таблицыprogram. - Экспорт в headless-режиме (через
idat.exe) создает официальную схему Diaphora с таблицейprogram. - Важно: Движок сравнения (
diff_diaphora_dbs) требует официальную схему. Всегда выполняйте headless-экспорт, если планируете сравнивать/диффить базы данных.
- Экспорт через активную GUI-сессию (плагин
-
Блокировка баз данных в GUI:
- База данных, открытая в данный момент в GUI IDA Pro, заблокирована. Попытка запустить её headless-экспорт завершится ошибкой.
- Если вам нужно сравнить открытую базу, попросите пользователя закрыть её в GUI (или открыть заглушку), чтобы снять файловые блокировки, и только после этого запускайте headless-экспорт.
-
Исключение конфликтов имен файлов:
- Базы экспорта Diaphora сохраняются с расширением
.diaphora.sqlite. - Никогда не используйте расширение
.sqliteпо умолчанию для баз Diaphora, так как это приведет к конфликту с внутренней базой кэша супервизораida-pro-mcp(которая использует то же имя).
- Базы экспорта Diaphora сохраняются с расширением
Статус проверки и ограничения
На проверенных 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