Skip to main content
Glama
Claude-Reverser

IDA-instances-MCP

IDA-instances-MCP

Пользовательская сборка ida-pro-mcp: MCP-сервер, позволяющий MCP-клиентам управлять IDA Pro, — переработанная с упором на стабильность для размещения нескольких headless-экземпляров idalib (схема Ida-Instances).

Это форк ida-pro-mcp от mrexodia (MIT). Вся заслуга апстрима принадлежит Duncan Ogilvie и контрибьюторам; описанные ниже изменения поддерживаются в этом репозитории.

Что изменено

Усиление стабильности поверх апстрима v2.0.0:

Область

Изменение

Безопасность данных

Очистка частичных баз учитывает владельца: никогда не удаляются файлы .id0/.id1/.id2/.nam/.til, принадлежащие другому активному экземпляру, а при недоступности определения владельца выполняется безопасный отказ

Надёжность сохранения

idb_save выполняется с бюджетом 600 с (было 60 с); idb_close отказывается убивать воркер после неудачного сохранения вместо молчаливого отбрасывания изменений

Параллелизм

Блокировка супервизора больше не охватывает запуск воркеров (~120 с), проверки состояния (~2,5 с/сессию) или завершение устаревших воркеров — одно медленное открытие не может заморозить все сессии

Устойчивость

Некорректный JSON-RPC через stdio возвращает -32700/-32600 вместо падения прокси

Тайм-ауты

Тайм-аут прокси поднят с 30 с до 900 с и сделано настраиваемым (IDA_MCP_PROXY_TIMEOUT), так что длинные декомпиляции не «проваливаются» на стороне клиента, пока продолжают выполняться на стороне сервера

Сеть

Гонка TOCTOU при порте воркера теперь повторяет попытки; записи SSE и завершение работы защищены блокировками; чтение CORS-политики кэшируется за пределами главного потока IDA

Лимиты ресурсов

Журнал трассировки IDB ограничен 64 МБ (IDA_MCP_TRACE_MAX_MB) с обрезкой слишком больших аргументов/результатов; очередь при сбоях сброса ограничена

Аутентификация

Каждый HTTP-запрос требует API-ключ экземпляра; выдается ровно один раз через GET /key, после чего сжигается. Ключ хранится на диске и переживает перезапуски и перезагрузки

Хостинговые конечные точки

GET /health (неаутентифицированная проверка готовности), GET /sessions (открытые базы данных + время последнего доступа), POST /upload (прямая загрузка бинарного файла с ограничением размера)

Завершение неактивных сессий

Сессии без обращений в течение IDA_MCP_IDLE_TIMEOUT минут автоматически закрываются (с сохранением)

Плавное завершение

При получении SIGTERM/SIGINT перед выходом сохраняется каждая открытая база данных — больше нет потерянной работы при pct stop

Самообновление

При запуске проверяются релизы GitHub; интерактивным сессиям предлагается автообновление в одно нажатие клавиши

Настройки хостинга по умолчанию

Головной (headless) супервизор слушает на 0.0.0.0:9999; GUI-плагин также привязывается к 0.0.0.0 и теперь требует тот же API-ключ

Related MCP server: idalib-mcp-headless

Требования

  • Linux, macOS или Windows

  • Python 3.11+ (используйте idapyswitch внутри IDA, чтобы версии совпадали)

  • IDA Pro 8.3+ (рекомендуется 9.x). IDA Free не поддерживается

  • uv

  • MCP-клиент (Claude Code, Cursor, Codex, OpenCode, VS Code, ...)

Установка

Активируйте idalib для вашего окружения uv:

# linux (server deployment)
uv run "/opt/idapro-9.x/idalib/python/py-activate-idalib.py"
# macos
uv run "/Applications/IDA Professional 9.x.app/Contents/MacOS/idalib/python/py-activate-idalib.py"
# windows
uv run "C:\Program Files\IDA Professional 9.x\idalib\python\py-activate-idalib.py"

Headless-запускам дополнительно нужен каталог установки IDA в переменной IDADIR.

Запуск headless-супервизора (режим хостинга)

uv run idalib-mcp                # serves http://0.0.0.0:9999/mcp (new default)

При запуске генерируется API-ключ (или загружается с диска), и каждый запрос без него получает 401 Unauthorized — без исключений.

Получите ключ один раз с машины/сети, которой принадлежит экземпляр:

curl http://your-host:9999/key
# {"key": "3f2b..."}   <- save it; this endpoint is now burned until restart
  • Ключ сохраняется в ~/.idapro/mcp/api_key (права 0600) и переживает перезагрузки; GET /key выдаёт ключ один раз за запуск сервера

  • Можно переопределить через IDA_MCP_API_KEY (или переместить его файл через IDA_MCP_API_KEY_FILE)

  • Все остальные конечные точки требуют его при каждом вызове:

Authorization: Bearer <key>
# or equivalently
X-API-Key: <key>

Ключ никогда не логируется.

Хостинговые конечные точки

Endpoint

Auth

Назначение

GET /health

нет

Проверка готовности: {"status":"ok","uptime":N,"sessions":N} — опрашивайте, а не спите

GET /sessions

