กรณีศึกษา · 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 ไบต์
หนึ่งฟังก์ชั่นจากปฏิบัติการเพื่อตรวจสอบซี REA งานธุรการงานทรัพยากรบุคคล>งานธุรการงานการจัดการทั่วไปงานธุรการงานทรัพยากร เปิดรูป
55
รักษาฟังก์ชัน C
45,380
เปรียบเทียบกับรหัสเดิม
33
ฟังก์ชั่นที่มีการจับคู่ไบต์ที่รวบรวมไว้

ด่านโครงการ:7 ตุลาคม 2026 บัญชีแยกประเภท · ความคุ้มครองการทดสอบ

โครงการเพื่อให้ห่างไกล

กู้คืนรหัสครอบคลุมคณะกรรมการและการจัดการทรัพยากรฮิตอิฐภาพเคลื่อนไหวอนุภาคแ สร้างปัจจุบันให้สาธารณูปโภคการตรวจสอบและห้องสมุดการวิเคราะห์ ทำงานในเกมที่สามารถเล่นได้อย่างต่อเนื่องกับลูกและพายฟิสิกส์,การจัดการพลังงานขึ้นแ 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.

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

ประกอบเต็มรูปแบบและหลักฐานสนับสนุน
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 เป้าหมาย บันทึกการตรวจสอบที่เชื่อมโยงเก็บรหัสหลักฐาน

แหล่งบำรุงรักษา · บันทึกการตรวจสอบและการอ้างอิงหลักฐาน

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

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

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

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

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

4.0 รีเพลย์คอมไพเลอร์ตรงกับฟังก์ชันที่สมบูรณ์หลังจากใช้การย้ายที่ตรวจสอบและตรวจสอบค่า

ในระดับ 1 คำนวณคืน -500 ที่ขอบด้านซ้าย 0 ที่ศูนย์และ 500 ที่ขอบด้านขวา ส่วนถัดไปของการทำงานเสียงคือการบูรณาการค่าที่มีแบ็กเอนด์เสียงของเกม

อ่านรายละเอียดรีเพลย์คอมไพเลอร์

ต่อการสืบสวน

วิธีการเดียวกันจะถูกใช้สำหรับการปรับปรุงอนุภาคคิวการระเบิดและการสร้างโบนัส:ตรวจ

เพื่อตรวจสอบฟังก์ชั่นเสียงแพนด้วยตัวคุณเองให้ทำตาม DX-Ball คำแนะนำในการติดตั้งของโครงการและจัดหาเป้าหมายเดิมที่ตรงกัน แล้วเรียกใช้:

ใน DX-Ball ชำระเงิน
scripts/rea function original/DXBALL.EXE 0x00406400 \
  --snapshot .analysis/rea/dxball.snapshot.json --json

ด้านบน