REA — реверс-инжиниринг любых приложений через агента
📂 Исходный код на GitHubCLI и MCP-сервер (npm-пакет rea-agents, TypeScript) для реверс-инжиниринга: открывает бинарники, приложения Electron, сборки .NET и веб-страницы, ищет строки и функции, строит граф вызовов и декомпилирует код. Для глубокого анализа подключает Hopper или Ghidra, всё считает локально, лицензия MIT
Вы нашли в чужой программе функцию, которая вам нужна в своём продукте. Открытых исходников нет, но есть бинарный файл, .app, архив .asar или сборка .NET. REA даёт AI-агенту инструменты, чтобы разобрать чужую программу и объяснить, как в ней устроена нужная функция. Агент показывает доказательства и только потом пишет свою версию.
Главное отличие от обычного дизассемблера в том, что результат возвращается не человеку в интерфейсе, а модели. Всё общение идёт через CLI или MCP, агент сам выбирает инструменты и сам строит план исследования.
Модель исследования
Разработчики REA описывают работу в три шага:
- Декомпиляция. Открываем приложение и достаём читаемый код, строки, имена функций и другие подсказки о том, как оно работает.
- Понимание. Идём по коду от одной части приложения к другой, пока агент не может уверенно объяснить, как устроена нужная функция.
- Воссоздание. Переносим найденное в свой проект, под свой стек и под свои требования.
Отдельно авторы подчёркивают: REA не обещает вернуть исходный код. Ни один дизассемблер этого не умеет. REA отдаёт псевдокод, ассемблерный листинг, символы, строки, метаданные и связи между ними.
Такое название проекта стоит понимать буквально. REA не взламывает приложение и не ищет в нём дыры. Он помогает понять, как реализована функция, чтобы вы написали такую же у себя.
Установка
npx rea-agents setup
Setup показывает план изменений до применения и делает резервную копию конфигурации. Он настраивает доступ к MCP, ставит агенту готовый сценарий работы и подключает Hopper или Ghidra — тот из двух, что уже стоит у вас. Если инструмента анализа нет, setup может поставить Hopper, но только после вашего согласия.
Настраиваются автоматически: Claude Code, Claude Desktop, Codex, Cursor, Gemini CLI и Windsurf. Devin setup обнаруживает, но не меняет его настройки. Любой другой агент с поддержкой локальных MCP-серверов подключается вручную:
{
"mcpServers": {
"rea": {
"command": "npx",
"args": ["-y", "rea-agents@3.2.1", "mcp"]
}
}
}
Для постоянной установки лучше указывать одну точную версию пакета. Команду rea можно поставить отдельно:
npm install --global rea-agents
rea setup
rea upgrade
Что нужно на компьютере
- macOS 12 или новее, либо Ubuntu 24.04+, Fedora 41+ или 64-битный Arch Linux
- Node.js 22.19+ или 24.11+ и npm
- Hopper или Ghidra — только для анализа нативных бинарников
Ghidra REA не устанавливает: нужен Ghidra 12.1.4 и 64-битный JDK 21, пути задаются через GHIDRA_INSTALL_DIR и JAVA_HOME. Через Ghidra доступны 22 операции только для чтения. Hopper даёт полный набор, включая пометки в интерфейсе. Поддержка Ghidra на Windows пока объявлена экспериментальной и не работает.
Если что-то сломалось, диагностика ничего не меняет:
npx -y rea-agents@latest doctor
rea doctor --json
Один промпт — полное исследование
После настройки достаточно перезапустить агента и спросить обычным языком:
Reverse engineer the Notes app. Find how offline search works, explain it,
and build a version for my project using TypeScript and SQLite.
Дальше REA ведёт агента по шагам:
| Шаг | Что делает агент | Инструменты REA |
|---|---|---|
| 1 | Открывает бинарник и определяет, что это | open_binary, binary_overview |
| 2 | Ищет зацепки: строки и подходящие функции | search_strings, search_procedures, list_names |
| 3 | Связывает зацепки с исполняемым кодом | find_xrefs_to_name, xrefs, procedure_callers |
| 4 | Восстанавливает поток управления | get_call_graph, procedure_callees, procedure_info |
| 5 | Декомпилирует нужные процедуры | procedure_pseudo_code, procedure_assembly, batch_decompile |
| 6 | Пишет фичу в ваш проект | обычные инструменты агента: файлы и тесты |
Первые пять шагов делает REA. Шестой — обычная работа агента с файлами и тестами, на основе того, что он узнал о чужом приложении.
Из чего состоит каталог инструментов
Всего в MCP-сервере 122 инструмента. Они собраны в группы:
| Группа | Сколько | Примеры задач |
|---|---|---|
| Анализ нативного кода | 39 | функции, псевдокод, ассемблер, строки, символы, вызовы, ссылки, аннотации, чтение байтов |
| Сценарии исследования | 15 | обзор приложения, подробный разбор одной функции, поиск Swift и Objective-C, пакетная декомпиляция |
| Утилиты macOS | 7 | метаданные Mach-O, подписи кода, plist, архитектуры, разбор имён Swift |
| Граф артефактов | 5 | описи директорий и пакетов, скомпилированные файлы Interface Builder, каталоги ресурсов Apple |
| Сборки .NET (PE/CLI) | 8 | метаданные, инструкции CIL, зависимости, сравнение сборок |
| Наблюдение за браузером | 9 | структура страницы, метаданные сети, скрипты, скриншоты, сценарии в браузере |
| Анализ Electron | 5 | наблюдение за рендерером, статическая карта приложения, сценарии кликов и ожиданий |
| Среда выполнения JavaScript | 2 | поиск целей Node/Electron Inspector, события контекста выполнения |
| Сценарии приложений | 10 | трассировка фичи через слои, сравнение сборок, сравнение с исходником |
| Рабочая среда и наблюдение | 22 | сессии, пакеты доказательств, сравнения, список открытых вопросов |
Логика разделения простая. Публичный интерфейс описывает, что агент хочет узнать. Провайдер решает, как это выяснить. Часть macOS-утилит отвечает на типовые вопросы вообще без запуска Hopper. Hopper берёт на себя глубокий анализ нативного кода.
Что REA умеет разбирать
- Нативные бинарники. Mach-O, ELF, PE и папки
.appчерез Hopper или Ghidra: функции, строки, ассемблер, декомпиляция, вызовы и ссылки. Hopper дополнительно принимает базы.hopи умеет ставить аннотации. - Пакеты и ресурсы. Директории, ZIP, APK, IPA, ASAR, plist, скомпилированные файлы Interface Builder и каталоги ресурсов Apple. Обход DMG на macOS требует системной поддержки монтирования.
- JavaScript и Electron. Карта модулей, импорты, source map, маршруты, каналы IPC, хранилища и нативные дополнения — без запуска приложения. Подробности в гайде по JavaScript-приложениям.
- Веб-сайты. Наблюдение за уже открытой вкладкой Chrome через CDP на локальном порту. Инструменты не переходят по ссылкам и не выполняют JavaScript страницы. Подробности в гайде по наблюдению за браузером.
- Сборки .NET. Метаданные и инструкции CIL, сравнение сборок, проверка объявленных нативных зависимостей — без загрузки и запуска сборки. Подробности в гайде по управляемому коду.
- Поведение процессов. Вы описываете, что запустить и какие действия выполнить, потом сравниваете две записи поведения. Это не защищённая среда: процесс запускается с вашими правами пользователя. Подробности в описании Process Capture.
Подробное описание нативной части — в гайде по нативному анализу. Список инструментов с точными числами генерируется из исходников и лежит в product-catalog.json.
Доказательства вместо догадок
Главная мысль REA проста: рядом с выводом всегда лежат доказательства и ограничения. К каждому заключению прикладывается, что именно инструмент наблюдал и что он не смог определить.
Отсюда две особенности. Первая: анализ Ghidra работает с временной копией цели, а временный проект удаляется при закрытии сессии. Вторая: проверка воссоздания возвращает pass, fail или unknown, а не молчаливый успех. Незакрытые вопросы REA ведёт отдельным списком.
Один и тот же запрос можно сохранить в снимок и переиспользовать, не запуская анализатор заново:
rea analyze /absolute/path/to/app --snapshot /absolute/path/to/analysis/app.json
Снимок переиспользуется только если совпадают байты цели, операция, параметры, инструмент анализа и настройки. Запросы, зависящие от курсора, не кэшируются.
Работа из терминала
npx -y rea-agents@latest analyze /Applications/Notes.app
npx -y rea-agents@latest search /Applications/Notes.app "offline"
npx -y rea-agents@latest function /Applications/Notes.app 0x1000
npx -y rea-agents@latest xrefs /Applications/Notes.app 0x1000
npx -y rea-agents@latest trace /Applications/Notes.app "offline"
npx -y rea-agents@latest capabilities
npx -y rea-agents@latest providers
Команда analyze и inspect делают одно и то же. Если нужен только листинг без декомпиляции, есть rea instructions. Когда доступны Hopper и Ghidra сразу, инструмент надо выбрать явно — через --provider или provider_id в MCP. Молчаливого переключения между инструментами не происходит.
Коды возврата простые: 0 — операция выполнена, даже если в ответе остались предупреждения; 1 — выполнить не удалось; 128 + N — процесс убит сигналом N.
Границы применимости
- Исходный код не восстанавливается. Декомпиляция даёт псевдокод.
- Управление интерфейсом Hopper и аннотации через Ghidra недоступны.
- Статический анализ не показывает, что выполнялось в рантайме. REA это прямо пишет в результатах.
- Hopper разбирает по одной цели за раз. Пока он занят, вторую цель REA не откроет.
- Данные никуда не отправляются: у REA нет размещённого сервиса анализа. Общается модель — по её правилам.
- Удаление
rea uninstall --purge-dataстирает только то, что завёл REA: регистрации MCP и каталоги~/.rea/cacheи~/.rea/state. Hopper, Node.js и чужие MCP-серверы остаются на месте.
Итог
REA не заменяет дизассемблер. Он делает дизассемблер удобным входом для агента: 122 инструмента, готовый сценарий исследования, запуск Hopper и Ghidra, проверки окружения и доказательства рядом с каждым выводом. Лицензия MIT, проект на TypeScript, требования к Node.js и Hopper описаны в гайде по установке.
Источник: https://github.com/morluto/rea