- 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.
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
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
-
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ẫn0x406409: 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. -
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ạn0x411f5b: ADD EAX, 0x14 0x411f5e: PUSH EAX 0x411f5f: CALL 0x00406400REA đã 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_xbằng 30; thêm 20 cho tọa độ màn hình của gạch,20 + 30 × tile_x. -
Đọc các giá trị đằng sau địa chỉ bộ nhớ
Agent → REA * hairead_bytesyêu cầu{"address": "0x420068", "length": 16} {"address": "0x4210a0", "length": 8}REA byte kết quả * giải mã như đôi000000000000f93f → 1.5625 0000000000407f40 → 500.0 000000000000f03f → 1.0Cá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.
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 * Đọ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.
02 * Nhân với 1,5625 · FMUL đọc đôi tại 0x420068. Các byte được trả về BỞI REA ' s read_bytes giải mã thành 1.5625; C sử dụng cùng một hằng số.
03 * Trừ 500.0 · FSUB đọc đôi tại 0x420070. REA ' s byte kết quả giải mã để 500.0, chuyển trung tâm tính toán sang tọa độ màn hình 320.
04 * Áp dụng thang đo được lưu trữ. Thứ hai FMUL đọc 0x4210a0. Toàn cầu đó được đặt tên dxball_pan_scale trong nguồn duy trì. Đọc byte THỨ hai của REA thiết lập giá trị ban đầu của nó là 1.0.
05 * Trả về một số nguyên. Cuộc gọi tại 0x406430 đạt __ftol, được xác định TRONG REA 's callee kết quả. C đúc kết quả để DxBallInt; so sánh original-x86 kiểm tra giá trị trả về.
Đ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ợ
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
| Đị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.
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:
scripts/rea function original/DXBALL.EXE 0x00406400 \
--snapshot .analysis/rea/dxball.snapshot.json --json
- KHO LƯU TRỮ DX-BallNguồn hiện tại, tiến độ và thiết lập cục bộ.
- QUY trình phân tích REAThực hiện theo các tính toán, sau đó sử dụng cách tiếp cận tương tự với nhị phân của riêng bạn.
- Hạt và sản xuất tiền thưởngMột cuộc điều tra lớn hơn về trạng thái, hàng đợi và pixel viết.