Назад к обновлениям
New releaseJul 15, 2026

diaphora-mcp v1.0.5

MCP сервер для автоматизированного бинарного диффинга.

Поделиться

Read in English

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.exeC:\Program Files\IDA Pro 9.3\idat.exe
DIAPHORA_DIRПапка с diaphora.pyC:\Program Files\IDA Pro 9.3\plugins\diaphora-3.4.1
DIAPHORA_OUTPUT_ROOTРазрешённый корневой каталог новых файлов экспортаD:\\diaphora-outputs
DIAPHORA_PYTHONPython для 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_resultsSecurity-фильтрация
compare_functionsSide-by-side сравнение двух версий функции
find_function_matchПоиск соответствия функции между версиями
explain_similarityРазбор факторов сходства
detect_behavior_changeNL-описание изменения логики
summarize_patchПолный отчёт по обновлению
search_export_dbПоиск функций по имени/размеру/сложности
get_function_pseudocodeПсевдокод функции из базы
get_export_infoМетаданные базы

Категории