IDA Pro MCP

MCP MCP Servers Open Source v1.4.0 · 06.10.2025 активный

MCP-сервер для реверс-инжиниринга в IDA Pro: AI-агент читает дизассемблированный код, переименовывает функции и переменные, добавляет комментарии, ищет паттерны. Работает через idalib без запуска GUI. Один из самых популярных инструментов для vibe reversing.

v1.4.0
06.10.2025 current
v0.1.0
01.03.2025
Добавлен 06.07.2026 · Обновлён 06.07.2026 · MCP Servers
Установка
# Требуется: IDA Pro 9.x + uv (https://astral.sh/uv)

# Шаг 1 — активировать idalib:
# Linux/macOS:
uv run "/path/to/IDA Pro 9.x/idalib/python/py-activate-idalib.py"
# Windows:
uv run "C:\Program Files\IDA Professional 9.3\idalib\python\py-activate-idalib.py"

# Шаг 2 — установить через Claude Code плагин:
claude plugin marketplace add mrexodia/claude-marketplace
claude plugin install ida-pro-mcp@mrexodia

# Альтернативная установка через pip:
pip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip
ida-pro-mcp --install

# Claude Desktop — claude_desktop_config.json:
{ "mcpServers": { "ida-pro": { "command": "uvx", "args": ["--from", "ida-pro-mcp", "idalib-mcp"] } } }

# OpenCode — ~/.config/opencode/opencode.json:
{ "mcp": { "ida-pro": { "type": "local", "command": ["uvx", "--from", "ida-pro-mcp", "idalib-mcp"] } } }
переведено ИИ

IDA Pro MCP

Простой MCP-сервер для интуитивного реверс-инжиниринга в IDA Pro.

https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0

Бинарные файлы и промпт для видео доступны в репозитории mcp-reversing-dataset.

Предварительные требования

Установка (Claude Code)

Для установки безголового IDA Pro MCP в Claude Code:

claude plugin marketplace add mrexodia/claude-marketplace
claude plugin install ida-pro-mcp@mrexodia

Для обновления до последней версии:

claude plugin update ida-pro-mcp@mrexodia

Примечание: Для этого требуется глобально активированная idalib и установленный uv:

# windows
uv run "C:\Program Files\IDA Professional 9.3\idalib\python\py-activate-idalib.py"
# macos
uv run "/Applications/IDA Professional 9.3.app/Contents/MacOS/idalib/python/py-activate-idalib.py"

Установка (GUI)

Примечание: MCP-плагин больше не рекомендуется и в конечном итоге будет deprecated. Вместо него используйте idalib-mcp.

Если вы хотите вручную настроить MCP-сервер из графического интерфейса IDA:

pip uninstall ida-pro-mcp
pip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip

Настройте MCP-серверы и установите плагин IDA:

ida-pro-mcp --install

Важно: Обязательно полностью перезапустите IDA и ваш MCP-клиент, чтобы установка вступила в силу. Некоторые клиенты (например, Claude) работают в фоновом режиме, и их нужно закрывать через значок в области уведомлений.

Инженерия промптов

Большие языковые модели (LLMs) подвержены галлюцинациям, и вам нужно быть конкретным в своих промптах. Для реверс-инжиниринга особенно проблематичным является преобразование между целыми числами и байтами. Ниже приведен минимальный пример промпта; не стесняйтесь начинать обсуждение или открывать задачу (issue), если у вас есть хорошие результаты с другим промптом:

Ваша задача — проанализировать crackme в IDA Pro. Вы можете использовать инструменты MCP для получения информации. В целом используйте следующую стратегию:

- Просматривайте декомпиляцию и добавляйте комментарии с вашими выводами
- Переименовывайте переменные в более осмысленные имена
- Изменяйте типы переменных и аргументов, если это необходимо (особенно типы указателей и массивов)
- Изменяйте имена функций на более описательные
- Если необходимы более детали, дизассемблируйте функцию и добавляйте комментарии с вашими выводами
- НИКОГДА не конвертируйте системы счисления чисел самостоятельно. Используйте инструмент MCP `int_convert` при необходимости!
- Не пытайтесь проводить брутфорс, выводите любые решения исключительно на основе дизассемблей и простых скриптов на Python
- В конце создайте файл report.md с вашими выводами и предпринятыми шагами
- Когда вы найдете решение, задайте пользователю вопрос с найденным паролем для обратной связи

