Восстановить данные DX-Ball
расчет положения звука слева/справа.

Просмотрите исходные инструкции, определите входные данные и константы, затем проверьте восстановленный C.

Рассчитать расположение стереозвука слева / справа

В DX-Ball удар кирпича задает горизонтальное положение экрана. Звуковой код преобразует его в значение поворота влево/вправо.

Начальная функция, 0x00406400, выдает короткий результат декомпиляции: вызов функции __ftol(). REA также возвращает свои инструкции и вызывающие устройства, которые дают агенту возможность найти недостающую арифметику.

Вы знакомы с этими условиями?
  • Инструкции: шаги, выполняемые процессором, отображаются в удобочитаемой форме, такой как MOV или ADD.
  • Результат декомпиляции / псевдокод: попытка инструмента анализа преобразовать инструкции обратно в C-подобный код. В нем могут отсутствовать отдельные части, как в этом примере.
  • Вызывающая функция: функция, которая вызывает эту функцию. Она показывает, какие значения передаются.
  • Адрес: местоположение в программе, записанное в шестнадцатеричном формате, например, 0x00406400.
  • Константы: фиксированные числа, хранящиеся в программе, считываемые как необработанные байты и декодируемые.

Три улики, один расчет

  1. 01 · Инструкции Целочисленный ввод, считываемый стеком, предоставляет значение, используемое инструкциями с плавающей запятой.
  2. 02 · Вызывающий абонент - Экранная координата, по которой вызывающий абонент, ударившийся кирпичом, проходит 20 + 30 × tile_x.
  3. 03 · Байты данных Числовые константы, на которые ссылаются байты, декодируются как 1.5625, 500.0 и масштабное значение.

pan = (x × 1.5625 − 500.0) × scale

REA предоставляет инструкции, связь между вызовами функций и байты. Агент интерпретирует их вместе.

Спросите о поведении

После подключения REA к вашему агенту и настройки инструмента анализа программ с машинным кодом предоставьте локальный исполняемый файл и вопрос:

Какой инструмент анализа мне следует использовать?

REA нужен один из них для чтения собственных программ:

  • Hopper ( macOS или Linux ): Программа установки REA обнаруживает его или предлагает установить. На macOS откройте Hopper один раз и выберите демонстрационный режим или активируйте лицензию перед первым анализом.
  • Ghidra ( macOS или Linux ; экспериментальная версия Windows ): бесплатен, но требует существующей установки Ghidra 12.1.x и 64-разрядной версии JDK 21 или новее.
  • IDA ( Windows ): для существующей настройки IDA с регистрацией MCP.

Инструкции по настройке анализа программ с машинным кодом приведены в разделе Настройка анализа программ с машинным кодом.

Ваш кодирующий агент

Используйте REA, чтобы узнать, как DX-Ball рассчитывает расположение стереозвука. Объясните расчет и покажите код.

Пример запроса. Укажите своему агенту путь к локальному исполняемому файлу DX-Ball 1.07. REA не включает DX-Ball, поэтому используйте свою собственную копию или задайте такой же вопрос о другой небольшой программе Windows, которая у вас есть.

Как мне получить полный путь к файлу?
  • Windows : в проводнике щелкните файл правой кнопкой мыши и выберите "Копировать как путь". На Windows 10, удерживая Shift, щелкните правой кнопкой мыши.
  • macOS : в Finder щелкните файл правой кнопкой мыши, удерживайте опцию и выберите Копировать "..." в качестве пути.
  • Любая система: перетащите файл в окно терминала, и появится путь к нему.

Ознакомьтесь с результатами REA

Прочитайте входные данные

REA выдержка из инструкции · 0x406409
MOV EAX, dword ptr [EBP + 0x8]
MOV dword ptr [EBP + -0xc], EAX
FILD dword ptr [EBP + -0xc]

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

Следуйте за звонящим

REA запрос вызывающего абонента · 0x411f5b
ADD EAX, 0x14
PUSH EAX
CALL 0x00406400

REA идентифицирует объект, на который упал кирпич. В предыдущих инструкциях координата плитки умножалась на 30; добавление 0x14 (20) дает положение кирпича на экране.

Прочитайте указанные константы

Результаты в байтах REA · интерпретируются как удвоения в порядке убывания
0x420068  000000000000f93f  → 1.5625
0x420070  0000000000407f40  → 500.0
0x4210a0  000000000000f03f  → 1.0

Арифметика ссылается на эти адреса. Считывание байтов позволяет получить фактические значения; порядок команд сообщает агенту, как они используются.

Запишите и проверьте восстановленную функцию

Восстановленный отрывок из C ·
pan = (double)x;
pan = pan * 1.5625;
pan = pan - 500.0;
pan = pan * dxball_pan_scale;
return (DxBallInt)pan;

При масштабе 1,0 позиции экрана 0, 320 и 640 преобразуются в -500, 0 и 500 до преобразования в целое число. При вычислении центр экрана оказывается в центре стереополя.

Агент использовал результаты REA для написания кода C. Отдельные проверки сравнили 3205 входных данных с исходной функцией x86 и воспроизвели все 63 скомпилированных байта полной функции.

Смотрите полное исследование и сравнение сборки с C

Попробуйте это с вашим собственным двоичным кодом

Подключите поставщика программ для анализа машинного кода, затем предоставьте своему агенту локальный исполняемый файл или библиотеку и функцию для изучения. Полезные начальные вопросы включают в себя “Как обрабатывается этот файл?” или “Какая функция выполняет это действие в меню?”.

Если вы уже знаете название функции или адрес, вы можете запросить его из терминала. Для настроенной установки Ghidra:

Функциональный анализ
npx -y rea-agents@latest function /absolute/path/to/program main \
  --provider ghidra --json

Замените целевой путь и main на свое собственное имя функции или адрес. Каждый вызов CLI импортирует и анализирует двоичный файл, а затем закрывает свой сеанс. Запросы вашего агента MCP повторно используют импортированный двоичный файл, пока этот сеанс открыт.

Прочтите псевдокод вместе с инструкциями и ссылками. Если в результате остается нерешенным вопрос о вызове или значении, используйте это местоположение в качестве следующего вопроса.

Топ