مطالعه موردی * DX-Ball 1.07

بازسازی DX-Ball
از فایل اجرایی آن.

هدف یک نسخه c قابل نگهداری از بازی Windows 1996 است. REA به عامل کمک می کند تا اصل را بازرسی کند ، یک عملکرد در یک زمان.

Windows i386 * C * REA

DXBALL.تابع EXE 0x00406400 با REA بازرسی می شود . یک تماس گیرنده با آجر 20 به علاوه 30 بار tile_x را تامین می کند.دستورالعمل ها x را بارگذاری می کنند ، با 1.5625 ضرب می کنند ، 500.0 را کم می کنند ، pan_scale را اعمال می کنند و یک عدد صحیح را باز می گردانند. C نگهداری شده به طور مستقل با x86 اصلی در 3205 مورد و توسط vc4.0 compiler replay که با 63 بایت مطابقت دارد ، بررسی می شود.
یک تابع ، از اجرایی به c. REA چک شده ، دستورالعمل ها ، تماس گیرندگان و داده های خوانده شده را ارائه می دهد ؛ پروژه بازسازی نتیجه را اجرا و آزمایش می کند. شکل باز
55
توابع c نگهداری شده
45,380
مقایسه با کد اصلی
33
توابع با تطبیق بایت های کامپایل شده

بازرسی پروژه: 7 اکتبر 2026. دفتر کل پیشرفت · پوشش تست

پروژه تا کنون

کد بازیابی شده شامل تخته و مدیریت منابع ، ضربه های آجری ، انیمیشن ها ، ذرات و تولید پاداش است. ساخت های فعلی خدمات بازرسی و یک کتابخانه تجزیه و تحلیل را فراهم می کند. کار بر روی بازی قابل پخش با فیزیک توپ و بادکنک ، دست زدن به قدرت و ادغام Windows ادامه دارد.

پیدا کردن محاسبه موقعیت صدا چپ / راست

وقتی یک آجر ضربه می خورد ، موقعیت افقی آن به کد صدا منتقل می شود. تحقیقات لازم برای بازیابی این که چگونه مختصات صفحه نمایش به یک مقدار چپ/راست تبدیل می شود.

عامل برنامه نویسی شما

استفاده از REA برای پیدا کردن چگونه DX-Ball محاسبه موقعیت صدا استریو. محاسبه را توضیح دهید و کد را نشان دهید.

یک مثال برای عامل کدگذاری شما ، با فایل اجرایی محلی در دسترس است. تحقیقات زیر سوالات REA و شواهد پشت پاسخ را نشان می دهد.

مامور از REA برای بازرسی عملکرد استفاده کرد ، تماس گیرنده ضربه آجر آن را دنبال کرد و ثابت ها را از فایل اجرایی خواند. این نتایج ورودی و ریاضی مورد نیاز برای نوشتن تابع C زیر را فراهم می کند.

اولین نتیجه تابع برای 0x406400 شامل اعلام شبه کد FUN_00406400(void) و تماس گرفتن __ftol(). نمای دستورالعمل آن ورودی پشته و عملیات نقطه شناور را نشان می داد. اين اختلاف به مامور دليل مشخصي براي ادامه تحقيقات داد

اولین نمایش decompiler
نتیجه 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] ورودی عدد صحیح را که از نمای decompiler گم شده است ، نشان می دهد.

  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

    بایت های بازگردانده شده دو ثابت ریاضی و مقیاس اولیه پان را ایجاد می کنند. عامل اکنون مقادیر مورد نیاز برای عبارت C را دارد.

از یافته های REA به C

پنج مرحله زیر را دنبال کنید. هر انتخاب دستورالعمل های اصلی و خطوط C را که آنها اطلاع داده اند برجسته می کند.

نسخه اصلی x86 ·
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
بازسازی شده 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 * ورودی را بخوانید. نمایش دستورالعمل در نتیجه تابع REA به شرح زیر است [EBP+8] و استفاده می کند FILD برای بارگذاری عدد صحیح. با دنبال کردن تماس گیرنده از طریق REA ، معنی مختصات صفحه نمایش پارامتر C را تعیین می کند x.

گزیده مونتاژ دستورالعمل های ورودی ، ریاضی و بازگشت را انتخاب می کند. لیست کامل زیر همچنین شامل فروشگاه های مداخله کننده و تنظیم و تمیز کردن عملکرد است.

تجمع کامل و شواهد حمایتی
نتیجه REA · 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

آنچه تماس گیرنده ارائه می دهد

عملکرد ضربه آجر در 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 هدف. یادداشت های تحقیق مرتبط شناسه های شواهد را حفظ می کنند.

منبع نگهداری شده · یادداشت های تحقیق و مرجع شواهد

بررسی عملکرد بازیابی شده

تابع بازیابی شده دو چک را می گذراند: مقادیر بازگشت آن با اصل مطابقت دارد و بایت های کامپایل شده آن با فایل اجرایی مطابقت دارند.

3205 مورد رفتار

تست ها تابع اصلی x86 را اجرا می کنند و مقدار بازگشت آن را با C حفظ شده مقایسه می کنند.آنها هر موقعیت عدد صحیح را از 0 تا 640 در پنج مقیاس پان پوشش می دهند: 0 ، 0.5 ، 1 ، 20 و -1.

63 باایت تطبیق

تابع C با زنجیره ابزار vc4.0 پین شده کامپایل شده است. پخش مجدد کامپایلر با عملکرد کامل پس از اعمال جابجایی های بررسی شده و بررسی ثابت های مرجع مطابقت دارد.

در مقیاس 1 ، محاسبه بازیابی شده -500 در لبه چپ ، 0 در مرکز و 500 در لبه راست را باز می گرداند. بخش بعدی کار صوتی ادغام این مقدار با پشتیبان صدا بازی است.

جزئیات پخش کامپایلر را بخوانید

ادامه تحقیقات

همان رویکرد برای به روز رسانی ذرات ، صف های انفجار و تولید پاداش استفاده می شود: عملکردهای مربوطه را بررسی کنید ، وضعیت و وابستگی های آنها را بازیابی کنید ، سپس پیاده سازی را با اصلی مقایسه کنید.

برای بررسی عملکرد پان صدا خودتان ، دستورالعمل های راه اندازی پروژه DX-Ball را دنبال کنید و هدف اصلی تطبیق یافته آن را ارائه دهید. سپس اجرا کنید:

در پرداخت DX-Ball
scripts/rea function original/DXBALL.EXE 0x00406400 \
  --snapshot .analysis/rea/dxball.snapshot.json --json

بالا