Этот промпт был только первым экспериментом. Пожалуйста, делитесь, если вы нашли способы улучшить результат!

Другой промпт от @can1357:

Ваша задача — создать полный и всеобъемлющий анализ реверс-инжиниринга. Обратитесь к AGENTS.md, чтобы понять цели проекта и убедиться, что анализ служит нашим задачам.

Используйте следующую систематическую методологию:

1. **Анализ декомпиляции**
   - Тщательно исследуйте вывод декомпилятора
   - Добавляйте подробные комментарии, документируя ваши выводы
   - Сосредоточьтесь на понимании фактической функциональности и назначения каждого компонента (не полагайтесь на старые, неверные комментарии)

2. **Улучшение читаемости в базе данных**
   - Переименовывайте переменные в осмысленные, описательные имена
   - Исправляйте типы переменных и аргументов, где это необходимо (особенно указатели и типы массивов)
   - Обновляйте имена функций, чтобы они описывали их фактическое назначение

3. **Углубленный анализ при необходимости**
   - Если необходимы более детали, изучите дизассемблер и добавляйте комментарии с выводами
   - Документируйте любое поведение низкого уровня, которое не ясно только из декомпиляции
   - Используйте субагенты для проведения детального анализа

4. **Важные ограничения**
   - НИКОГДА не конвертируйте системы счисления чисел самостоятельно - используйте инструмент MCP int_convert при необходимости
   - Используйте инструменты MCP для получения информации по мере необходимости
   - Выводите все заключения на основе реального анализа, а не предположений

