Параллельный бинарный анализ в IDA Pro с AI-управляемым именованием функций, графом знаний Neo4j и движком эмуляции/хукинга/фаддзинга phantomrt для автоматизированного реверс-инжиниринга форматов PE, ELF и NSO.
Призрак сквозь бинарники.
Локальный AI-ассистент для реверс-инжиниринга: параллельный анализ IDA Pro, AI-именование функций, терминал, который не бесит, граф знаний Neo4j всего, что он когда-либо выяснил, и MCP-сервер, чтобы Claude мог напрямую искать и прослеживать связи в этом графе.
А теперь — с phantomrt — он не просто читает стены. Он проходит сквозь них: эмулирует, перехватывает и фаззит функции, которые он назвал, и записывает то, что на самом деле происходит, обратно в граф.
✓ 00 ✓ 01 ✓ 02 ✓ 03 ▸ 04 · 05 · 06 · 07 ✓ 08 ✓ 09 ✓ 10 ✓ 11 ✓ 12 ✓ 13 ▸ 14 · 15
14/16 shards │ 141,203 functions found ████████████████████████████░░░░ 89% ~4s remaining
## Что это такое
Автоанализ IDA Pro выполняется в одном потоке. Для 34 МБ DLL-файла il2cpp это *минуты*. spectrIDA разбивает бинарник на N фрагментов, запускает их параллельно через idalib, объединяет в один `.i64`, а затем позволяет точно настроенной 8B модели **называть каждую функцию** — всё из одного терминального интерфейса с киберпанк-темой и ровно таким количеством сарказма, какое нужно.
Это Глава 1, и она самодостаточна: чистая скорость, никакого ИИ не требуется, если не хотите.
Глава 2 превращает результат в нечто, переживающее сессию, — граф Neo4j, в котором клиент MCP (Claude, [pi](https://pi.dev) или любой другой, понимающий MCP) может реально *жить*, вместо того чтобы копировать вывод декомпилятора в окно чата по одной функции за раз:```
Binary ─▶ Parallel IDA Analysis ─▶ Demangle ─▶ AI Naming ─▶ Neo4j Graph ─▶ MCP Server ─▶ Claude
(N idalib shards) (free, real) (stripped (persists, (search/chain/
leftovers forever, rename, live)
only) across sessions)
Глава 3 (phantomrt) добавляет ту половину, которой у статических инструментов никогда не было: она запускает код. Эмулирует функцию без ОС (работает с бинарниками, которые даже нельзя запустить, например, Switch .nso), или подключается к живому процессу, или фазит его — и наносит вердикт (crashes / needs live state / clean) на тот же узел графа, что и имя.
Полный обзор, включая то, что ещё осталось в списке задач, находится в Главе 2 и Главе 3.
Это не Ghidra. Он делает одну раздражающую вещь (медленный анализ + именование) быстро, и им действительно весело пользоваться. 199 загрузок говорят сами за себя.
Никакого облака. Никакой телеметрии. Работает полностью на вашем компьютере.
| задача | время |
|---|---|
| Among Us DLL — однопоточная IDA | ~4 часов |
| Among Us DLL — spectrIDA (16 рабочих процессов) | 67 секунд |
| Бинарник с 153 649 функциями — полный проход именования | за ночь |
| Обзор бинарника (что он делает?) | ~30 секунд |
Оборудование, на котором проводились измерения: AMD Ryzen 7 5800X3D (8C/16T), 32 ГБ ОЗУ, RTX 4070 12 ГБ. Другое оборудование изменяет показатели параллельного анализа (больше ядер, больше шардов, быстрее); показатели именования в основном зависят от GPU. Цифры 4 часа/67 секунд для Among Us относятся ко времени до Главы 2 и не перепроверяются независимо в каждом релизе — запустите spectrida analyze сами, если хотите получить цифру для своей машины и своего бинарника; результаты варьируются в зависимости от плотности шардов и размера бинарника.
Цифры, фактически перепроверенные во время разработки Главы 2, на том же оборудовании:
| бинарник | функции | задача | время / результат |
|---|---|---|---|
| test_small.dll (PE) | 189 | параллельный анализ, 4 рабочих процесса, CLI | 6.4с |
| test_small.dll (PE) | 164 | полный конвейер MCP (анализ + демангинг + запись графа) | 9.8с |
| main.nso — Mario Odyssey (NSO), 16 рабочих процессов | 28 038 начальных функций | фаза параллельного шардированного сканирования | 54.5с |
| main.nso — Mario Odyssey (NSO), 16 рабочих процессов | 74 790 всего функций | + фаза слияния/полного анализа | 143.1с |
| main.nso — Mario Odyssey (NSO), 16 рабочих процессов | 74 790 всего функций | общее астрономическое время | 197.6с |
| main.nso — Mario Odyssey (NSO) | 74 790 | разрешено только через демангинг (Itanium ABI, бесплатно, без ИИ) | 67 300 (90.0%) |
Эта строка NSO является реальным эквивалентом старой претензии Among Us «4 часа → 67 секунд», замеренной заново в этом релизе на бинарнике Switch с 74 790 функциями, без участия ИИ в именовании (только демангинг — populate=False). Параллельная фаза (16 ядер, ~55 с) выполняет начальное шардированное обнаружение; фаза слияния (~143 с) по замыслу однопоточная — одна база данных IDA, один писатель — так что если вы во время этой части смотрите в Диспетчер задач и видите, что 15 ядер дремлют, это не отчёт об ошибке, это физика.
Получение честной цифры здесь было своей собственной маленькой историей ужасов. Первая версия поддержки NSO работала чисто, завершилась с кодом 0 и гордо вернула 727 функций для бинарника, в котором их примерно 75 000 — не авария, просто эффектно, уверенно неправильно, что почему-то ещё хуже. Оказалось, что у IDA нет родного загрузчика NSO, поэтому файл молча загрузился как обычный x86 ("metapc"), хотя Switch с самого запуска был на ARM64. Каждый шард запускал сканер прологов x86 на чистые инструкции AArch64 и называл «функцией» то, что случайно совпало. Исправление архитектуры само по себе ничего не исправило, потому что бинарник также всё ещё был сжат LZ4 в памяти — так что половина того, что сканировалось, была, мягко говоря, шумом. И даже когда он был правильно распакован и помечен как AArch64, каждый шард искал цели вызовов только внутри своего крошечного фрагмента бинарника, пропуская все вызовы, пересекающие границу шарда — а в бинарнике такого размера это большинство из них. Три ошибки, одна цифра, и ни одна из них не имела приличия бросить исключение. (Мы также попытались сократить фазу слияния, пропуская анализ стековых фреймов IDA — получили прекрасное ускорение и базу данных, где Hex-Rays вежливо отказался декомпилировать половину из неё. Это было быстро отменено. Вместо этого оставили гораздо меньший и гораздо более безопасный пропуск FLIRT-сигнатур, который даёт ~3% (незначительно) и ничего не ломает, что к этому моменту уже казалось чертой характера, которую стоит сохранить.)
О точности именования: это не достоверность уровня Ghidra, это модель на 8B параметров, угадывающая по псевдокоду. Общие хелперы/геттеры часто попадают в цель; глубоко игровая логика — скорее подбрасывание монетки. Переименовывайте всё, что она называет неправильно — именно для этого rename_function сохраняется напрямую в граф.