Nghiên cứu trường hợp * DX-Ball 1.07

XÂY DỰNG LẠI DX-Ball
từ thực thi của nó.

Mục tiêu là một phiên bản C có thể bảo trì của TRÒ chơi Windows NĂM 1996. REA giúp các agent kiểm tra bản gốc, một chức năng tại một thời điểm.

Windows i386 * C * REA

DXBALL.EXE chức năng 0x00406400 được kiểm tra VỚI REA . Một hàm gọi gạch-hit cung cấp 20 cộng với 30 lần tile_x. Hướng dẫn tải x, nhân với 1.5625, trừ 500.0, áp dụng pan_scale và trả về một số nguyên. C được duy trì được kiểm tra độc lập so với x86 ban đầu trong 3.205 trường hợp và bằng cách phát lại trình biên dịch vc4.0 khớp với 63 byte.
Một chức năng, từ thực thi đến Kiểm tra C. REA cung cấp các hướng dẫn, hàm gọi và dữ liệu đọc; dự án tái thiết thực hiện và kiểm tra kết quả. Hình mở
55
duy Trì Chức Năng C
45,380
so sánh với mã gốc
33
các hàm với các byte được biên dịch phù hợp

Trạm kiểm soát dự án: 7 tháng 10 năm 2026. Sổ cái tiến độ · Bảo hiểm kiểm tra

Dự án cho đến nay

Các mã phục hồi bao gồm hội đồng quản trị và xử lý tài nguyên, gạch hits, hình ảnh động, hạt và sản xuất tiền thưởng. Các bản dựng hiện tại cung cấp các tiện ích kiểm tra và thư viện phân tích. Làm việc trên trò chơi có thể chơi được tiếp tục với vật lý bóng và mái chèo, xử lý tăng sức mạnh và TÍCH hợp Windows.

Tìm tính toán vị trí âm thanh trái/phải

Khi một viên gạch bị trúng, vị trí nằm ngang của nó được chuyển đến mã âm thanh. Cuộc điều tra cần thiết để khôi phục cách tọa độ màn hình đó trở thành giá trị xoay trái/phải.

Agent mã hóa của bạn

SỬ dụng REA để tìm CÁCH DX-Ball tính toán định vị âm thanh nổi. Giải thích tính toán và hiển thị mã.

Một lời nhắc ví dụ cho tác nhân mã hóa của bạn, với tệp thực thi cục bộ có sẵn. Cuộc điều tra dưới đây cho THẤY CÁC truy vấn REA và bằng chứng đằng sau câu trả lời.

Tác nhân đã sử dụng REA để kiểm tra chức năng, theo dõi hàm gọi gạch của nó và đọc các hằng số từ tệp thực thi. Những kết quả đó cung cấp đầu vào và số học cần thiết để viết hàm C bên dưới.

Kết quả chức năng đầu tiên cho 0x406400 bao gồm khai báo mã giả FUN_00406400(void) và gọi __ftol(). Chế độ xem hướng dẫn của nó cho thấy một đầu vào ngăn xếp và các hoạt động dấu phẩy động. Sự khác biệt đó đã cho agent một lý do cụ thể để tiếp tục điều tra.

Chế độ xem dịch ngược đầu tiên
KẾT quả REA · đoạn trích mã giả
longlong FUN_00406400(void)
{
  longlong lVar1;

  lVar1 = __ftol();
  return lVar1;
}

Đầu ra hiển thị một cuộc gọi chuyển đổi. Đọc các hướng dẫn dưới đây cho thấy đầu vào và tính toán cho ăn cuộc gọi đó.

Ba câu HỎI được trả lời THÔNG QUA REA

  1. Khôi phục đầu vào bị thiếu

    Agent → REA · analyze_function
    {"procedure": "0x406400"}
    REA → agent · trích đoạn hướng dẫn
    0x406409: MOV EAX, dword ptr [EBP + 0x8]
    0x40640c: MOV dword ptr [EBP + -0xc], EAX
    0x40640f: FILD dword ptr [EBP + -0xc]

    Kết quả chức năng bao gồm các hướng dẫn cùng với mã giả và hàm gọi. Đây, [EBP+8] hiển thị đầu vào số nguyên bị thiếu từ chế độ xem trình dịch ngược.

  2. Theo dõi hàm gọi để hiểu đầu vào

    Agent → REA · analyze_function
    {"procedure": "0x411f40"}
    REA → agent · hàm gọi trích đoạn
    0x411f5b: ADD EAX, 0x14
    0x411f5e: PUSH EAX
    0x411f5f: CALL 0x00406400

    REA đã xác định hàm gọi này trong kết quả đầu tiên. Quy mô hướng dẫn trước của nó tile_x bằng 30; thêm 20 cho tọa độ màn hình của gạch, 20 + 30 × tile_x.

  3. Đọc các giá trị đằng sau địa chỉ bộ nhớ

    Agent → REA * hai read_bytes yêu cầu
    {"address": "0x420068", "length": 16}
    {"address": "0x4210a0", "length": 8}
    REA byte kết quả * giải mã như đôi
    000000000000f93f → 1.5625
    0000000000407f40 → 500.0
    000000000000f03f → 1.0

    Các byte được trả về thiết lập hai hằng số học và thang đo pan ban đầu. Tác nhân bây giờ có các giá trị cần thiết cho biểu Thức C.

