- 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 · Cakupan pengujian
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.
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
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
-
Pulihkan input yang hilang
Agent → REA ·analyze_function{"procedure": "0x406400"}REA excerpt agen · kutipan instruksi0x406409: 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. -
Ikuti fungsi pemanggil untuk memahami masukannya
Agent → REA ·analyze_function{"procedure": "0x411f40"}REA excerpt agen · kutipan fungsi pemanggil0x411f5b: ADD EAX, 0x14 0x411f5e: PUSH EAX 0x411f5f: CALL 0x00406400REA mengidentifikasi fungsi pemanggil ini pada hasil pertama. Skala instruksi sebelumnya
tile_xsebesar 30; menambahkan 20 memberikan koordinat layar bata,20 + 30 × tile_x. -
Baca nilai di balik alamat memori
Agen → REA * duaread_bytespermintaan{"address": "0x420068", "length": 16} {"address": "0x4210a0", "length": 8}Hasil byte REA * diterjemahkan sebagai ganda000000000000f93f → 1.5625 0000000000407f40 → 500.0 000000000000f03f → 1.0Byte 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.
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 * 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
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
| 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 · Catatan investigasi dan referensi bukti
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.
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:
scripts/rea function original/DXBALL.EXE 0x00406400 \
--snapshot .analysis/rea/dxball.snapshot.json --json
- Repositori DX-BallSumber saat ini, kemajuan, dan pengaturan lokal.
- Alur kerja analisis REAIkuti perhitungannya, lalu gunakan pendekatan yang sama dengan biner Anda sendiri.
- Partikel dan produksi bonusInvestigasi yang lebih besar terhadap status, antrean, dan penulisan piksel.