Opus 5.5 вскрывает любую программу: реверс-инжиниринг с ИИ

Как с помощью Claude Opus 5.5, REA и Ghidra разобрать закрытый бинарник, восстановить логику и собрать свою чистую реализацию.

7 октября CEO Replit Амджад Масад написал, что реверс-инжиниринг и декомпиляция с помощью ИИ развиваются с безумной скоростью и скоро весь софт де-факто станет открытым.

Ниже разбираем полный путь от закрытого бинарника до собственной чистой реализации, где машинный код читает Claude Opus 5.5.

Как агент читает бинарник

Модель понимает только текст и дизассемблер сама запустить не может. Между ней и файлом стоит REA: он загружает бинарник в настоящий движок (Hopper, Ghidra или IDA), отдает результаты как вызываемые функции через MCP, и модель задает вопросы. Цикл повторяется. Модель просит что-то проверить, REA возвращает находки с доказательствами (адреса, байты, псевдокод, места вызова), модель решает, что спросить дальше, или пишет и тестирует реимплементацию.

Все работает локально. Наружу уходят только находки, нужные модели для рассуждений, а каждый вывод помечается как наблюдение, умозаключение или неизвестное.

Установка REA

Нужны Node.js 22 или новее и npm. Одна команда регистрирует MCP-сервер REA в вашем агенте (Claude Code, Codex, Cursor, Gemini CLI) и перед записью показывает все изменения.

npx rea-agents setup
npm install --global rea-agents
rea --help

Дизассемблер приносите свой. На macOS проще всего Hopper, Ghidra бесплатна и работает везде, IDA подойдет, если лицензия уже куплена. Для JavaScript и .NET движок вообще не нужен. После перезапуска агента команда /mcp должна показать rea: connected и список инструментов: open_binary, binary_overview, decompile, xrefs, trace и другие.

Сразу положите в CLAUDE.md домашние правила. Анализировать только то, на что у вас есть права. Каждое утверждение помечать и подкреплять адресом, байтами или псевдокодом. Начинать с краткого обзора, разделять статические и рантайм-факты, восстанавливать поведение по публичным спецификациям.

Главный рычаг качества у Opus 5.5 это уровень effort. Medium подходит для навигации, high для обычных функций, max для обфусцированного кода и тяжелой арифметики указателей.

Сначала определите тип цели

Частая ошибка новичков: открывать дизассемблер на Electron-приложении, где JavaScript лежит прямо в бандле. Первым промптом попросите агента определить тип файла (native, Electron/JS, .NET, Go, APK, WASM), выбрать подходящий инструмент REA и дать карту приложения в один абзац без глубокого анализа. Electron отдаст модули, импорты и IPC-границы за секунды. Нативный Mach-O или ELF откроется в Hopper, путь будет длиннее и глубже.

Разведка: обзор, строки, граф вызовов

Код пока не открываем. binary_overview покажет архитектуру, число функций, сегменты и точку входа. Поиск по строкам дает самые быстрые подсказки: адреса API, заголовки авторизации, тексты ошибок.

rea.open_binary { path: "/Applications/Target.app/Contents/MacOS/Target" }
rea.binary_overview {}
rea.search { query: "http" }
rea.xrefs { address: "0x100012ab0" }

Потом отсортируйте функции по числу перекрестных ссылок (xrefs). Функция со 147 вызовами обычно оказывается сердцем приложения, туда стоит тратить лучший effort. Хелпер с двумя вызовами подождет.

Декомпиляция и разметка

Декомпилятор превращает машинные инструкции в C-подобный псевдокод с именами вроде var_28. Читать его тяжело, но модели этого достаточно.

rea decompile /path/to/Target 0x100012ab0 --provider hopper --json > fn.json
rea trace /path/to/Target "sync" --provider hopper --json