ключ

Открытые базы данных, включая время последнего доступа

POST /upload?filename=NAME

ключ

Потоковая загрузка бинарного содержимого тела запроса в IDA_MCP_UPLOAD_DIR; возвращает путь для idb_open

Совершите:

# provisioning flow
while ! curl -sf http://10.0.0.4:9999/health >/dev/null; do sleep 1; done
KEY=$(curl -s http://10.0.0.4:9999/key | jq -r .key)
curl -H "Authorization: Bearer $KEY" --data-binary @sample.elf \
     "http://10.0.0.4:9999/upload?filename=sample.elf"

Полезные флаги:

uv run idalib-mcp --host 127.0.0.1 --port 9999   # override bind address
uv run idalib-mcp --max-workers 8                # concurrent databases (default 4, 0 = unlimited)
uv run idalib-mcp --unsafe                       # enable destructive/debugger tools (DANGEROUS)
uv run idalib-mcp --profile tools.txt            # restrict worker tools to a profile file
uv run idalib-mcp --stdio                        # stdio transport instead of HTTP
uv run idalib-mcp path/to/binary                 # open a binary at startup

Инструменты жизненного цикла сессии: idb_open, idb_list, idb_close — откройте одну базу данных за сессию; каждая сессия получает собственный изолированный процесс воркера.

Запуск GUI-прокси (интерактивный IDA)

Запустите плагин внутри IDA (Edit -> Plugins -> MCP или Ctrl+Alt+M), затем:

uv run ida-pro-mcp                                   # stdio proxy, auto-discovers IDA
uv run ida-pro-mcp --transport http://127.0.0.1:9999 # serve HTTP instead

Подключение MCP-клиента

Универсальная JSON-конфигурация (HTTP-транспорт):

{
  "mcpServers": {
    "ida-instances": {
      "url": "http://your-host:9999/mcp",
      "headers": {
        "Authorization": "Bearer <key-from-/key>"
      }
    }
  }
}

Claude Code:

claude mcp add --transport http ida-instances http://your-host:9999/mcp \
  --header "Authorization: Bearer <key-from-/key>"

Для GUI-прокси через stdio выполните uv run ida-pro-mcp --config и вставьте JSON в ваш клиент.

Конфигурация (переменные окружения)

Variable

Default

Смысл

IDA_MCP_OPEN_TIMEOUT

1800

Максимум секунд на открытие + автоматический анализ до завершения (0 = без ограничений)

IDA_MCP_WORKER_CALL_TIMEOUT

900

Страховочный тайм-аут для каждого пересылаемого вызова инструмента

IDA_MCP_PROXY_TIMEOUT

900

Тайм-аут GUI-прокси → апстрим IDA (0 = без ограничений)

IDA_MCP_TRACE_MAX_MB

64

Лимит журнала трассировки, хранящегося внутри IDB

IDA_MCP_MAX_WORKERS

4

Значение --max-workers по умолчанию

IDA_MCP_HEALTH_TCP_TIMEOUT / IDA_MCP_HEALTH_RPC_TIMEOUT

2.0 / 10.0

Бюджеты проверки работоспособности

IDA_MCP_IDLE_TIMEOUT

60

Количество минут до автоматического закрытия неактивной сессии (0 отключает)

IDA_MCP_MAX_UPLOAD_MB

100

Лимит для тела запроса POST /upload

IDA_MCP_UPLOAD_DIR

~/.idapro/mcp/uploads

Каталог хранения загруженных файлов

IDA_MCP_API_KEY / IDA_MCP_API_KEY_FILE

– / ~/.idapro/mcp/api_key

Задать или переместить ключ экземпляра

IDA_MCP_SHUTDOWN_SAVE_TIMEOUT / IDA_MCP_SHUTDOWN_SAVE_BUDGET

30 / 120

Бюджет сохранения на базу / общий бюджет при завершении по SIGTERM

IDA_MCP_NO_UPDATE_CHECK

не задано

Установите 1, чтобы отключить проверку релизов GitHub

Заметки безопасности: ключ закрывает все HTTP-конечные точки и супервизора, и два GUI-плагина (плагин может выполнять произвольный код через py_eval, поэтому он защищён ключом даже на loopback). Это bearer-токен — любой, кто его получит, получит в распоряжение экземпляр; добавьте обратный TLS-прокси, если ключ уходит из вашей доверенной сети. Браузер может передать ключ через ?key=<key> (удобно для /config.html).

Тестирование

IDADIR=/path/to/ida uv run ida-mcp-test tests/crackme03.elf -q
IDADIR=/path/to/ida uv run ida-mcp-test tests/typed_fixture.elf -q
IDADIR=/path/to/ida uv run ida-mcp-test tests/crackme03.elf -c api_analysis   # one category
IDADIR=/path/to/ida uv run coverage run -m ida_pro_mcp.test tests/crackme03.elf -q

Лицензия

MIT — унаследовано от апстрима ida-pro-mcp. Имена продуктов (IDA Pro, Hex-Rays) являются товарными знаками Hex-Rays SA; этот проект требует вашей собственной действующей лицензии IDA Pro.

Related MCP Connectors

Related MCP Servers