- 55
- توابع c نگهداری شده
- 45,380
- مقایسه با کد اصلی
- 33
- توابع با تطبیق بایت های کامپایل شده
بازرسی پروژه: 7 اکتبر 2026. دفتر کل پیشرفت · پوشش تست
پروژه تا کنون
کد بازیابی شده شامل تخته و مدیریت منابع ، ضربه های آجری ، انیمیشن ها ، ذرات و تولید پاداش است. ساخت های فعلی خدمات بازرسی و یک کتابخانه تجزیه و تحلیل را فراهم می کند. کار بر روی بازی قابل پخش با فیزیک توپ و بادکنک ، دست زدن به قدرت و ادغام Windows ادامه دارد.
پیدا کردن محاسبه موقعیت صدا چپ / راست
وقتی یک آجر ضربه می خورد ، موقعیت افقی آن به کد صدا منتقل می شود. تحقیقات لازم برای بازیابی این که چگونه مختصات صفحه نمایش به یک مقدار چپ/راست تبدیل می شود.
استفاده از REA برای پیدا کردن چگونه DX-Ball محاسبه موقعیت صدا استریو. محاسبه را توضیح دهید و کد را نشان دهید.
یک مثال برای عامل کدگذاری شما ، با فایل اجرایی محلی در دسترس است. تحقیقات زیر سوالات REA و شواهد پشت پاسخ را نشان می دهد.
مامور از REA برای بازرسی عملکرد استفاده کرد ، تماس گیرنده ضربه آجر آن را دنبال کرد و ثابت ها را از فایل اجرایی خواند. این نتایج ورودی و ریاضی مورد نیاز برای نوشتن تابع C زیر را فراهم می کند.
اولین نتیجه تابع برای 0x406400 شامل اعلام شبه کد FUN_00406400(void) و تماس گرفتن __ftol(). نمای دستورالعمل آن ورودی پشته و عملیات نقطه شناور را نشان می داد. اين اختلاف به مامور دليل مشخصي براي ادامه تحقيقات داد
اولین نمایش decompiler
longlong FUN_00406400(void)
{
longlong lVar1;
lVar1 = __ftol();
return lVar1;
}
خروجی یک تماس تبدیل را نشان می دهد. خواندن دستورالعمل های زیر نشان می دهد ورودی و محاسبه تغذیه که تماس.
پاسخ به سه سوال از طریق REA
-
بازیابی ورودی گمشده
نماینده → 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]ورودی عدد صحیح را که از نمای decompiler گم شده است ، نشان می دهد. -
تماس گیرنده را دنبال کنید تا ورودی را درک کنید
نماینده → REA ·analyze_function{"procedure": "0x411f40"}REA → نماینده * گزیده تماس گیرنده0x411f5b: ADD EAX, 0x14 0x411f5e: PUSH EAX 0x411f5f: CALL 0x00406400REA این تماس گیرنده را در اولین نتیجه شناسایی کرد. مقیاس دستورالعمل های قبلی آن
tile_xبا 30 ؛ اضافه کردن 20 مختصات صفحه نمایش آجر را می دهد,20 + 30 × tile_x. -
مقادیر پشت آدرس های حافظه را بخوانید
عامل → REA * دوread_bytesدرخواست ها{"address": "0x420068", "length": 16} {"address": "0x4210a0", "length": 8}نتایج بایت REA · رمزگشایی به عنوان دو برابر000000000000f93f → 1.5625 0000000000407f40 → 500.0 000000000000f03f → 1.0بایت های بازگردانده شده دو ثابت ریاضی و مقیاس اولیه پان را ایجاد می کنند. عامل اکنون مقادیر مورد نیاز برای عبارت C را دارد.
از یافته های REA به C
پنج مرحله زیر را دنبال کنید. هر انتخاب دستورالعمل های اصلی و خطوط C را که آنها اطلاع داده اند برجسته می کند.
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 ، معنی مختصات صفحه نمایش پارامتر C را تعیین می کند x.
02 * ضرب در 1.5625. FMUL دوتایی رو میخونه 0x420068. بایت های بازگردانده شده توسط REA read_bytes رمزگشایی به 1.5625; C از همان ثابت استفاده می کند.
03 * 500.0 را کم کنید. FSUB دوتایی رو میخونه 0x420070. نتیجه بایت REA به 500.0، تغییر مرکز محاسبه به مختصات صفحه نمایش 320.
04 * مقیاس ذخیره شده را اعمال کنید. دوم FMUL نوشته شده 0x4210a0. که جهانی نامگذاری شده است dxball_pan_scale در منبع نگهداری شده خواندن بایت دوم REA ارزش اولیه آن را تعیین می کند 1.0.
05 * یک عدد صحیح را برگردانید. تماس در 0x406430 به دست می آید __ftol، در نتایج callee REA شناسایی شده است. C نتیجه را به DxBallInt; مقایسه های اصلی-x86 مقدار برگشت داده شده را بررسی کنید.
گزیده مونتاژ دستورالعمل های ورودی ، ریاضی و بازگشت را انتخاب می کند. لیست کامل زیر همچنین شامل فروشگاه های مداخله کننده و تنظیم و تمیز کردن عملکرد است.
تجمع کامل و شواهد حمایتی
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
آنچه داده ها می خوانند تعیین می کنند
| آدرس | ارزش | مورد استفاده برای |
|---|---|---|
0x420068 |
1.5625 |
ضرب اول |
0x420070 |
500.0 |
تفریق |
0x4210a0 |
1.0 در ابتدا |
مقیاس پان ذخیره شده |
ضبط شده با REA 4.1.0 برای هش پین DX-Ball 1.07 هدف. یادداشت های تحقیق مرتبط شناسه های شواهد را حفظ می کنند.
بررسی عملکرد بازیابی شده
تابع بازیابی شده دو چک را می گذراند: مقادیر بازگشت آن با اصل مطابقت دارد و بایت های کامپایل شده آن با فایل اجرایی مطابقت دارند.
3205 مورد رفتار
تست ها تابع اصلی x86 را اجرا می کنند و مقدار بازگشت آن را با C حفظ شده مقایسه می کنند.آنها هر موقعیت عدد صحیح را از 0 تا 640 در پنج مقیاس پان پوشش می دهند: 0 ، 0.5 ، 1 ، 20 و -1.
63 باایت تطبیق
تابع C با زنجیره ابزار vc4.0 پین شده کامپایل شده است. پخش مجدد کامپایلر با عملکرد کامل پس از اعمال جابجایی های بررسی شده و بررسی ثابت های مرجع مطابقت دارد.
در مقیاس 1 ، محاسبه بازیابی شده -500 در لبه چپ ، 0 در مرکز و 500 در لبه راست را باز می گرداند. بخش بعدی کار صوتی ادغام این مقدار با پشتیبان صدا بازی است.
ادامه تحقیقات
همان رویکرد برای به روز رسانی ذرات ، صف های انفجار و تولید پاداش استفاده می شود: عملکردهای مربوطه را بررسی کنید ، وضعیت و وابستگی های آنها را بازیابی کنید ، سپس پیاده سازی را با اصلی مقایسه کنید.
برای بررسی عملکرد پان صدا خودتان ، دستورالعمل های راه اندازی پروژه DX-Ball را دنبال کنید و هدف اصلی تطبیق یافته آن را ارائه دهید. سپس اجرا کنید:
scripts/rea function original/DXBALL.EXE 0x00406400 \
--snapshot .analysis/rea/dxball.snapshot.json --json
- مخزن DX-Ballمنبع فعلی ، پیشرفت و راه اندازی محلی.
- گردش کار تجزیه و تحلیل REAمحاسبه را دنبال کنید ، سپس از همان رویکرد با باینری خود استفاده کنید.
- ذرات و تولید پاداشیک تحقیق بزرگتر در مورد وضعیت ، صف ها و پیکسل می نویسد.