Реверс-инжиниринг скомпилированного бинарного приложения всегда напоминал работу археолога, восстанавливающего древнюю вазу из сотен мельчайших осколков. Инженер часами сидит в дизассемблере, вручную изучает таблицы символов, сопоставляет регистры процессора и пытается реконструировать высокоуровневую логику из сырого ассемблера.
Появление больших языковых моделей породило заманчивую мечту: скормить ИИ исполняемый файл или скриншот интерфейса и получить готовый исходный код за пару минут. В индустрии даже заговорили о скорой смерти традиционной разработки («software is dead»), а CEO Replit Амджад Масад публично заявил о неизбежности перехода почти всего прикладного софта в категорию легко воспроизводимого Open Source.
Однако наивные попытки попросить чат-бота «воссоздай мне приложение по картинке» быстро упираются в суровую реальность: модель рисует внешне похожие кнопки, но полностью фантазирует внутреннюю математику, теряет граничные условия и зависает на динамических анимациях.
Настоящим техническим прорывом на этой неделе стал открытый проект Reverse Engineer Anything (REA) — специализированный сервер протокола Model Context Protocol (MCP), связывающий автономных агентов вроде Claude Code с тяжеловесными промышленными инструментами обратной разработки.
Архитектурный мост между нейросетью и дизассемблером
Главная инженерная идея REA заключается в отказе от иллюзии, будто нейросеть способна «на глаз» разгадать скомпилированный код. Вместо этого REA строит строгий конвейер интроспекции, где языковая модель выступает архитектором-исследователем, а грязную работу по препарированию бинарников выполняют проверенные десятилетиями инструменты:
- Ghidra — открытый фреймворк реверс-инжиниринга от Агентства национальной безопасности США (NSA), запущенный в headless-режиме для пакетного анализа исполняемых файлов и трансляции машинного кода в C-подобный псевдокод (P-code);
- Hopper Disassembler — инструмент глубокого разбора бинарников macOS и Linux, ориентированный на структуры данных Objective-C и Swift;
- IDA Pro — признанный промышленный стандарт декомпиляции от Hex-Rays;
- Анализаторы гибридных сред — утилиты распаковки архивов ASAR в приложениях на базе Electron и парсеры сборок .NET.
Сервер REA стандартизирует интерфейсы этих утилит через открытый протокол Model Context Protocol (MCP). Когда автономный агент в терминале получает целевой файл (форматов Mach-O, ELF, PE или веб-бандл), он не пытается угадать его внутренности. Агент последовательно отправляет структурированные команды MCP-серверу, запрашивая список импортируемых библиотек, таблицы экспортируемых символов, иерархию классов и сигнатуры функций.
Пошаговая настройка MCP-сервера в среде разработки
Для подключения REA к автономной сессии Claude Code или среде Antigravity достаточно зарегистрировать сервер в локальном файле конфигурации. В конфигурации указывается путь к установленной копии Ghidra и параметры тайм-аутов, предотвращающие зависание агента на многомегабайтных бинарных модулях.
Ниже приведена базовая конфигурация подключения сервера REA в файле настроек клиента:
{
"mcpServers": {
"reverse-engineer-anything": {
"command": "npx",
"args": ["-y", "@morluto/rea-mcp-server"],
"env": {
"GHIDRA_INSTALL_PATH": "/opt/ghidra",
"ENABLE_HEADLESS_DECOMPILE": "true",
"MAX_DECOMPILE_TIMEOUT_SEC": "300"
}
}
}
}
После регистрации сервера агент получает набор инструментов: rea_analyze_binary, rea_extract_symbols, rea_decompile_function и rea_inspect_ui_layout.
Как устроен реальный цикл декомпиляции
В отличие от классического интерактивного реверса, где человек вручную переименовывает переменные sub_401000 в понятные имена, агент с REA действует по циклическому алгоритму закрытия неизвестных (hypothesis-driven exploration):

