Тематичне дослідження * DX-Ball 1.07

Відновлюємо DX-Ball
з його виконуваного файлу.

Метою є створення підтримуваної версії гри Windows на мові C, випущеної в 1996 році. REA допомагає агенту перевіряти оригінал, по одній функції за раз.

Windows для i386 · s * REA

DXBALL.EXE функція 0x00406400 перевіряється за допомогою REA . Абонент, який потрапив у глухий кут, видає значення tile_x в 20 і 30 разів більше. Інструкції завантажують x, множать на 1,5625, віднімають 500,0, застосовують pan_scale і повертають ціле число. Підтримуваний C перевіряється незалежно від вихідного x86 в 3205 випадках і за допомогою компілятора VC4.0 відтворюється на відповідність 63 байтам.
Одна функція, від виконуваної до перевіряється C. REA надає інструкції, що викликають пристрої і дані для читання; проект реконструкції реалізує і тестує результат. Відкрити малюнок
55
підтримувані функції C
45,380
порівняння з вихідним кодом
33
функції з відповідними скомпільованими байтами

Контрольна точка проекту: 7 жовтня 2026 року. Журнал виконання роботи · Тестове покриття

Проект досі

Відновлений код охоплює управління дошкою та ресурсами, удари цеглою, анімацію, частинки та отримання бонусів. У поточних збірках доступні утиліти перевірки та бібліотека аналізу. Триває робота над грою, в яку можна грати, фізикою м'яча і весла, управлінням посиленнями і інтеграцією Windows.

Визначення положення звуку зліва / справа при розрахунку

При ударі по цеглі його горизонтальне положення передається в звуковий код. У ході дослідження було необхідно відновити, як ця координата екрану перетворюється в значення повороту вліво/вправо.

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

Використовуйте REA, щоб дізнатися, як DX-Ball обчислює розташування стереозвуку. Поясніть розрахунок і покажіть код.

Приклад запиту для вашого coding agent з доступним локальним виконуваним файлом. У наведеному нижче дослідженні Показані запити REA та докази, що лежать в основі відповіді.

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

Перший результат функції для 0x406400 включав псевдокод, що оголошує FUN_00406400(void) і викликає __ftol(). У вікні команд відображалося Введення даних зі стека та операції з плаваючою комою. Ця невідповідність дала агенту конкретну причину продовжувати розслідування.

Перше представлення декомпілятора
Результат REA * фрагмент псевдокоду
longlong FUN_00406400(void)
{
  longlong lVar1;

  lVar1 = __ftol();
  return lVar1;
}

На виході відображається виклик перетворення. При читанні наведених нижче інструкцій можна побачити вхідні дані і обчислення, які використовуються для цього виклику.

Відповіді на три запитання за допомогою REA

  1. Відновіть відсутні вхідні дані

    Агент → 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] забезпечує цілочисельний вхід, відсутній у поданні декомпілятора.

  2. Слідкуйте за абонентом, щоб зрозуміти введені дані

    Агент → REA * функція analyze_function
    {"procedure": "0x411f40"}
    REA → агент * уривок з повідомлення про абонента
    0x411f5b: ADD EAX, 0x14
    0x411f5e: PUSH EAX
    0x411f5f: CALL 0x00406400

    REA визначив цього абонента в першому результаті. У попередніх інструкціях tile_x масштабується tile_xна 30; додавання 20 дає екранну координату цегли, 20 + 30 × tile_x.

  3. Порахуйте значення, що стоять за адресами пам'яті

    Агент → REA * два read_bytesзапиту на читання в байтах
    {"address": "0x420068", "length": 16}
    {"address": "0x4210a0", "length": 8}
    Результати в байтах REA * декодуються як подвійні
    000000000000f93f → 1.5625
    0000000000407f40 → 500.0
    000000000000f03f → 1.0

    Повернені байти задають дві арифметичні константи та початковий масштаб панорамування. Тепер агент має значення, необхідні для вираження мовою Сі.

Від штифтів REA до C

Виконайте п'ять кроків, описаних нижче. У кожному обраному елементі виділені вихідні інструкції і відповідні їм рядки.

Оригінальний витяг з x86 ·
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
Реконструйований C
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.

У наведеному нижче уривку зі збірки вибираються інструкції щодо введення, арифметики та повернення. У наведений нижче повний список також включені проміжні сховища, настройка і очищення функцій.

Повна збірка та підтверджуючі докази
Результат REA · 0X406400–0X40643E
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

Те, що читають дані, встановлює

Зчитується байт REA, декодується як подвоєння в порядку убування
Адрес Цінність Використовується для
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 і вкажіть відповідну вихідну мету. Потім запустіть:

При оформленні замовлення DX-Ball
scripts/rea function original/DXBALL.EXE 0x00406400 \
  --snapshot .analysis/rea/dxball.snapshot.json --json

Топ