Опубликовано
REA в Hermes: 229 инструментов реверса и промокод, разобранный вслепую за три минуты
Автор: Гусев Николай [портфолио]
Обновлено
Темы: ai-agents, reverse-engineering, hermes, mcp
Коротко: Ставим REA 6.8.0 в Hermes Agent, грабли с версией Node, слепое восстановление промокод-валидатора из бандла за три минуты и подготовка к разбору смарт-ТВ.
Пост про REA из ai_for_devs уже обошёл каналы, но это был пересказ чужого README. Я поставил инструмент, подключил к Hermes, собрал подопытного и отдал его агенту на расчленёнку. Теперь на месте цифры, а не обещания. Дальше - живые числа, одна заминка с Node, подготовка к вскрытию смарт-ТВ и демо, которое вы повторите за вечер.
Что это такое, если коротко
REA (Reverse Engineer Anything) - инструмент с открытым кодом (MIT), который подключает вашего агента к набору средств реверс-инжиниринга через один MCP-сервер. На момент написания у репозитория около 390 тысяч звёзд на GitHub, в каталоге 229 MCP-инструментов и 175 команд CLI. Сайт проекта - rea.tools. Про экосистему MCP у меня есть отдельный разбор: MCP-экосистема агента.
Идея простая до безобразия. У вас есть приложение без исходников: exe, APK, Electron-сборка, минифицированный JS-бандл. Вы даёте его агенту и спрашиваете: "как устроена вот эта функция?" REA собирает доказательства (evidence): что наблюдалось, что выведено логически, что осталось неизвестным. Опираясь на них, агент объясняет поведение приложения и может собрать пере-реализацию. Это ровно та схема с проверки "same output?", которую авторы рисуют на всех презентациях: rebuild, сравнение с оригиналом, фикс, снова сравнение.
Честности ради: нашумевший тезис поста ai_for_devs о том, что с Claude Code и Codex REA почти неюзабельна из-за встроенных отказников, я не проверял (что такое харнесс и как он держит агента в узде - отдельный разбор ZCode). Ни туда, ни к uncensored-моделям я не ходил. Всё, что ниже, сделано в Hermes на модели GLM 5.3 Flash.
Установка: одна граблина
Ставится пакет одной командой, дальше его собственный setup прописывает регистрацию в конфиг агента:
npm install -g rea-agents
rea setup --client hermes --skill --yes
Приятная неожиданность: REA из коробки знает Hermes как клиента. Setup пишет прямо в config.yaml и сам ставит скилл с инструкциями (появится в списке как reverse-engineer-anything). Бэкап конфига создаётся до изменений, diff до и после - ровно один новый блок.
Граблина: setup жёстко требует Node.js не старше 22.23.4, 24.22.1 или 26.12.1. У меня в системе стоял 22.18.0, и setup вежливо отказывался что-либо делать, хотя сам MCP-сервер на нём прекрасно запускался. Обновлять системный Node ради одного инструмента я не стал: скачал portable-сборку 24.22.1 (LTS Krypton, распаковка в папку инструментов Hermes), запустил setup с ней первой в PATH. Регистрация привязывается к тому самому исполняемому файлу Node, которым запущен setup, - в конфиге теперь абсолютный путь, и системные обновления Node регистрацию не сломают.
В получившуюся запись я добавил три параметра:
lazy: true- Hermes подключает сервер при первом вызове инструмента, а при старте читает 229 описаний из кэша схем. Без этого каждый старт агента платил бы холодный запуск сервера.timeout: 600- разбор бинарника живёт дольше двух минут.connect_timeout: 60.
Проверка протоколом: initialize, список из 229 инструментов, живой вызов inspect_analysis_settings - всё отвечает.
После перезапуска агента инструменты доступны как mcp_rea_ и сидят в отложенном каталоге. В контекст сессии они не валятся гуртом - агент находит их через поиск по каталогу.
Главный таргет: смарт-ТВ
Пока я возился с демо, в ленте прошёл свежий разбор чистки Xiaomi-телевизора от рекламы и телеметрии: хабровчанин вырезал компоненты через ADB и честно описал, как почти отрезал себе Wi-Fi. Гайдов по Mi Box - вагон. А про телевизоры Сбера у нас уже была статья: Sber TV: ADB, деблоат и VPN - отладка по Wi-Fi, отключение прожорливых пакетов, VPN только для YouTube. Теперь следующий уровень: не отключать компоненты вслепую, а заглянуть внутрь их кода. SberBox это AOSP Android 13 без сервисов Google, управляется обычным ADB, APK снимается одной командой, ничего не перепрошивается, устройство твоё.
Для APK статический JS-анализ не годится, REA подключает декомпилятор JADX как отдельный провайдер. Поставил официальный jar 0.7.1 с релиза, контрольную сумму сверил с манифестом сборки, прописал в окружение MCP-сервера. Прежде чем трогать телевизор, прогнал пайплайн на живом стороннем APK - клиенте F-Droid на 12,6 МБ: 11 960 классов загрузилось в декомпилятор, манифест раскодирован, полный инвентарь компонентов и разрешений на столе. Загрузка движка - 6,9 секунды.
Дальше план такой: снимаю по ADB фоновый сервис Салют (главный кандидат на сбор телеметрии) и лаунчер с рекламными вставками, гоняю через тот же inspect-android-package, ищу SDK аналитики, эндпоинты и что именно уходит наружу. Потом - какие пакеты можно безопасно отключить с обратимой командой возврата, как это уже описано для Xiaomi.
Разбор телевизора в этой статье ещё не сделан: стенд готов, дело за малым - руками на пульте включить "Отладку по Wi-Fi". Сделаю это, когда жена досмотрит "Великолепный век": телевизор сейчас занят султанами, а я уже немолод, и травмы заживают долго. Продолжение покажет, что Сбер собирает про своего зрителя и что из этого отключается без поломки функции.
Демо: вскрыть промокод-валидатор, не видя исходников
Пока телевизор под султанами, методику отрабатываю на дешёвом и безопасном подопытном. Требования: наш собственный код (никаких лицензий и чужих прав), никакой установки движков (статический анализ JS работает из коробки, без Ghidra и IDA), понятный каждому механизм. Я собрал крошечный "магазинный" валидатор промокодов: строка вида XXXX-XXXX, контрольный символ, таблица скидок. Ровно то, что менеджер продукта хочет подсмотреть у конкурента, а QA - чтобы понять, почему его код не принимает.
Сборка жертвы:
esbuild src/index.js --bundle --minify --platform=node --outfile=app/main.js
rea analyze ./app --json > evidence.json
Первый замер: бандл после минификации - 645 байт, evidence после анализа - 288 866 байт, сам анализ занял 2,6 секунды. Из шестисот байт кода REA вырастила почти триста килобайт структурированных доказательств: граф приложения, модули, разобранный код с привязкой.
Дальше самое интересное. Я запустил отдельного агента-восстановителя, которому запретил открывать исходники и дал только бандл с evidence. Условия игры: опиши алгоритм словами, напиши чистую пере-реализацию, не копируя минифицированный код.
Результат: 11 обращений к модели, три минуты работы, и на выходе - точная формула.
- Алфавит: 32 символа, без I, O, 0 и 1.
- Контрольная сумма: накапливаемое значение умножается на 3, к нему прибавляется вес символа (индекс в алфавите, помноженный на номер позиции начиная с единицы), всё по модулю 31 - и так по первым семи символам; восьмой символ должен совпасть с результатом.
- Скидка: считается только по префиксу. Тот же накопительный хеш, но с множителем 31; из результата берутся младшие 32 бита, затем таблица [10, 10, 15, 10, 20, 15, 10] выбирается по остатку от деления на 7.
Всё это восстановлено из 645 байт минифицированного кода, причём восстановитель даже заметил занятную деталь: буквы I и O проходят проверку формата, но гарантированно валятся на контрольной сумме.
Проверка "same output?"
Восстановить - половина дела. Видео про REA не зря показывает сравнение с оригиналом.
Восстановитель сам прогнал полный перебор: все 1 048 576 возможных префиксов (32 в четвёртой степени) с вычисленным валидным контрольным символом - ноль расхождений, плюс девять краевых случаев (число вместо строки, лишние пробелы, код в нижнем регистре, слишком короткий, пустая строка) - тоже ноль.
Я запустил и свой независимый дифференциальный тест: 10 000 случайных строк, половина валидного формата, половина - намеренный мусор с символами вне алфавита. Ноль расхождений. Из тех, что прошли проверку, распределились скидки: 95 раз по 10%, 47 по 15%, 22 по 20%.
Итого вся петля "вскрыть - пере-собрать - доказать эквивалентность" заняла меньше десяти минут, из которых почти всё - моя подготовка стенда. Само вскрытие: три минуты агентского времени.
Чего это НЕ доказывает
Чтобы не скатиться в рекламу, границы прогонов:
- Таргет был JavaScript-бандлом. Нативные бинарники (exe, ELF) без анализа-движка - Ghidra, Hopper или IDA - REA не берёт, у меня они не настроены. Это отдельный вечер: движки bring-your-own, ставятся переменными окружения.
- Один простой таргет не доказывает, что так же гладко вскроется настоящий Electron-монстр вроде Obsidian: авторы REA сами пишут, что полный evidence по нему - сотни мегабайт, и дают механизмы проекций, чтобы агент не захлебнулся.
- Восстановителю попалась типовая задача: контрольные суммы и таблицы скидок модель видела тысячи раз. С уникальным алгоритмом доля угаданного будет другой - поэтому и существует проверка same output, а не "поверь на слово".
- Тезис про отказники Claude Code и Codex пришёл из чужого поста; в этом прогоне его не проверяли.
Кому и зачем
Менеджеру продукта это способ за вечер понять, как устроена фича конкурента, которую вы видите только снаружи. DevOps ставит статический анализ бандла в CI одной командой CLI, а evidence сохраняется в артефакты. QA получает быстрый способ понять реальное поведение валидации, не читая исходники, которых у вас часто просто нет.
Главное правило то же, что в посте-первоисточнике: вскрывать только то, что ваше, или то, на что есть явное разрешение. Лицензии читайте до, а не после. Мой демо-валидатор я написал сам, поэтому спал спокойно.
Мануал по установке в Hermes с командами, откатом и диагностикой лежит в репозитории: docs/hermes-setup.md. Там же весь демо-стенд: жертва, собранный бандл, пере-реализация и дифф-тест, повторяется несколькими командами из README методики. Для тех, кому GitHub недоступен, зеркало на GitFlic.
Гусев Николай