Рассчитать расположение стереозвука слева / справа
В DX-Ball удар кирпича задает горизонтальное положение экрана. Звуковой код преобразует его в значение поворота влево/вправо.
Начальная функция, 0x00406400, выдает короткий результат декомпиляции: вызов функции __ftol(). REA также возвращает свои инструкции и вызывающие устройства, которые дают агенту возможность найти недостающую арифметику.
Вы знакомы с этими условиями?
-
Инструкции: шаги, выполняемые процессором, отображаются в удобочитаемой форме, такой как
MOVилиADD. - Результат декомпиляции / псевдокод: попытка инструмента анализа преобразовать инструкции обратно в C-подобный код. В нем могут отсутствовать отдельные части, как в этом примере.
- Вызывающая функция: функция, которая вызывает эту функцию. Она показывает, какие значения передаются.
-
Адрес: местоположение в программе, записанное в шестнадцатеричном формате, например,
0x00406400. - Константы: фиксированные числа, хранящиеся в программе, считываемые как необработанные байты и декодируемые.
Три улики, один расчет
- 01 · Инструкции Целочисленный ввод, считываемый стеком, предоставляет значение, используемое инструкциями с плавающей запятой.
-
02 · Вызывающий абонент - Экранная координата, по которой вызывающий абонент, ударившийся кирпичом, проходит
20 + 30 × tile_x. -
03 · Байты данных Числовые константы, на которые ссылаются байты, декодируются как
1.5625,500.0и масштабное значение.
pan = (x × 1.5625 − 500.0) × scale
Спросите о поведении
После подключения 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
Прочитайте входные данные
MOV EAX, dword ptr [EBP + 0x8]
MOV dword ptr [EBP + -0xc], EAX
FILD dword ptr [EBP + -0xc]
Инструкции загружают целочисленный аргумент и преобразуют его в арифметику с плавающей запятой. Это входные данные, отсутствующие в первом представлении псевдокода.
Следуйте за звонящим
ADD EAX, 0x14
PUSH EAX
CALL 0x00406400
REA идентифицирует объект, на который упал кирпич. В предыдущих инструкциях координата плитки умножалась на 30; добавление 0x14 (20) дает положение кирпича на экране.
Прочитайте указанные константы
0x420068 000000000000f93f → 1.5625
0x420070 0000000000407f40 → 500.0
0x4210a0 000000000000f03f → 1.0
Арифметика ссылается на эти адреса. Считывание байтов позволяет получить фактические значения; порядок команд сообщает агенту, как они используются.
Запишите и проверьте восстановленную функцию
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 скомпилированных байта полной функции.
Попробуйте это с вашим собственным двоичным кодом
Подключите поставщика программ для анализа машинного кода, затем предоставьте своему агенту локальный исполняемый файл или библиотеку и функцию для изучения. Полезные начальные вопросы включают в себя “Как обрабатывается этот файл?” или “Какая функция выполняет это действие в меню?”.
Если вы уже знаете название функции или адрес, вы можете запросить его из терминала. Для настроенной установки Ghidra:
npx -y rea-agents@latest function /absolute/path/to/program main \
--provider ghidra --json
Замените целевой путь и main на свое собственное имя функции или адрес. Каждый вызов CLI импортирует и анализирует двоичный файл, а затем закрывает свой сеанс. Запросы вашего агента MCP повторно используют импортированный двоичный файл, пока этот сеанс открыт.
Прочтите псевдокод вместе с инструкциями и ссылками. Если в результате остается нерешенным вопрос о вызове или значении, используйте это местоположение в качестве следующего вопроса.