---
title: DX-Ball วิศวกรรมย้อนกลับ:เสียงแพน — REA
url: https://rea.tools/th/showcase/dx-ball/
---

[บ้าน](https://rea.tools/th/) / [โชว์เคส](https://rea.tools/th/showcase/) / DX-Ball

กรณีศึกษา · DX-Ball 1.07

# การฟื้นฟู DX-Ball จากปฏิบัติการของ

เป้าหมายคือสร้างเกม Windows ปี 1996 ขึ้นใหม่ด้วยโค้ด C ที่ดูแลต่อได้ REA ช่วยให้เอเจนต์วิเคราะห์ฟังก์ชันในโปรแกรมต้นฉบับทีละฟังก์ชัน

Windows ไอ386·ซี · REA

![ดีเอ็กซ์บอลตรวจสอบฟังก์ชั่น 0*00406400 REA. อิฐตีโทรอุปกรณ์ 20 บวก 30 ครั้งไทล์_เอ็กซ์คำแนะนำในการโหลด,คูณด้วย 1.5625,ลบ 500.0,ใช้แพนสเกลและกลับ 86 ใน 3,205 กรณีและโดยคอมไพเลอร์รีเพลย์ 4.0 ที่ตรงกับ 63 ไบต์](https://rea.tools/assets/localized/th/figures/dx-ball-sound-pan-investigation.svg)

หนึ่งฟังก์ชั่นจากปฏิบัติการเพื่อตรวจสอบซี REA งานธุรการงานทรัพยากรบุคคล>งานธุรการงานการจัดการทั่วไปงานธุรการงานทรัพยากร [เปิดรูป](https://rea.tools/assets/localized/th/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()`. มุมมองการเรียนการสอนแสดงให้เห็นการป้อนข้อมูลสแต็คและการดำเนินงานจุดลอยตัว ความขัดแย้งนั้นทำให้ตัวแทนมีเหตุผลที่ชัดเจนที่จะสืบสวนต่อไป

มุมมองแยกคอมไพเลอร์แรก

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` โดย 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การค้นพบของค

ทำตามห้าขั้นตอนด้านล่าง. การเลือกแต่ละไฮไลท์คำแนะนำเดิมและสายคที่พวกเขาแจ้ง

ต้นฉบับ 86·ข้อความที่ตัดตอนมา

```
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 กำหนดหน้าจอพิกัดความหมายของพารามิเตอร์ค `x`.

**02\*คูณด้วย 1.5625** `FMUL` อ่านคู่ที่ `0x420068`. ไบต์ที่ส่งคืนโดย REAของ `read_bytes` ถอดรหัสไปที่ `1.5625` คใช้ค่าคงที่เดียวกัน

**03·ลบ 500.0.** `FSUB` อ่านคู่ที่ `0x420070`. REAของไบต์ผลถอดรหัส `500.0` ขยับศูนย์การคำนวณเพื่อประสานงานหน้าจอ `320`.

**04\*ใช้สเกลที่เก็บไว้** ที่สอง `FMUL` อ่าน `0x4210a0`. ที่ทั่วโลกถูกตั้งชื่อ `dxball_pan_scale` ในแหล่งที่มาของการบำรุงรักษา REAของไบต์ที่สองอ่านกำหนดค่าเริ่มต้นของ `1.0`.

**05\*กลับจำนวนเต็ม** เรียกฟังก์ชันที่ `0x406430` ถึง `__ftol`,ระบุใน REAผลของแคลลี าการปวดหลังและอาการบวม `DxBallInt`;เปรียบเทียบต้นฉบับ-86 เทียบตรวจสอบค่าที่ส่งคืน

ข้อความที่ตัดตอนมาประกอบเลือกป้อนข้อมูล,คณิตศาสตร์และคำแนะนำกลับมา รายการเต็มรูปแบบด้านล่างนอกจากนี้ยังมีร้านค้าแทรกแซงและการตั้งค่าฟังก์ชั่นและการ

ประกอบเต็มรูปแบบและหลักฐานสนับสนุน

REA ผล·0\*406400-0\*40643

```
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)

## การตรวจสอบฟังก์ชั่นการกู้คืน

ฟังก์ชั่นการกู้คืนผ่านการตรวจสอบสอง:ค่าส่งคืนตรงกับต้นฉบับและไบต์ที่คอมไพล์ตรงกับปฏิ

### 3,205 กรณีพฤติกรรม

86 และเปรียบเทียบค่าตอบแทนของมันกับซีที่เก็บรักษาไว้มันครอบคลุมทุกตำแหน่งจำนวนเต็มตั้งแต่ 0 ถึง 640 ที่ห้าเครื่องชั่งแพน:0,0.5,1,20 และ -1

### 63 ไบต์ที่ตรงกัน

4.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/)
