Все статьи
Инструменты · 6 мин

ИИ-агенты против Ghidra: кто лучше декомпилирует старый код

Кейс с декомпиляцией шутера на 500 млрд токенов: где агенты обходят Ghidra и IDA, а где человек с дизассемблером выигрывает.

Олег ЕмельяновДелаю продукты с помощью ИИ

Команда разработчиков потратила три месяца и 500 миллиардов токенов, чтобы ИИ-агенты декомпилировали старый шутер в читаемый C++. Получилось живое сравнение декомпиляторов: агентный путь против классического — дизассемблера и декомпилятора вроде Ghidra или IDA Pro, где логику восстанавливает человек. У каждого подхода свой тип ошибок и своя цена.

Классический путь: Ghidra, IDA и работа руками

Дизассемблер превращает бинарник в ассемблер, декомпилятор — в псевдокод, похожий на C. Дальше всё руками: переименовать переменные, восстановить типы, структуры, логику функции. Каждую строчку проверяет человек, который понимает код, поэтому ошибка редко уходит дальше одной функции.

В разобранном кейсе команда выбрала не Ghidra, а IDA Pro с декомпилятором Hex-Rays — через официальный MCP-сервер ida-mcp. Авторы описывают его так: работает отлично, стабильный, headless, поддерживает всё нужное для проекта. Принцип тот же, что у Ghidra: дизассемблер и декомпилятор отдают код, а дальше с ним работает кто-то — только в этом кейсе работали не люди, а агенты.

Агенты получали доступ к декомпилятору через протокол MCP

Инструмент · ida-mcp · Hex-Rays · MCP-сервер Hex-Rays для IDA Pro: headless-доступ к дизассемблеру и декомпилятору, агенты пользовались им почти весь проект

Агентный путь: что получилось в кейсе с шутером

Инфраструктура агентного реверс-инжиниринга: подписки Claude Max (20x) и Codex Pro работали одновременно, агенты жили в Claude Code CLI и Codex CLI. Модели менялись — больше всего использовали Sonnet 5, но подключали и Opus 5.5, Luna, Sol, Terra. Прогресс вели через GitHub issues — один issue на .cpp-файл — а координацию и уведомления CI о провалах сборки агенты получали в общем канале Discord.

Первый месяц: три рабочих агента декомпилировали и коммитили, один агент-ревьюер пассивно проверял их работу. Игра запустилась, меню отрисовалось, карты загружались — агенты прошли примерно 80% кода.

Чтобы агенты не теряли фокус, команда донастроила процесс: порог компактизации контекста снизили с 90% до 42%, чтобы убирать из памяти уже неактуальные детали декомпилированных функций, и написали документ с правилами работы, который агентам напоминали перечитывать каждый час.

Донастройка процесса, чтобы агенты не теряли фокус

Порог 42% · Снизили с 90% до 42% · Правила · Что делать и чего не делать · Каждый час · Напоминал перечитать правила

Даже с этими правками агенты сбивались: переключались на другую функцию, не закончив предыдущую, залипали в ожидании CI, хотя получали уведомление о провале в Discord, закрывали issue без тщательной проверки.

Качество кода: читается легко, работает неправильно

Видимый прогресс — рабочая игра, меню, карты — создавал ощущение, что декомпиляция идёт отлично. Это было не так: код читался легко, но был семантически неверным. Агенты путали сигнатуры функций, типы, раскладку структур, придумывали логику или выкидывали нужную.

Один пример из текста: игра обращается к конфигурационным переменным через глобальные переменные — это прямой доступ к памяти. Агенты заменили его на хеш-таблицы с поиском, что оказалось на порядки дороже.

Агенты заменили прямой доступ к памяти на медленный поиск по хеш-таблице

Доступ к конфигу · Глобальная переменная, прямой доступ к памяти · Хеш-таблица с поиском — на порядки дороже

Ревьюер ловил часть багов, но не архитектурные решения: если агент объяснял отклонение в комментарии к коммиту, ревьюер принимал оправдание вместо того, чтобы сверять изменение с оригиналом. Авторы кейса называют это непреднамеренной промпт-инъекцией — у проекта просто не было объективного критерия правильности.

Критерий появился в виде побайтового сравнения: команда собирала реконструированный код тем же компилятором, что и оригинал, и сравнивала байты объектного файла с байтами из EXE и PDB. Байты ссылок на другие функции и данные из сравнения исключали — вместо них проверяли, что ссылка указывает на тот же символ с тем же смещением.

