
Ассистент для реверс-инжиниринга на базе ИИ, который связывает IDA Pro с языковыми моделями через MCP.
Простой MCP-сервер для вайб-реверс-инжиниринга в IDA Pro.
https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0
Бинарники и промпт из видео доступны в репозитории mcp-reversing-dataset.
idapyswitch, чтобы переключиться на последнюю версию Pythonida-pro-mcp --config, чтобы получить JSON-конфигурацию для вашего клиента.Примечание: для этого требуется глобально активированная 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"
Чтобы установить последнюю версию IDA Pro MCP в Claude Code:
claude plugin marketplace add mrexodia/claude-marketplace
claude plugin uninstall ida-pro-mcp@mrexodia
claude plugin install ida-pro-mcp@mrexodia
Чтобы установить последнюю версию IDA Pro MCP в Codex:
codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia
Чтобы установить последнюю версию IDA Pro MCP в Kimi Code, выполните эту слэш-команду в чате:
/plugins install https://github.com/mrexodia/ida-pro-mcp/tree/main
/reload
При этом устанавливаются MCP-сервер idalib и навык idapython. Плагины копируются в
$KIMI_CODE_HOME/plugins/managed/, поэтому uv должен быть в вашем PATH. Первая сессия после
установки будет медленнее, потому что uv разрешает зависимости до ответа сервера.
Примечание: плагин MCP больше не рекомендуется и со временем будет объявлен устаревшим. Используйте вместо него 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) работают в фоновом режиме, и их нужно завершать через значок в трее.
LLM склонны к галлюцинациям, поэтому в промптах нужно быть конкретным. В реверс-инжиниринге особенно проблематично преобразование между целыми числами и байтами. Ниже приведён минимальный пример промпта; не стесняйтесь начать обсуждение или открыть issue, если у вас хорошие результаты с другим промптом:
Your task is to analyze a crackme in IDA Pro. You can use the MCP tools to retrieve information. In general use the following strategy:
- Inspect the decompilation and add comments with your findings
- Rename variables to more sensible names
- Change the variable and argument types if necessary (especially pointer and array types)
- Change function names to be more descriptive
- If more details are necessary, disassemble the function and add comments with your findings
- NEVER convert number bases yourself. Use the `int_convert` MCP tool if needed!
- Do not attempt brute forcing, derive any solutions purely from the disassembly and simple python scripts
- Create a report.md with your findings and steps taken at the end
- When you find a solution, prompt to user for feedback with the password you found
Этот промпт был лишь первым экспериментом — пожалуйста, поделитесь, если нашли способы улучшить результат!
Ещё один промпт от @can1357:
Your task is to create a complete and comprehensive reverse engineering analysis. Reference AGENTS.md to understand the project goals and ensure the analysis serves our purposes.
Use the following systematic methodology:
1. **Decompilation Analysis**
- Thoroughly inspect the decompiler output
- Add detailed comments documenting your findings
- Focus on understanding the actual functionality and purpose of each component (do not rely on old, incorrect comments)
2. **Improve Readability in the Database**
- Rename variables to sensible, descriptive names
- Correct variable and argument types where necessary (especially pointers and array types)
- Update function names to be descriptive of their actual purpose
3. **Deep Dive When Needed**
- If more details are necessary, examine the disassembly and add comments with findings
- Document any low-level behaviors that aren't clear from the decompilation alone
- Use sub-agents to perform detailed analysis
4. **Important Constraints**
- NEVER convert number bases yourself - use the int_convert MCP tool if needed
- Use MCP tools to retrieve information as necessary
- Derive all conclusions from actual analysis, not assumptions
5. **Documentation**
- Produce comprehensive RE/*.md files with your findings
- Document the steps taken and methodology used
- When asked by the user, ensure accuracy over previous analysis file
- Organize findings in a way that serves the project goals outlined in AGENTS.md or 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 вы также можете запустить headless 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. Рабочие процессы регистрируются в локальном для хоста каталоге обнаружения и переживают породивший их супервизор; любой последующий супервизор, которому нужен тот же путь, перенимает запущенный рабочий процесс. Рабочий процесс завершается сам, если в течение idle TTL (по умолчанию 1 час) к нему не поступало запросов. Вызов idb_close позволяет освободить рабочий процесс заранее (освободив слот в счёт --max-workers); перенятые экземпляры GUI/рабочих процессов отсоединяются, а не уничтожаются.
idb_open выбирает внутреннюю реализацию через параметр mode:
prefer_headless (по умолчанию): запустить рабочий процесс idalib (или перенять тот, который уже открыл файл).force_headless: то же самое, но никогда не перенимать запущенный GUI, даже если в нём открыт файл.prefer_gui: перенять запущенный GUI для файла; в противном случае запустить рабочий процесс idalib.force_gui: перенять запущенный GUI для файла; в противном случае запустить новый процесс IDA GUI.Каждый вызов инструмента должен содержать явный аргумент database. Неявной «текущей базы данных» не существует — вызывающая сторона сама называет сессию, с которой хочет работать.
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(): выводит список открытых сессий и запущенных экземпляров IDA GUI. Каждая запись содержит adopted (True, если этим супервизором она управляется, False для экземпляров GUI/рабочих процессов, обнаруженных, но ещё не открытых через idb_open), backend (worker или gui), is_active и идентификаторы процессов.idb_close(database, save=True): сохранить (опционально), дерегистрировать сессию и завершить принадлежащий ей рабочий процесс, освободив слот в счёт --max-workers. Перенятые экземпляры GUI/рабочих процессов отсоединяются, а не уничтожаются.Параметры рабочих процессов:
--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/from/{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): прочитать целочисленные значения с использованием ty (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): унифицированная пакетная операция переименования для функций, глобальных переменных, локальных переменных и переменных стека (принимает dict с опциональными ключами 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"
idb_save(session_id, path=""): сохранить IDB сессии на диск. Прокидывается как обычный инструмент рабочего процесса (добавляется database=<id>) — одинаковая сигнатура в обеих реализациях.server_health(database=<id>) (прокидывается). idb_list() сообщает is_active по результатам TCP/RPC-проверки супервизора.