TỪ NHỮNG phát Hiện CỦA REA Đến C

Làm theo năm bước dưới đây. Mỗi lựa chọn làm nổi bật các hướng dẫn ban đầu và Các dòng C mà họ thông báo.

Bản gốc x86 * trích đoạn
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
Tái Tạo 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 * Đọc đầu vào. Chế độ xem hướng dẫn TRONG REA kết quả chức năng của đọc [EBP+8] và sử dụng FILD để tải số nguyên. Theo hàm gọi của NÓ thông QUA REA thiết lập ý nghĩa tọa độ màn hình Của tham Số C x.

Đoạn trích lắp ráp chọn các hướng dẫn đầu vào, số học và trả về. Danh sách đầy đủ dưới đây cũng bao gồm các cửa hàng can thiệp và thiết lập chức năng và dọn dẹp.

Lắp ráp đầy đủ và bằng chứng hỗ trợ
REA kết quả · 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

Những gì hàm gọi cung cấp

Chức năng gạch-hit tại 0x411f40 cân tọa độ gạch của nó thêm 30, thêm 20, sau đó đẩy nó trước cuộc gọi:

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

Những gì dữ liệu đọc thiết lập

REA byte đọc, giải mã như đôi endian ít
Địa chỉ Giá trị Được sử dụng cho
0x420068 1.5625 Phép nhân đầu tiên
0x420070 500.0 Phép trừ
0x4210a0 1.0 ban đầu Quy mô chảo được lưu trữ

Được ghi LẠI VỚI REA 4.1.0 cho mục tiêu DX-Ball 1.07 được ghim băm. Các ghi chú điều tra liên quan giữ Lại Id Bằng chứng.

Nguồn duy trì · Ghi chú điều tra và tài liệu tham khảo bằng chứng

Kiểm tra chức năng phục hồi

Hàm được khôi phục vượt qua hai lần kiểm tra: các giá trị trả về của nó khớp với bản gốc và các byte được biên dịch của nó khớp với tệp thực thi.

3.205 trường hợp hành vi

Các thử nghiệm thực thi hàm x86 ban đầu và so sánh giá trị trả về của nó với c. Chúng bao phủ mọi vị trí nguyên từ 0 đến 640 ở năm thang pan: 0, 0,5, 1, 20 và -1.

63 byte phù hợp

Hàm C được biên dịch với chuỗi CÔNG cụ vc4.0 được ghim. Phát lại trình biên dịch khớp với chức năng hoàn chỉnh sau khi áp dụng các lần di dời đã xem xét và kiểm tra các hằng số được tham chiếu.

Ở tỷ lệ 1, phép tính được phục hồi trả về -500 ở cạnh trái, 0 ở giữa và 500 ở cạnh phải. Phần tiếp theo của công việc âm thanh là tích hợp giá trị đó với phần phụ trợ âm thanh của trò chơi.

Đọc chi tiết phát lại trình biên dịch

Tiếp tục điều tra

Cách tiếp cận tương tự đang được sử dụng để cập nhật hạt, hàng đợi nổ và tạo tiền thưởng: kiểm tra các chức năng có liên quan, khôi phục trạng thái và phụ thuộc của chúng, sau đó so sánh việc triển khai với bản gốc.

Để tự kiểm tra chức năng sound-pan, hãy làm theo HƯỚNG dẫn thiết lập CỦA DỰ án DX-Ball và cung cấp mục tiêu ban đầu phù hợp. Sau đó chạy:

TRONG thanh TOÁN DX-Ball
scripts/rea function original/DXBALL.EXE 0x00406400 \
  --snapshot .analysis/rea/dxball.snapshot.json --json

Hàng đầu