---
title: 'DX-Ball مهندسی معکوس: پانینگ صدا-REA'
url: https://rea.tools/fa/showcase/dx-ball/
---

[خانه](https://rea.tools/fa/) / [ویترین ها](https://rea.tools/fa/showcase/) / DX-Ball

مطالعه موردی \* DX-Ball 1.07

# بازسازی DX-Ball از فایل اجرایی آن.

هدف یک نسخه c قابل نگهداری از بازی Windows 1996 است. REA به عامل کمک می کند تا اصل را بازرسی کند ، یک عملکرد در یک زمان.

Windows i386 \* C \* REA

![DXBALL.تابع EXE 0x00406400 با REA بازرسی می شود . یک تماس گیرنده با آجر 20 به علاوه 30 بار tile_x را تامین می کند.دستورالعمل ها x را بارگذاری می کنند ، با 1.5625 ضرب می کنند ، 500.0 را کم می کنند ، pan_scale را اعمال می کنند و یک عدد صحیح را باز می گردانند. C نگهداری شده به طور مستقل با x86 اصلی در 3205 مورد و توسط vc4.0 compiler replay که با 63 بایت مطابقت دارد ، بررسی می شود.](https://rea.tools/assets/localized/fa/figures/dx-ball-sound-pan-investigation.svg)

یک تابع ، از اجرایی به c. REA چک شده ، دستورالعمل ها ، تماس گیرندگان و داده های خوانده شده را ارائه می دهد ؛ پروژه بازسازی نتیجه را اجرا و آزمایش می کند. [شکل باز](https://rea.tools/assets/localized/fa/figures/dx-ball-sound-pan-investigation.svg)

55
:   توابع c نگهداری شده

45,380
:   مقایسه با کد اصلی

33
:   توابع با تطبیق بایت های کامپایل شده

بازرسی پروژه: 7 اکتبر 2026. [دفتر کل پیشرفت](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/PROGRESS.md) · [پوشش تست](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/ORACLES.md)

## پروژه تا کنون

کد بازیابی شده شامل تخته و مدیریت منابع ، ضربه های آجری ، انیمیشن ها ، ذرات و تولید پاداش است. ساخت های فعلی خدمات بازرسی و یک کتابخانه تجزیه و تحلیل را فراهم می کند. کار بر روی بازی قابل پخش با فیزیک توپ و بادکنک ، دست زدن به قدرت و ادغام Windows ادامه دارد.

## پیدا کردن محاسبه موقعیت صدا چپ / راست

وقتی یک آجر ضربه می خورد ، موقعیت افقی آن به کد صدا منتقل می شود. تحقیقات لازم برای بازیابی این که چگونه مختصات صفحه نمایش به یک مقدار چپ/راست تبدیل می شود.

عامل برنامه نویسی شما

استفاده از REA برای پیدا کردن چگونه DX-Ball محاسبه موقعیت صدا استریو. محاسبه را توضیح دهید و کد را نشان دهید.

یک مثال برای عامل کدگذاری شما ، با فایل اجرایی محلی در دسترس است. تحقیقات زیر سوالات REA و شواهد پشت پاسخ را نشان می دهد.

مامور از REA برای بازرسی عملکرد استفاده کرد ، تماس گیرنده ضربه آجر آن را دنبال کرد و ثابت ها را از فایل اجرایی خواند. این نتایج ورودی و ریاضی مورد نیاز برای نوشتن تابع C زیر را فراهم می کند.

اولین نتیجه تابع برای `0x406400` شامل اعلام شبه کد `FUN_00406400(void)` و تماس گرفتن `__ftol()`. نمای دستورالعمل آن ورودی پشته و عملیات نقطه شناور را نشان می داد. اين اختلاف به مامور دليل مشخصي براي ادامه تحقيقات داد

اولین نمایش decompiler

نتیجه 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]` ورودی عدد صحیح را که از نمای decompiler گم شده است ، نشان می دهد.
2. #### تماس گیرنده را دنبال کنید تا ورودی را درک کنید

   نماینده → REA · `analyze_function`

   ```
   {"procedure": "0x411f40"}
   ```

   REA → نماینده \* گزیده تماس گیرنده

   ```
   0x411f5b: ADD EAX, 0x14
   0x411f5e: PUSH EAX
   0x411f5f: CALL 0x00406400
   ```

   REA این تماس گیرنده را در اولین نتیجه شناسایی کرد. مقیاس دستورالعمل های قبلی آن `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
   ```

   بایت های بازگردانده شده دو ثابت ریاضی و مقیاس اولیه پان را ایجاد می کنند. عامل اکنون مقادیر مورد نیاز برای عبارت C را دارد.

### از یافته های REA به C

پنج مرحله زیر را دنبال کنید. هر انتخاب دستورالعمل های اصلی و خطوط 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`.

**02 \* ضرب در 1.5625.** `FMUL` دوتایی رو میخونه `0x420068`. بایت های بازگردانده شده توسط REA `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` به دست می آید `__ftol`، در نتایج callee REA شناسایی شده است. C نتیجه را به `DxBallInt`; مقایسه های اصلی-x86 مقدار برگشت داده شده را بررسی کنید.

گزیده مونتاژ دستورالعمل های ورودی ، ریاضی و بازگشت را انتخاب می کند. لیست کامل زیر همچنین شامل فروشگاه های مداخله کننده و تنظیم و تمیز کردن عملکرد است.

تجمع کامل و شواهد حمایتی

نتیجه 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
```

### آنچه تماس گیرنده ارائه می دهد

عملکرد ضربه آجر در `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 هدف. یادداشت های تحقیق مرتبط شناسه های شواهد را حفظ می کنند.

[منبع نگهداری شده](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/src/gameplay.c#L41) · [یادداشت های تحقیق و مرجع شواهد](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/GAMEPLAY_OWNER.md)

## بررسی عملکرد بازیابی شده

تابع بازیابی شده دو چک را می گذراند: مقادیر بازگشت آن با اصل مطابقت دارد و بایت های کامپایل شده آن با فایل اجرایی مطابقت دارند.

### 3205 مورد رفتار

تست ها تابع اصلی x86 را اجرا می کنند و مقدار بازگشت آن را با C حفظ شده مقایسه می کنند.آنها هر موقعیت عدد صحیح را از 0 تا 640 در پنج مقیاس پان پوشش می دهند: 0 ، 0.5 ، 1 ، 20 و -1.

### 63 باایت تطبیق

تابع C با زنجیره ابزار vc4.0 پین شده کامپایل شده است. پخش مجدد کامپایلر با عملکرد کامل پس از اعمال جابجایی های بررسی شده و بررسی ثابت های مرجع مطابقت دارد.

در مقیاس 1 ، محاسبه بازیابی شده -500 در لبه چپ ، 0 در مرکز و 500 در لبه راست را باز می گرداند. بخش بعدی کار صوتی ادغام این مقدار با پشتیبان صدا بازی است.

[جزئیات پخش کامپایلر را بخوانید](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/BUILD_MATCHING.md)

## ادامه تحقیقات

همان رویکرد برای به روز رسانی ذرات ، صف های انفجار و تولید پاداش استفاده می شود: عملکردهای مربوطه را بررسی کنید ، وضعیت و وابستگی های آنها را بازیابی کنید ، سپس پیاده سازی را با اصلی مقایسه کنید.

برای بررسی عملکرد پان صدا خودتان ، دستورالعمل های راه اندازی پروژه DX-Ball را دنبال کنید و هدف اصلی تطبیق یافته آن را ارائه دهید. سپس اجرا کنید:

در پرداخت DX-Ball

```
scripts/rea function original/DXBALL.EXE 0x00406400 \
  --snapshot .analysis/rea/dxball.snapshot.json --json
```

- [مخزن DX-Ball](https://github.com/N0zoM1z0/dx-ball)منبع فعلی ، پیشرفت و راه اندازی محلی.
- [گردش کار تجزیه و تحلیل REA](https://rea.tools/guides/native/)محاسبه را دنبال کنید ، سپس از همان رویکرد با باینری خود استفاده کنید.
- [ذرات و تولید پاداش](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/ENTITIES_OWNER.md)یک تحقیق بزرگتر در مورد وضعیت ، صف ها و پیکسل می نویسد.

[با هدف خود شروع کنید](https://rea.tools/get-started/)