Затем отдайте псевдокод Opus 5.5 и попросите переименовать переменные по смыслу, описать назначение функции одним предложением, перечислить структуры данных, назвать паттерн, переписать код на идиоматичном языке и отметить недостающие проверки. Для этого шага ставьте xhigh. В витрине REA так разобрали звук в старой игре DX-Ball: восстановленный C проходит все 3205 исходных тест-кейсов и воспроизводит все 63 скомпилированных байта. Там же есть разбор буфера обмена в Notion, сделанный целиком по JavaScript без единой строки ассемблера.

Обфускация

Здесь буксует даже лучшая модель. Elastic Security Labs прогнали Claude Opus через обфускатор Tigress на 20 задачах, и многослойную обфускацию модель не сняла ни разу. Неудачная попытка стоит примерно вдвое дороже удачной, потому что модель упорно пробует до последнего. Ставьте бюджет на функцию и останавливайтесь раньше. Перед отправкой чистите псевдокод от мусора: утилита Caveman убирает около 75% шума.

В промпте просите найти конкретные техники (control-flow flattening, opaque predicates, мертвый код, шифрование строк, разбиение функций), снять их, показать чистую функцию и оценить уверенность от 1 до 10. Если оценка ниже 6, пусть модель прямо скажет, какой контекст соседних функций ей нужен.

Рой агентов

Один чат на 500 функций начинает забывать увиденное, называет одну структуру тремя именами и противоречит себе. Работает схема из контроллера и воркеров. Контроллер кластеризует функции по графу вызовов, раздает кластеры, передает уже восстановленные структуры, чтобы имена оставались едиными, и отправляет на второй проход все, где уверенность ниже 6. Воркер берет ровно одну функцию и возвращает строгий набор полей: адрес, назначение, уверенность, использованные и новые структуры, чистый код, флаги. Отдельная инфраструктура не нужна, хватает двух промптов.

Чистая комната: как остаться в правовом поле

Чтобы результат принадлежал вам, переносите поведение программы и никогда ее код. Наблюдайте оригинал как черный ящик. Форматы файлов берите из публичных стандартов (OOXML по ECMA-376 и ISO 29500, спецификации RTF и ODF). Иконки, шрифты и шаблоны делайте сами или берите с открытой лицензией. Разделяйте роли: один агент восстанавливает поведение и пишет спецификацию, другой контекст пишет код только по спецификации и исходный анализ не видит. В спецификации не должно быть адресов, имен из декомпиляции и ассемблера.

По такой схеме сделан WordCraft из семейства ArtCraft. Это двенадцать приложений, переписанных с нуля на Rust, нативных для macOS, Windows и Linux, и почти все они запускаются в браузере через WebAssembly. Любое действие в них является именованной командой, поэтому агент управляет ими через MCP так же, как человек мышкой.

Проверка и релиз

Исходников оригинала у вас нет, поэтому сравнивать приходится поведение. Попросите агента собрать харнесс на 50 входов: 30 обычных, 10 граничных, 10 ошибочных. Прогоните их через оригинал и вашу сборку, сравните вывод побайтно или по смыслу и получите процент совпадений со списком расхождений и их серьезностью. Тестируйте по ходу работы, ведь ошибка, найденная под тремя слоями кода, обходится намного дороже. Готовую сборку публикуйте как MCP-сервер с понятными именами функций и установкой в одну строку.

Шесть ошибок, которые съедят выходные

Запускать дизассемблер на Electron-приложении, когда есть analyze_javascript_application. Выгружать все приложение до первого чтения и хоронить логику в шуме вместе с бюджетом. Читать функции по порядку в файле вместо сортировки по xrefs. Биться с многослойной обфускацией без лимита. Позволять модели переносить код оригинала в реимплементацию. Выпускать сборку без отчета о совпадении поведения.

Полезные ссылки

REA: github.com/morluto/rea
Кейсы REA: rea.tools/showcase
ArtCraft: getartcraft.com/apps
Ghidra MCP: github.com/bethington/ghidra-mcp
Ghidra: github.com/NationalSecurityAgency/ghidra
Оригинальный курс: x.com/0xMovez

Поделиться:

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *