MCP-сервер для реверс-инжиниринга в IDA Pro: AI-агент читает дизассемблированный код, переименовывает функции и переменные, добавляет комментарии, ищет паттерны. Работает через idalib без запуска GUI. Один из самых популярных инструментов для vibe reversing.
# Требуется: 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"] } } }
Простой MCP-сервер для интуитивного реверс-инжиниринга в IDA Pro.
https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0
Бинарные файлы и промпт для видео доступны в репозитории mcp-reversing-dataset.
idapyswitch для переключения на новейшую версию Pythonida-pro-mcp --config, чтобы получить JSON-конфигурацию для вашего клиента.Для установки безголового 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"
Примечание: 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 использовать инструмент MCP int_convert, и вам также может потребоваться math-mcp для определенных операций.
Еще один момент, который следует учитывать: LLM плохо справляются с обфусцированным кодом. Прежде чем пытаться использовать LLM для решения задачи, осмотрите бинарный файл и потратьте время на (автоматическое) удаление следующего:
Вы также должны использовать такие инструменты, как Lumina или FLIRT, чтобы попытаться разрешить весь код открытых библиотек и C++ STL; это дополнительно улучшает точность.
Вы можете запустить 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-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.
Основное состояние 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 и т.д.).Ключевые особенности:
[{..., error: null|string}, ...].cursor: {next: offset} или {done: true} (лимит по умолчанию: 1000, максимум: 10000 для предотвращения переполнения токенов).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"