- 55
- підтримувані функції C
- 45,380
- порівняння з вихідним кодом
- 33
- функції з відповідними скомпільованими байтами
Контрольна точка проекту: 7 жовтня 2026 року. Журнал виконання роботи · Тестове покриття
Проект досі
Відновлений код охоплює управління дошкою та ресурсами, удари цеглою, анімацію, частинки та отримання бонусів. У поточних збірках доступні утиліти перевірки та бібліотека аналізу. Триває робота над грою, в яку можна грати, фізикою м'яча і весла, управлінням посиленнями і інтеграцією Windows.
Визначення положення звуку зліва / справа при розрахунку
При ударі по цеглі його горизонтальне положення передається в звуковий код. У ході дослідження було необхідно відновити, як ця координата екрану перетворюється в значення повороту вліво/вправо.
Використовуйте REA, щоб дізнатися, як DX-Ball обчислює розташування стереозвуку. Поясніть розрахунок і покажіть код.
Приклад запиту для вашого coding agent з доступним локальним виконуваним файлом. У наведеному нижче дослідженні Показані запити REA та докази, що лежать в основі відповіді.
Агент використовував REA для перевірки функції, відстеження її абонента та зчитування констант із виконуваного файлу. Ці результати надали вхідні дані та арифметику, необхідні для написання функції на мові Сі, наведеної нижче.
Перший результат функції для 0x406400 включав псевдокод, що оголошує FUN_00406400(void) і викликає __ftol(). У вікні команд відображалося Введення даних зі стека та операції з плаваючою комою. Ця невідповідність дала агенту конкретну причину продовжувати розслідування.
Перше представлення декомпілятора
longlong FUN_00406400(void)
{
longlong lVar1;
lVar1 = __ftol();
return lVar1;
}
На виході відображається виклик перетворення. При читанні наведених нижче інструкцій можна побачити вхідні дані і обчислення, які використовуються для цього виклику.
Відповіді на три запитання за допомогою REA
-
Відновіть відсутні вхідні дані
Агент → REA * функціяanalyze_function{"procedure": "0x406400"}REA → агент * уривок з інструкції0x406409: MOV EAX, dword ptr [EBP + 0x8] 0x40640c: MOV dword ptr [EBP + -0xc], EAX 0x40640f: FILD dword ptr [EBP + -0xc]Результат роботи функції включає інструкції поряд з псевдокодом і викликають елементами. Тут
[EBP+8]забезпечує цілочисельний вхід, відсутній у поданні декомпілятора. -
Слідкуйте за абонентом, щоб зрозуміти введені дані
Агент → REA * функціяanalyze_function{"procedure": "0x411f40"}REA → агент * уривок з повідомлення про абонента0x411f5b: ADD EAX, 0x14 0x411f5e: PUSH EAX 0x411f5f: CALL 0x00406400REA визначив цього абонента в першому результаті. У попередніх інструкціях tile_x масштабується
tile_xна 30; додавання 20 дає екранну координату цегли,20 + 30 × tile_x. -
Порахуйте значення, що стоять за адресами пам'яті
Агент → REA * дваread_bytesзапиту на читання в байтах{"address": "0x420068", "length": 16} {"address": "0x4210a0", "length": 8}Результати в байтах REA * декодуються як подвійні000000000000f93f → 1.5625 0000000000407f40 → 500.0 000000000000f03f → 1.0Повернені байти задають дві арифметичні константи та початковий масштаб панорамування. Тепер агент має значення, необхідні для вираження мовою Сі.
Від штифтів REA до C
Виконайте п'ять кроків, описаних нижче. У кожному обраному елементі виділені вихідні інструкції і відповідні їм рядки.
0x406409: MOV EAX, dword ptr [EBP + 0x8]
0x40640c: MOV dword ptr [EBP + -0xc], EAX
0x40640f: FILD dword ptr [EBP + -0xc]
0x406415: FMUL double ptr [0x00420068]
0x40641e: FSUB double ptr [0x00420070]
0x406427: FMUL double ptr [0x004210a0]
0x406430: CALL 0x0041678c
0x40643e: RET
DxBallInt dxball_screen_pan(DxBallInt x)
{
double pan;
pan = (double)x;
pan = pan * 1.5625;
pan = pan - 500.0;
pan = pan * dxball_pan_scale;
return (DxBallInt)pan;
}
01 * прочитайте вхідні дані. У вікні команд в результаті роботи функції REA відображається [EBP+8] і використовується FILD для завантаження цілого числа. Відстеження абонента через REA встановлює значення екранної координати параметра C x.
02 * помножити на 1,5625. FMUL зчитує подвоєне значення 0x420068. Байти, повернуті функцією REA'S read_bytes, декодуються як 1.5625; C використовує ту саму константу.
03 * відніміть 500,0. FSUB зчитує подвійне значення в 0x420070. Результат у байтах REA розшифровується як 500.0, зміщуючи центр обчислення на екранну координату 320.
04 * застосуйте збережену шкалу. Друге FMUL показує значення 0x4210a0. У підтримуваному джерелі цей глобал називається dxball_pan_scale. При читанні другого байта REA його початкове значення дорівнює 1.0.
05 * повертає ціле число. Виклик по 0x406430 0x406430 досягає значення __ftol, зазначеного в результатах пошуку абонента REA. C перетворює результат у DxBallInt; оригінальні порівняння з x86 перевіряють повернене значення.
У наведеному нижче уривку зі збірки вибираються інструкції щодо введення, арифметики та повернення. У наведений нижче повний список також включені проміжні сховища, настройка і очищення функцій.
Повна збірка та підтверджуючі докази
0x406400: PUSH EBP
0x406401: MOV EBP, ESP
0x406403: SUB ESP, 0xc
0x406406: PUSH EBX
0x406407: PUSH ESI
0x406408: PUSH EDI
0x406409: MOV EAX, dword ptr [EBP + 0x8]
0x40640c: MOV dword ptr [EBP + -0xc], EAX
0x40640f: FILD dword ptr [EBP + -0xc]
0x406412: FST double ptr [EBP + -0x8]
0x406415: FMUL double ptr [0x00420068]
0x40641b: FST double ptr [EBP + -0x8]
0x40641e: FSUB double ptr [0x00420070]
0x406424: FST double ptr [EBP + -0x8]
0x406427: FMUL double ptr [0x004210a0]
0x40642d: FST double ptr [EBP + -0x8]
0x406430: CALL 0x0041678c
0x406435: JMP 0x0040643a
0x40643a: POP EDI
0x40643b: POP ESI
0x40643c: POP EBX
0x40643d: LEAVE
0x40643e: RET
Що надає Абонент
Функція brick-hit в 0x411f40 масштабує координату плитки на 30, додає 20, а потім переміщує її перед викликом:
0x411f50: MOV EAX, dword ptr [EBP + 0x8]
0x411f53: ADD EAX, EAX
0x411f55: LEA EAX, [EAX + EAX*0x2]
0x411f58: LEA EAX, [EAX + EAX*0x4]
0x411f5b: ADD EAX, 0x14
0x411f5e: PUSH EAX
0x411f5f: CALL 0x00406400
0x411f64: ADD ESP, 0x4
Те, що читають дані, встановлює
| Адрес | Цінність | Використовується для |
|---|---|---|
0x420068 |
1.5625 |
Перше множення |
0x420070 |
500.0 |
Віднімання |
0x4210a0 |
1.0 споконвічно |
Збережені ваги для піддонів |
Записано за допомогою REA 4.1.0 для цілі DX-Ball 1.07 з прив'язкою до хешу. У пов'язаних матеріалах розслідування зберігаються ідентифікатори доказів.
Підтримуване джерело · Примітки щодо розслідування та посилання на докази
Перевірка відновленої функції
Відновлена функція проходить дві перевірки: її повертаються значення збігаються з вихідними, а скомпільовані байти відповідають виконуваному файлу.
3 205 випадків порушення поведінки
Тести виконують вихідну функцію x86 і порівнюють значення, яке вона повертає, із збереженим значенням C. Вони охоплюють усі цілі позиції від 0 до 640 у п'яти масштабах панорамування: 0, 0,5, 1, 20 та -1.
63 збігаються байти
Функція C компілюється за допомогою закріпленого ланцюжка інструментів VC4.0. Повторне відтворення компілятором відповідає повній функції після застосування розглянутих змін і перевірки констант, на які дано посилання.
За шкалою 1 відновлені обчислення повертають значення -500 за лівим краєм, 0 за центром і 500 за правим краєм. Наступна частина роботи зі звуком-це інтеграція цього значення зі звуковим супроводом гри.
Продовжуйте розслідування
Той самий підхід використовується для оновлення частинок, створення черг із розширенням та генерування бонусів: перевірте відповідні функції, відновіть їх стан та залежності, а потім порівняйте реалізацію з оригінальною.
Щоб самостійно перевірити функцію панорамування звуку, дотримуйтесь інструкцій з налаштування DX-Ball project і вкажіть відповідну вихідну мету. Потім запустіть:
scripts/rea function original/DXBALL.EXE 0x00406400 \
--snapshot .analysis/rea/dxball.snapshot.json --json
- Поточне джерело репозиторію DX-Ball, хід виконання і локальна настройка.
- Робочий процес аналізу REA завершується обчисленням, а потім використовуйте той самий підхід із власним двійковим файлом.
- Створення частинок і бонусів - більш масштабне дослідження стану, черг і запису пікселів.