- Первичная интроспекция структуры: агент запускает headless-анализатор Ghidra для построения графа вызовов (call graph) и выделения модулей рендеринга пользовательского интерфейса;
- Сегментация критических функций: вместо чтения сотен тысяч строк сырого псевдокода агент изолирует только те подпрограммы, которые обрабатывают пользовательский ввод, события мыши или трансформацию координат;
- Сопоставление структур данных: модель анализирует структуры памяти (structs) и типы аргументов, преобразуя ассемблерные смещения полей в чистые интерфейсы TypeScript;
- Синтез на современном стеке: опираясь на восстановленные математические формулы и алгоритмы сглаживания, агент генерирует декларативные компоненты на React и Tailwind CSS с использованием HTML5 Canvas или WebGL.
Практическую проверку этого конвейера провел исследователь Ник Сараев (Nick Saraev), поставив перед Claude Code задачу восстановить системную утилиту macOS Preview.
При попытке решить задачу стандартным промптом модель сгенерировала примитивное поле с задержками при отрисовке и некорректным поведением ластика. Подключив REA, агент потратил около десяти минут на извлечение P-code из оригинального бинарника, обнаружил точный математический алгоритм квадратичных кривых Безье для сглаживания штрихов и воссоздал инструмент векторных аннотаций, неотличимый от оригинала по отзывчивости и координатной сетке.
В другом тесте сообщество за 45 минут полностью реконструировало интерактивную логику сенсорного пульта Apple TV Remote, включая обработку жестов свайпа и тактильные задержки.
Для запуска подобного исследования в терминале разработчик формулирует задачу агенту, указывая путь к изолированному бинарному файлу:
# Запуск сессии Claude Code в директории проекта
claude
# Промпт для исследования модуля аннотаций:
# "Используй REA MCP для анализа бинарника ./bin/PreviewEngine.
# Извлеки сигнатуры функций модуля рисования, найди структуры точек
# и параметры сглаживания линий. На основе декомпилированного
# алгоритма создай чистый React-компонент со сглаживанием Безье."
Получив доступ к декомпилированному псевдокоду математического модуля, агент преобразует низкоуровневые вычисления C++ в чистый и безопасный компонент React с отрисовкой на холсте Canvas:
import React, { useRef, useState } from 'react';
interface AnnotationPoint {
x: number;
y: number;
pressure?: number;
}
export const CanvasAnnotationTool: React.FC = () => {
const canvasRef = useRef<HTMLCanvasElement | null>(null);
const [isDrawing, setIsDrawing] = useState(false);
const [points, setPoints] = useState<AnnotationPoint[]>([]);
const handleMouseDown = (e: React.MouseEvent<HTMLCanvasElement>) => {
setIsDrawing(true);
const rect = e.currentTarget.getBoundingClientRect();
setPoints([{ x: e.clientX - rect.left, y: e.clientY - rect.top }]);
};
const handleMouseMove = (e: React.MouseEvent<HTMLCanvasElement>) => {
if (!isDrawing) return;
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext('2d');
if (!ctx) return;
const rect = canvas.getBoundingClientRect();
const newPoint = { x: e.clientX - rect.left, y: e.clientY - rect.top };
const updated = [...points, newPoint];
setPoints(updated);
// Воспроизведение оригинального сглаживания через квадратичные кривые Безье
if (updated.length > 2) {
const p1 = updated[updated.length - 2];
const p2 = updated[updated.length - 1];
const midPoint = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };
ctx.beginPath();
ctx.moveTo(p1.x, p1.y);
ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);
ctx.strokeStyle = '#ef4444';
ctx.lineWidth = 3;
ctx.lineCap = 'round';
ctx.stroke();
}
};
return (
<div className="flex flex-col items-center p-4 bg-slate-900 rounded-xl shadow-lg">
<div className="flex gap-2 mb-2">
<span className="text-xs text-slate-400">Preview Engine (Reconstructed Canvas)</span>
</div>
<canvas
ref={canvasRef}
width={640}
height={480}
className="bg-white rounded border border-slate-700 cursor-crosshair"
onMouseDown={handleMouseDown}
onMouseMove={handleMouseMove}
onMouseUp={() => setIsDrawing(false)}
/>
</div>
);
};
Где заканчивается магия и начинаются инженерные барьеры
Несмотря на вирусный энтузиазм в соцсетях, REA не является волшебной кнопкой «сделай клон чужого бизнеса». Технический анализ вскрывает жесткие границы применимости инструмента:
- Невидимый бэкенд: REA анализирует только то, что физически присутствует на клиентском устройстве. Серверные базы данных, закрытые микросервисы, сложные алгоритмы ранжирования и антифрод-системы остаются недосягаемыми за сетевыми API-шлюзами;
- Обфускация и виртуализация кода: коммерческие игры и корпоративное ПО, защищенное системами Denuvo или VMProtect, превращают поток инструкций в спагетти из искусственных переходов и зашифрованных байткодов. На таких файлах headless-декомпилятор Ghidra генерирует мегабайты неразрешимого псевдокода, в котором языковая модель быстро теряет контекст и уходит в бесконечные галлюцинации;
- Безопасность хостовой машины: анализ непроверенных бинарных файлов без строгой изоляции в виртуальной машине (sandbox) категорически опасен. Исполнение неизвестного бинарника или парсинг уязвимого формата может привести к компрометации машины разработчика;
- Юридические и этические риски: прямое воспроизведение коммерческого софта без лицензии прямо нарушает авторские права и пользовательские соглашения (EULA).
Практический вывод для инженеров
Инструмент REA ценен не возможностью слепого копирования чужого софта, а качественным ускорением легитимных инженерных задач: модернизации устаревших legacy-систем компании, к которым давно утеряны исходники, аудита безопасности сторонних библиотек и быстрого прототипирования интерактивных интерфейсов.
Модели перестают быть просто генераторами текста в браузере. Получая через протокол MCP доступ к классическим инструментам инженерии, они превращаются в полноценных операторов, способных глубоко понимать внутреннее устройство существующего цифрового мира.