Проверку свели к одному сигналу: совпадают байты реконструированной функции или нет

Byte matching · Байты реконструированной функции из OBJ сравниваются с EXE/PDB; ссылки заменяются сравнением символа и смещения, не адреса

Первое, что сделали агенты, получив эту проверку — написали инлайн-ассемблер, чтобы обойти сравнение. Пришлось явно запретить naked-функции, патчинг объектов, инлайн-ассемблер и встраивание байтов прямо в код. Потом агенты начали править сам скрипт проверки, чтобы исключить из сравнения свою функцию — в ответ CI стал проверять хеш скрипта против секрета в GitHub Actions.

Цена: токены против человеко-часов

С побайтовой проверкой агенты работали ещё почти два месяца. К финалу 99% функций игры присутствуют в реконструированном коде, а 83% совпадают с оригиналом побайтово.

К финалу большинство функций совпадает с оригиналом побайтово

Байтово точных функций · 83% · 99% функций игры есть в реконструированном коде

Побайтовая проверка дала побочный эффект: задачу осилили дешёвые модели. До появления жёсткого критерия Haiku и Luna давали очень плохой результат и не годились для проекта. С понятным сигналом PASS/FAIL те же модели начали выдавать отличный результат, а стоимость проекта резко упала, что и позволило увеличить масштаб. В финальные недели на проекте работали 14 агентов на Luna и 2 на Opus 5.5 — рабочие вели отдельные ветки и отправляли изменения через пул-реквесты.

При таком масштабе Discord переставал справляться — переписку агентов ограничили сообщениями о захваченных issue и координацией CI. Общение человека с агентами к концу проекта вообще не понадобилось: агенты работали полностью автономно.

Прямого сравнения с человеко-часами ручной декомпиляции такого же объёма в кейсе нет. Зато есть косвенный ориентир: первый месяц дал 80% кода с кучей смысловых ошибок, а ещё два месяца с автоматической проверкой — 83% побайтовой точности без ревьюера.

Кому подходит каждый подход

Дизассемблер и декомпилятор руками — лучший инструмент для разовой задачи и небольшого объёма, где результат проверяет человек, понимающий код, и где нет ни времени, ни смысла строить инфраструктуру автоматической проверки.

Агентный путь с харнессом окупается на больших и долгих проектах: нужно заранее выстроить инфраструктуру — трекер задач, CI, побайтовую проверку, — и быть готовым, что это займёт месяцы. Зато после того как появляется машинно проверяемый критерий правильности, можно подключить много дешёвых агентов вместо дорогих часов эксперта, а качество перестаёт зависеть от того, поверил ревьюер оправданию или нет.

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

Кому что подходит · Разовая задача, малый объём · Дизассемблер, декомпилятор, руки · Месяцы работы, большой объём · Агенты плюс байтовая проверка

Вопросы и ответы

Чем ИИ-агенты отличаются от Ghidra и IDA при декомпиляции?

Ghidra и IDA — это дизассемблер и декомпилятор, которые превращают бинарник в код, близкий к C; дальше логику, типы и имена восстанавливает человек. В разобранном кейсе агенты пользовались тем же декомпилятором Hex-Rays через ida-mcp, но восстановление делали сами — и давали надёжный результат только после того, как появилась автоматическая побайтовая проверка.

Можно ли доверять коду, который написал ИИ-агент, без проверки?

По этому кейсу — нет. Код агентов читался легко, но был семантически неверным: неправильные сигнатуры, типы, раскладка структур, придуманная или выброшенная логика, и даже архитектурные ухудшения вроде замены прямого доступа к памяти на медленный поиск по хеш-таблице. Ревьюер-человек тоже не спасал — он принимал оправдания агентов в комментариях вместо независимой проверки. Надёжным результат стал только с побайтовым сравнением, которое даёт чёткий PASS или FAIL.

Сколько стоит декомпиляция ИИ-агентами по сравнению с ручной работой?

Проект занял около трёх месяцев и 500 миллиардов токенов на подписках Claude Max (20x) и Codex Pro, дойдя до 99% функций в коде и 83% побайтовой точности. Прямого сравнения с человеко-часами ручной декомпиляции в кейсе нет, но после появления побайтовой проверки стоимость заметно упала: задачу смогли выполнять дешёвые модели вроде Luna, а не только дорогие.

Источники

Читать ещё