---
title: 'DX-Ball Tersine Mühendislik: Ses Kaydırma - REA'
url: https://rea.tools/tr/showcase/dx-ball/
---

[Anasayfa](https://rea.tools/tr/) / [Vitrinler](https://rea.tools/tr/showcase/) / DX-Ball

Örnek olay incelemesi \* DX-Ball 1.07

# DX-Ball'YU yeniden oluşturma yürütülebilir dosyasından.

Amaç, 1996 Windows oyununun sürdürülebilir bir C versiyonudur. REA, ajanın orijinali, her seferinde bir işlevi incelemesine yardımcı olur.

Windows i386 \* C \* REA

![DXBALL.EXE işlevi 0x00406400, REA ile denetlenir. Tuğlaya çarpan bir çağıran, 20 artı 30 kez tile_x sağlar. Talimatlar x'i yükleyin, 1.5625 ile çarpın, 500.0'ı çıkarın, pan_scale uygulayın ve bir tamsayı döndürün. Tutulan C, 3.205 durumda orijinal x86'ya karşı bağımsız olarak ve 63 baytla eşleşen VC4.0 derleyici tekrarı ile kontrol edilir.](https://rea.tools/assets/localized/tr/figures/dx-ball-sound-pan-investigation.svg)

REA talimatları, çağıranları ve veri okumalarını sağlar; yeniden yapılandırma projesi sonucu uygular ve test eder. [Açık şekil](https://rea.tools/assets/localized/tr/figures/dx-ball-sound-pan-investigation.svg)

55
:   bakımı yapılan C işlevleri

45,380
:   orijinal kodla karşılaştırmalar

33
:   eşleşen derlenmiş baytlara sahip işlevler

Proje kontrol noktası: 7 Ekim 2026. [İlerleme defteri](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/PROGRESS.md) \* [Test kapsamı](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/ORACLES.md)

## Proje şu ana kadar

Kurtarılan kod, tahta ve kaynak işlemeyi, tuğla vuruşlarını, animasyonları, parçacıkları ve bonus üretimini kapsar. Mevcut yapılar, denetim yardımcı programları ve bir analiz kitaplığı sağlar. Oynanabilir oyun üzerindeki çalışmalar top ve raket fiziği, güçlendirme kullanımı ve Windows entegrasyonu ile devam ediyor.

## Sol / sağ ses konumunun hesaplanmasını bulma

Bir tuğla vurulduğunda, yatay konumu ses koduna geçirilir. İnceleme, bu ekran koordinatının nasıl sola / sağa kaydırma değeri haline geldiğini kurtarmak için gerekliydi.

Kodlama aracınız

DX-Ball’ın stereo ses konumlandırmasını nasıl hesapladığını bulmak için REA kullanın. Hesaplamayı açıklayın ve kodu gösterin.

Yerel yürütülebilir dosyanın bulunduğu kodlama aracınız için örnek bir komut istemi. Aşağıdaki araştırma, REA sorgularını ve cevabın arkasındaki kanıtları göstermektedir.

Aracı, işlevi incelemek, tuğlaya çarpan çağıranını takip etmek ve yürütülebilir dosyadaki sabitleri okumak için REA kullandı. Bu sonuçlar, aşağıdaki C işlevini yazmak için gereken girdi ve aritmetiği sağladı.

0x406400 için ilk işlev sonucu`0x406400`, FUN_00406400 `FUN_00406400(void)` bildiren ve `__ftol()` öğesini çağıran sözde kodu içeriyordu. Talimat görünümü bir yığın girişi ve kayan nokta işlemleri gösterdi. Bu tutarsızlık, ajana araştırmaya devam etmesi için somut bir neden verdi.

İlk decompiler görünümü

REA sonuç \* sözde kod alıntısı

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

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

Çıktı bir dönüşüm çağrısı gösterir. Aşağıdaki talimatları okumak, o çağrıyı besleyen girdiyi ve hesaplamayı ortaya çıkarır.

### REA aracılığıyla yanıtlanan üç soru

1. #### Eksik girdiyi kurtar

   Ajan → REA \* `analyze_function`

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

   REA → ajan \* talimat alıntısı

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

   İşlev sonucu, sözde kod ve çağıranların yanı sıra talimatları içerir. Burada, `[EBP+8]` kod çözücü görünümünde eksik olan tamsayı girdisini gösterir.
2. #### Girişi anlamak için çağıranı takip edin

   Ajan → REA \* `analyze_function`

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

   REA → temsilci \* çağıran alıntı

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

   REA bu çağıranı ilk sonuçta tanımladı. Önceki talimatları `tile_x`tile_x'i 30'a ölçeklendirir; 20 eklemek tuğlanın ekran koordinatını verir, `20 + 30 × tile_x`.
3. #### Bellek adreslerinin arkasındaki değerleri okuyun

   Aracı → REA \* iki `read_bytes` isteği

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

   REA bayt sonuçları \* çiftler olarak deşifre edildi

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

   Döndürülen baytlar, iki aritmetik sabiti ve ilk kaydırma ölçeğini oluşturur. Aracı artık C ifadesi için gereken değerlere sahiptir.

### REA’nın bulgularından C'ye

Aşağıdaki beş adımı izleyin. Her seçim, orijinal talimatları ve bildirdikleri C satırlarını vurgular.

Orijinal x86 \* alıntı

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

Yeniden inşa edilmiş 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 \* Girişi okuyun.** Talimat görünümü REA işlev sonucu okur `[EBP+8]` ve kullanır `FILD` tamsayıyı yüklemek için. Çağıranı REA aracılığıyla takip etmek, C parametresi `x` ekran koordinat anlamını belirler.

**02 \* 1.5625 ile çarpın.** FMUL, 0x420068'de iki `FMUL` `0x420068`. Tarafından döndürülen baytlar REA 's `read_bytes` kod çözme 1.5625'e`1.5625` C aynı sabiti kullanır.

**03 \* 500.0'ı çıkarın.** `FSUB`, 0x420070'te iki katı `0x420070`. REA bayt sonucu `500.0`'a çözülür ve hesaplamanın merkezini ekran koordinatı `320`'ye kaydırır.

**04 \* Depolanan ölçeği uygulayın.** İkinci `FMUL` 0x4210a0 değerini okur`0x4210a0` Bu genel, tutulan kaynakta dxball_pan_scale olarak adlandırılır`dxball_pan_scale` REA ikinci bayt okuması, başlangıç değerini `1.0` olarak belirler.

**05 \* Bir tamsayı döndürür.** `0x406430`0x406430 `__ftol`, REA aranan sonuçlar. C sonucu `DxBallInt` atar; original-x86 karşılaştırmaları döndürülen değeri kontrol eder.

Assembly alıntısı giriş, aritmetik ve dönüş talimatlarını seçer. Aşağıdaki tam liste, araya giren depoları ve işlev kurulumunu ve temizlemeyi de içerir.

Tam assembly ve destekleyici kanıtlar

REA sonucu \* 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
```

### Çağıran ne sağlar

0x411f40 değerindeki tuğla çarpma işlevi`0x411f40`, döşeme koordinatını 30 ölçeklendirir, 20 ekler ve ardından çağrıdan önce iter:

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

### Verilerin okuduğu şey

REA bayt okur, küçük uçlu çiftler olarak çözülür

| Adres | Değer | İçin kullanılır |
| --- | --- | --- |
| `0x420068` | `1.5625` | İlk çarpma |
| `0x420070` | `500.0` | Çıkarma |
| `0x4210a0` | `1.0` başlangıçta | Saklanan pan ölçeği |

Karma değeri sabitlenmiş DX-Ball 1.07 hedefi için REA 4.1.0 ile kaydedildi. Bağlantılı soruşturma notları Kanıt Kimliklerini saklar.

[Tutulan kaynak](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/src/gameplay.c#L41) \* [İnceleme notları ve kanıt referansları](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/GAMEPLAY_OWNER.md)

## Kurtarılan işlevi kontrol etme

Kurtarılan işlev iki denetimden geçer: dönüş değerleri orijinaliyle eşleşir ve derlenmiş baytları yürütülebilir dosyayla eşleşir.

### 3.205 davranış vakası

Testler orijinal x86 işlevini yürütür ve dönüş değerini tutulan C ile karşılaştırır. 0, 0,5, 1, 20 ve -1 olmak üzere beş kaydırma ölçeğinde 0'dan 640'a kadar olan her tamsayı konumunu kapsar.

### 63 eşleşen bayt

C işlevi, sabitlenmiş VC4.0 araç zinciri ile derlenir. Derleyici tekrarı, gözden geçirilen yer değiştirmeleri uyguladıktan ve başvurulan sabitleri kontrol ettikten sonra tam işlevle eşleşir.

1 Ölçeğinde, kurtarılan hesaplama sol kenarda -500, merkezde 0 ve sağ kenarda 500 döndürür. Ses çalışmasının bir sonraki kısmı, bu değeri oyunun ses arka ucuyla bütünleştirmektir.

[Derleyici tekrar ayrıntılarını okuyun](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/BUILD_MATCHING.md)

## İncelemeye devam et

Aynı yaklaşım parçacık güncellemeleri, patlama kuyrukları ve bonus üretimi için de kullanılıyor: ilgili işlevleri inceleyin, durumlarını ve bağımlılıklarını kurtarın, ardından uygulamayı orijinaliyle karşılaştırın.

Ses kaydırma işlevini kendiniz incelemek için DX-Ball projesinin kurulum talimatlarını izleyin ve eşleşen orijinal hedefini sağlayın. Sonra koş:

DX-Ball çalışma kopyasında

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

- [DX-Ball deposu](https://github.com/N0zoM1z0/dx-ball) Güncel kaynak, ilerleme ve yerel kurulum.
- [REA analiz iş akışı](https://rea.tools/guides/native/) Hesaplamayı takip edin, ardından aynı yaklaşımı kendi ikili dosyanızla kullanın.
- [Parçacıklar ve bonus üretimi](https://github.com/N0zoM1z0/dx-ball/blob/a55dca27ec0a07018c1b2c95ae2be027f7d8c3c4/docs/ENTITIES_OWNER.md) Durum, kuyruklar ve piksel yazımları hakkında daha geniş bir araştırma.

[Kendi hedefinizle başlayın](https://rea.tools/get-started/)