5. **Документация**
   - Создавайте обширные файлы RE/*.md с вашими выводами
   - Документируйте предпринятые шаги и использованную методологию
   - По запросу пользователя обеспечивайте точность по сравнению с предыдущим файлом анализа
   - Организуйте выводы таким образом, чтобы они служили целям проекта, изложенным в AGENTS.md или CLAUDE.md

Прямая трансляция обсуждающая промптинг и показывающая анализ реального вредоносного ПО:

Советы по повышению точности LLM

Большие языковые модели (LLM) — мощные инструменты, но иногда они могут испытывать трудности со сложными математическими вычислениями или проявлять "галлюцинации" (выдумывать факты). Обязательно говорите LLM использовать инструмент MCP int_convert, и вам также может потребоваться math-mcp для определенных операций.

Еще один момент, который следует учитывать: LLM плохо справляются с обфусцированным кодом. Прежде чем пытаться использовать LLM для решения задачи, осмотрите бинарный файл и потратьте время на (автоматическое) удаление следующего:

  • Шифрование строк
  • Хеширование импортов
  • Выравнивание потока управления
  • Шифрование кода
  • Трюки против декомпиляции

Вы также должны использовать такие инструменты, как Lumina или FLIRT, чтобы попытаться разрешить весь код открытых библиотек и C++ STL; это дополнительно улучшает точность.

Транспорты и безголовый MCP

Вы можете запустить SSE-сервер для подключения к пользовательскому интерфейсу следующим образом:

uv run ida-pro-mcp --transport http://127.0.0.1:8744/sse

После установки idalib вы также можете запустить безголовый MCP-сервер. Вы можете начать с начального бинарного файла:

uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable

Или запустить без бинарного файла и открывать произвольные файлы позже с помощью idb_open(...):

uv run idalib-mcp --host 127.0.0.1 --port 8745

Для клиентов на основе stdio используйте:

uv run idalib-mcp --stdio

Работники баз данных являются постоянными: каждый из них работает как отсоединенный процесс, который переживает супервизора, его создавшего. Когда новый супервизор (через stdio или HTTP) вызывает idb_open для бинарного файла, который уже открыт под работником на этом хосте, супервизор берет этого работника прозрачно — нет отдельного режима "общего доступа" для включения. Работники выходят самостоятельно, когда запросы к ним не поступали в течение интервала простоя.

Примечание: Функционал idalib был внесен Willi Ballenthin.

Безголовая модель сессии idalib

idalib-mcp — это супервизор, который поддерживает каждую открытую базу данных в собственном рабочем процессе idalib. Рабочие процессы регистрируются в локальной директории обнаружения хоста и переживают породившего их супервизора; любой последующий супервизор, заинтересованный в том же пути, перенимает уже запущенный рабочий процесс. Рабочий процесс завершает работу сам, когда в течение заданного времени простоя (TTL, по умолчанию 1 час) к нему не поступает ни одного запроса. Инструмента idb_close не существует — клиенты, которым больше не нужна база данных, просто прекращают её использование, и только пользователь может закрыть окно графического интерфейса.

idb_open выбирает бэкенд через параметр mode:

  • prefer_headless (по умолчанию): создает рабочий процесс idalib (или перенимает уже работающий для этого файла).
  • force_headless: то же самое, но никогда не перенимает работающий GUI, даже если он уже имеет этот файл.
  • prefer_gui: перенимает работающий GUI для файла; в противном случае создает рабочий процесс idalib.
  • force_gui: перенимает работающий GUI для файла; в противном случае запускает новый процесс GUI IDA.

Каждый вызов инструмента должен содержать явный аргумент database. Неявной «текущей базы данных» не существует — вызывающие стороны указывают ID сессии, с которой хотят работать.

uv run idalib-mcp --stdio --max-workers 4

Типичный сценарий использования:

idb_open("/path/to/binary_a.exe", preferred_session_id="binary_a")
idb_open("/path/to/library.dll", preferred_session_id="library")

decompile("main", database="binary_a")
xrefs_to("ImportantExport", database="library")

Аргумент database должен быть ID сессии, возвращенным idb_open (или отображаемым в idb_list); имена файлов и пути не принимаются.

Инструменты управления

  • idb_open(input_path, mode="prefer_headless", run_auto_analysis=True, build_caches=True, init_hexrays=True, preferred_session_id=""): Открывает двоичный файл, разогревает подсистемы (кэш строк, Hex-Rays) и возвращает его ID сессии. Если для этого пути уже работает рабочий процесс или экземпляр GUI, он перенимается, а preferred_session_id игнорируется.
  • idb_list(): Выводит список открытых сессий и запущенных экземпляров GUI IDA. Каждая запись содержит поля: adopted (True, если этот супервизор управляет им, False для GUI/рабочих процессов, обнаруженных, но еще не открытых через idb_open), backend (worker или gui), is_active и идентификаторы процессов.
  • idb_save(session_id, path=""): Сохраняет IDB сессии на диск. Передается как обычный инструмент рабочего процесса (с внедрением database=<id>) — одинаковая сигнатура для обоих бэкендов).
  • Проверка состояния базы данных: вызов server_health(database=<id>) (передается). idb_list() сообщает is_active на основе TCP/RPC-проверки супервизора.

Управление рабочими процессами:

  • --max-workers N: максимальное количество одновременных рабочих процессов баз данных (0 = без ограничений, по умолчанию 4).
  • IDA_MCP_MAX_WORKERS: значение по умолчанию из окружения для --max-workers.

Ресурсы MCP

Ресурсы представляют собой удобный для просмотра доступ к состоянию (данным только для чтения), следуя философии MCP.

Основное состояние IDB: - ida://idb/metadata — информация о файле IDB (путь, архитектура, базовый адрес, размер, хэши) - ida://idb/segments — сегменты памяти с разрешениями - ida://idb/entrypoints — точки входа (main, TLS-колбэки и т.д.)

Состояние интерфейса: - ida://cursor — текущая позиция курсора и функция - ida://selection — текущий выделенный диапазон

Информация о типах: - ida://types — все локальные типы - ida://structs — все структуры/объединения - ida://struct/{name} — определение структуры с полями

Поисковые запросы: - ida://import/{name} — подробности импорта по имени - ida://export/{name} — подробности экспорта по имени - ida://xrefs/{addr} — перекрестные ссылки на/с адреса

Основные функции

  • lookup_funcs(queries): Получить функцию(и) по адресу или имени (автоопределение, принимает список или строку через запятую).
  • int_convert(inputs): Преобразовать числа в различные форматы (десятичный, шестнадцатеричный, байты, ASCII, двоичный).
  • list_funcs(queries): Вывести список функций (с постраничным выводом, фильтрацией).
  • list_globals(queries): Вывести список глобальных переменных (с постраничным выводом, фильтрацией).
  • imports(offset, count): Вывести все импортируемые символы с именами модулей (с постраничным выводом).
  • decompile(addr): Декомпилировать функцию по указанному адресу.
  • disasm(addr): Дассемблировать функцию с полными подробностями (аргументы, стековый фрейм и т.д.).
  • xrefs_to(addrs): Получить все перекрестные ссылки на указанный(-ые) адрес(-а).
  • xrefs_to_field(queries): Получить перекрестные ссылки на указанное(-ые) поле(-я) структуры.
  • callees(addrs): Получить функции, вызываемые функциями по указанным адрес(-ам).

Операции модификации

  • add_bookmark(addr, name, prefix): Добавить или заменить закладку IDA по адресу; задайте prefix="" для отсутствия префикса.
  • set_comments(items): Установить комментарии по адрес(-ам) в представлениях дассемблера и декомпилятора.
  • patch_asm(items): Патчить инструкции ассемблера по адрес(-ам).
  • declare_type(decls): Объявить C-тип(-ы) в локальной библиотеке типов.
  • define_func(items): Определить функцию(-и) по адрес(-ам). При необходимости укажите end для явного ограничения границ.
  • define_code(items): Преобразовать байты в инструкции кода по адрес(-ам).
  • undefine(items): Отменить определение элемент(-ов) по адрес(-ам), преобразовав обратно в сырые байты. При необходимости укажите end или size.

Операции чтения памяти

  • get_bytes(addrs): Прочитать сырые байты по адрес(-ам).
  • get_int(queries): Прочитать целочисленные значения, используя тип (i8/u64/i16le/i16be/ и т.д.).
  • get_string(addrs): Прочитать нуль-терминированную(-ые) строку(-ы).
  • get_global_value(queries): Прочитать значение(-я) глобальной переменной по адресу или имени (автоопределение, значения времени компиляции).

Операции со стековым фреймом

  • stack_frame(addrs): Получить переменные стекового фрейма для функции(-й).
  • declare_stack(items): Создать переменную(-ые) стека по указанным смещениям.
  • delete_stack(items): Удалить переменную(-ые) стека по имени.

Операции со структурами

  • read_struct(queries): Прочитать значения полей структуры по указанным адрес(-ам).
  • search_structs(filter): Искать структуры по шаблону имени.

Операции отладчика (расширение)

Инструменты отладчика по умолчанию скрыты. Включите их с помощью параметра запроса ?ext=dbg:

http://127.0.0.1:13337/mcp?ext=dbg

Управление: - dbg_start(): Запустить процесс отладчика. - dbg_exit(): Выйти из процесса отладчика. - dbg_continue(): Продолжить выполнение. - dbg_run_to(addr): Запустить до адреса. - dbg_step_into(): Сделать шаг с входом в инструкцию. - dbg_step_over(): Сделать шаг над инструкцией.

Точки останова: - dbg_bps(): Вывести список всех точек останова. - dbg_add_bp(addrs): Добавить точку(-и) останова. - dbg_delete_bp(addrs): Удалить точку(-и) останова. - dbg_toggle_bp(items): Включить/выключить точку(-и) останова.

Регистры: - dbg_regs(): Все регистры, текущий поток. - dbg_regs_all(): Все регистры, все потоки. - dbg_regs_remote(tids): Все регистры, указанный(-ые) поток(-и). - dbg_gpregs(): Общего назначения, текущий поток. - dbg_gpregs_remote(tids): Общего назначения, указанный(-ые) поток(-и). - dbg_regs_named(names): Именованные регистры, текущий поток. - dbg_regs_named_remote(tid, names): Именованные регистры, указанный поток.

Стек и память: - dbg_stacktrace(): Стек вызовов с информацией о модуле/символе. - dbg_read(regions): Читать память из отлаживаемого процесса. - dbg_write(regions): Записывать память в отлаживаемый процесс.

Операции расширенного анализа

  • py_eval(code): Выполнить произвольный код Python в контексте IDA (возвращает dict с result/stdout/stderr, поддерживает оценку в стиле Jupyter).
  • analyze_funcs(addrs): Комплексный анализ функции (декомпиляция, дассемблирование, перекрестные ссылки, вызываемые функции, вызывающие функции, строки, константы, базовые блоки).

Сопоставление шаблонов и поиск

  • find_regex(queries): Искать строки с помощью регулярного выражения без учёта регистра (с постраничным выводом).
  • find_bytes(patterns, limit=1000, offset=0): Найти шаблон(-ы) байтов в двоичном файле (например, "48 8B ?? ??"). Максимальный лимит: 10000.
  • find_insns(sequences, limit=1000, offset=0): Найти последовательность(-и) инструкций в коде. Максимальный лимит: 10000.
  • find(type, targets, limit=1000, offset=0): Расширенный поиск (мгновенные значения, строки, ссылки на данные/код). Максимальный лимит: 10000.

Анализ потока управления

  • basic_blocks(addrs): Получить базовые блоки с последователями и предшественниками.

Операции с типами

  • set_type(edits): Применить тип(-ы) к функциям, глобальным переменным, локальным переменным или переменным стека.
  • infer_types(addrs): Определить типы по адрес(-ам), используя Hex-Rays или эвристику.

Операции экспорта

  • export_funcs(addrs, format): Экспортировать функцию(-и) в указанном формате (json, c_header или prototypes).

Операции с графами

  • callgraph(roots, max_depth): Построить граф вызовов от корневой(-ых) функции(-й) с настраиваемой глубиной.

Групповые операции

  • rename(batch): Единая групповая операция переименования для функций, глобальных переменных, локальных переменных и переменных стека (принимает словарь с необязательными ключами func, data, local, stack).
  • patch(patches): Применение патчей к нескольким последовательностям байтов одновременно.
  • put_int(items): Запись целочисленных значений с использованием типов (ty) (i8/u64/i16le/i16be и т.д.).

Ключевые особенности:

  • Типизированный API: Все функции используют строго типизированные параметры со схемами TypedDict для лучшей поддержки IDE и структурированных выводов LLM.
  • Принцип «группы в первую очередь»: Большинство операций принимают как отдельные элементы, так и списки.
  • Единообразная обработка ошибок: Все групповые операции возвращают [{..., error: null|string}, ...].
  • Постраничная навигация с курсором: Функции поиска возвращают cursor: {next: offset} или {done: true} (лимит по умолчанию: 1000, максимум: 10000 для предотвращения переполнения токенов).
  • Производительность: Строки кэшируются с использованием инвалидации на основе MD5 для избежания повторных вызовов build_strlist в больших проектах.

Разработка

Добавление новых возможностей — это очень простой и удобный процесс. Все, что вам нужно сделать, — это добавить новую функцию с декоратором @tool в модульные файлы API в src/ida_pro_mcp/ida_mcp/api_*.py, и ваша функция станет доступна на сервере MCP без какого-либо дополнительного шаблонного кода! Ниже представлено видео, где я добавляю функцию get_metadata менее чем за 2 минуты (включая тестирование):

https://github.com/user-attachments/assets/951de823-88ea-4235-adcb-9257e316ae64

Для тестирования самого сервера MCP:

npx -y @modelcontextprotocol/inspector

Это откроет веб-интерфейс по адресу http://localhost:5173 и позволит вам взаимодействовать с инструментами MCP для тестирования.

Для тестирования я создаю символическую ссылку на плагин IDA, а затем отправляю запрос JSON-RPC непосредственно на http://localhost:13337/mcp. После включения символических ссылок вы можете выполнить следующую команду:

uv run ida-pro-mcp --install

Генерация журнала изменений для прямых коммитов в ветку main:

git log --first-parent --no-merges 1.2.0..main "--pretty=- %s"
Комментарии
Войдите, чтобы оставить комментарий