---
title: 'Rekayasa Balik DX-Ball: Panning Suara-REA'
url: https://rea.tools/id/showcase/dx-ball/
---

[Rumah](https://rea.tools/id/) / [Menampilkan](https://rea.tools/id/showcase/) / DX-Ball

Studi kasus \* DX-Ball 1.07

# Membangun kembali DX-Ball dari executable-nya.

Tujuannya adalah versi C yang dapat dipertahankan dari game Windows tahun 1996. REA membantu agen memeriksa yang asli, satu fungsi pada satu waktu.

Windows i386 \* C \* REA

![DXBALL.Fungsi EXE 0x00406400 diperiksa dengan REA . Fungsi pemanggil yang terkena batu bata memasok 20 ditambah 30 kali tile_x. Instruksi memuat x, kalikan dengan 1,5625, kurangi 500,0, terapkan pan_scale dan kembalikan bilangan bulat. C yang dipertahankan diperiksa secara independen terhadap x86 asli dalam 3.205 kasus dan oleh replay kompiler VC4. 0 yang cocok dengan 63 byte.](https://rea.tools/assets/localized/id/figures/dx-ball-sound-pan-investigation.svg)

Satu fungsi, dari dapat dieksekusi hingga dicentang C. REA menyediakan instruksi, fungsi pemanggil, dan pembacaan data; proyek rekonstruksi mengimplementasikan dan menguji hasilnya. [Sosok terbuka](https://rea.tools/assets/localized/id/figures/dx-ball-sound-pan-investigation.svg)

55
:   fungsi C yang dipertahankan

45,380
:   perbandingan dengan kode asli

33
:   fungsi dengan byte terkompilasi yang cocok

Pos pemeriksaan proyek: 7 Oktober 2026. [Buku besar kemajuan](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/PROGRESS.md) · [Cakupan pengujian](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/ORACLES.md)

## Proyek sejauh ini

Kode yang dipulihkan mencakup penanganan papan dan sumber daya, pukulan bata, animasi, partikel, dan produksi bonus. Build saat ini menyediakan utilitas inspeksi dan pustaka analisis. Pengerjaan game yang dapat dimainkan berlanjut dengan fisika bola dan dayung, penanganan power-up, dan integrasi Windows.

## Menemukan perhitungan posisi suara kiri/kanan

Saat sebuah batu bata dipukul, posisi horizontalnya diteruskan ke kode suara. Penyelidikan diperlukan untuk memulihkan bagaimana koordinat layar tersebut menjadi nilai panning kiri / kanan.

Agen pengkodean Anda

Gunakan REA untuk menemukan cara DX-Ball menghitung pemosisian suara stereo. Jelaskan perhitungannya dan tunjukkan kodenya.

Contoh prompt untuk agen pengkodean Anda, dengan executable lokal tersedia. Investigasi di bawah ini menunjukkan pertanyaan REA dan bukti di balik jawabannya.

Agen menggunakan REA untuk memeriksa fungsi, mengikuti fungsi pemanggilnya yang rusak dan membaca konstanta dari executable. Hasil tersebut memberikan masukan dan aritmatika yang diperlukan untuk menulis fungsi C di bawah ini.

Hasil fungsi pertama untuk `0x406400` termasuk deklarasi pseudocode `FUN_00406400(void)` dan menelepon `__ftol()`. Tampilan instruksinya menunjukkan input tumpukan dan operasi floating-point. Ketidaksesuaian itu memberi agen alasan konkret untuk terus menyelidiki.

Tampilan dekompiler pertama

Hasil REA \* kutipan pseudocode

```
longlong FUN_00406400(void)
{
  longlong lVar1;

  lVar1 = __ftol();
  return lVar1;
}
```

Outputnya menunjukkan panggilan konversi. Membaca petunjuk di bawah ini mengungkapkan masukan dan perhitungan yang memanggil panggilan itu.

### Tiga pertanyaan dijawab melalui REA

1. #### Pulihkan input yang hilang

   Agent → REA · `analyze_function`

   ```
   {"procedure": "0x406400"}
   ```

   REA excerpt agen · kutipan instruksi

   ```
   0x406409: MOV EAX, dword ptr [EBP + 0x8]
   0x40640c: MOV dword ptr [EBP + -0xc], EAX
   0x40640f: FILD dword ptr [EBP + -0xc]
   ```

   Hasil fungsi menyertakan instruksi bersama pseudocode dan fungsi pemanggil. Di sini, `[EBP+8]` memperlihatkan input integer yang hilang dari tampilan decompiler.
2. #### Ikuti fungsi pemanggil untuk memahami masukannya

   Agent → REA · `analyze_function`

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

   REA excerpt agen · kutipan fungsi pemanggil

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

   REA mengidentifikasi fungsi pemanggil ini pada hasil pertama. Skala instruksi sebelumnya `tile_x` sebesar 30; menambahkan 20 memberikan koordinat layar bata, `20 + 30 × tile_x`.
3. #### Baca nilai di balik alamat memori

   Agen → REA \* dua `read_bytes` permintaan

   ```
   {"address": "0x420068", "length": 16}
   {"address": "0x4210a0", "length": 8}
   ```

   Hasil byte REA \* diterjemahkan sebagai ganda

   ```
   000000000000f93f → 1.5625
   0000000000407f40 → 500.0
   000000000000f03f → 1.0
   ```

   Byte yang dikembalikan menetapkan dua konstanta aritmatika dan skala pan awal. Agen sekarang memiliki nilai yang diperlukan untuk ekspresi C.

### Dari temuan REA hingga C

Ikuti lima langkah di bawah ini. Setiap pilihan menyoroti instruksi asli dan baris C yang mereka informasikan.

x86 asli · kutipan

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

Direkonstruksi 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 \* Baca inputnya.** Tampilan instruksi dalam hasil fungsi REA berbunyi `[EBP+8]` dan menggunakan `FILD` untuk memuat bilangan bulat. Mengikuti fungsi pemanggilnya melalui REA menetapkan arti koordinat layar dari parameter C `x`.

**02 \* Kalikan dengan 1,5625.** `FMUL` membaca dobel di `0x420068`. Byte yang dikembalikan oleh REA `read_bytes` dekode ke `1.5625`; C menggunakan konstanta yang sama.

**03 \* Kurangi 500,0.** `FSUB` membaca dobel di `0x420070`. Hasil byte REA diterjemahkan menjadi `500.0`, menggeser pusat perhitungan ke koordinat layar `320`.

**04 \* Terapkan skala yang disimpan.** Yang kedua `FMUL` membaca `0x4210a0`. Global itu bernama `dxball_pan_scale` dalam sumber yang dipelihara. Pembacaan byte kedua REA menetapkan nilai awalnya dari `1.0`.

**05 \* Mengembalikan bilangan bulat.** Panggilan di `0x406430` jangkauan `__ftol`, diidentifikasi dalam hasil callee REA. C memberikan hasil ke `DxBallInt`; perbandingan original-x86 periksa nilai yang dikembalikan.

Kutipan perakitan memilih input, aritmatika, dan instruksi pengembalian. Daftar lengkap di bawah ini juga mencakup penyimpanan intervensi dan penyiapan serta pembersihan fungsi.

Perakitan lengkap dan bukti pendukung

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

### Apa yang disediakan fungsi pemanggil

Fungsi pukulan bata di `0x411f40` menskalakan koordinat ubinnya sebesar 30, menambahkan 20, lalu mendorongnya sebelum panggilan:

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

### Apa yang dibaca data menetapkan

Pembacaan byte REA, diterjemahkan sebagai ganda little-endian

| Alamat | Nilai | Digunakan untuk |
| --- | --- | --- |
| `0x420068` | `1.5625` | Perkalian pertama |
| `0x420070` | `500.0` | Pengurangan |
| `0x4210a0` | `1.0` awalnya | Skala panci tersimpan |

Direkam dengan REA 4.1.0 untuk target DX-Ball 1.07 yang disematkan hash. Catatan investigasi terkait menyimpan ID Bukti.

[Sumber yang dipelihara](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/src/gameplay.c#L41) · [Catatan investigasi dan referensi bukti](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/GAMEPLAY_OWNER.md)

## Memeriksa fungsi yang dipulihkan

Fungsi yang dipulihkan melewati dua pemeriksaan: nilai pengembaliannya cocok dengan aslinya, dan byte yang dikompilasi cocok dengan yang dapat dieksekusi.

### 3.205 kasus perilaku

Pengujian menjalankan fungsi x86 asli dan membandingkan nilai pengembaliannya dengan C. Pengujian mencakup setiap posisi bilangan bulat dari 0 hingga 640 pada lima skala panci: 0, 0,5, 1, 20, dan -1.

### 63 byte yang cocok

Fungsi C dikompilasi dengan rantai alat VC4.0 yang disematkan. Replay kompilator cocok dengan fungsi lengkap setelah menerapkan relokasi yang ditinjau dan memeriksa konstanta yang direferensikan.

Pada skala 1, perhitungan yang dipulihkan mengembalikan -500 di tepi kiri, 0 di tengah, dan 500 di tepi kanan. Bagian selanjutnya dari pekerjaan audio adalah mengintegrasikan nilai tersebut dengan backend suara game.

[Baca detail pemutaran ulang kompiler](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/BUILD_MATCHING.md)

## Lanjutkan penyelidikan

Pendekatan yang sama digunakan untuk pembaruan partikel, antrean ledakan, dan pembuatan bonus: periksa fungsi yang relevan, pulihkan status dan dependensinya, lalu bandingkan implementasinya dengan aslinya.

Untuk memeriksa sendiri fungsi sound-pan, ikuti petunjuk penyiapan proyek DX-Ball dan berikan target aslinya yang sesuai. Lalu lari:

Dalam checkout DX-Ball

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

- [Repositori DX-Ball](https://github.com/N0zoM1z0/dx-ball)Sumber saat ini, kemajuan, dan pengaturan lokal.
- [Alur kerja analisis REA](https://rea.tools/guides/native/)Ikuti perhitungannya, lalu gunakan pendekatan yang sama dengan biner Anda sendiri.
- [Partikel dan produksi bonus](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/ENTITIES_OWNER.md)Investigasi yang lebih besar terhadap status, antrean, dan penulisan piksel.

[Mulailah dengan target Anda sendiri](https://rea.tools/get-started/)
