دراسة حالة · 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
وظائف جيم التي تمت صيانتها
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 بايت مطابقة

يتم تجميع دالة C مع سلسلة أدوات فك 4.0 المثبتة. يتطابق إعادة تشغيل المترجم مع الوظيفة الكاملة بعد تطبيق عمليات الترحيل التي تمت مراجعتها والتحقق من الثوابت المشار إليها.

على مقياس من 1 ، يعود الحساب المسترد -500 في الحافة اليسرى ، 0 في المركز و 500 في الحافة اليمنى. الجزء التالي من العمل الصوتي هو دمج هذه القيمة مع الخلفية الصوتية للعبة.

اقرأ تفاصيل إعادة تشغيل المترجم

مواصلة التحقيق

يتم استخدام نفس النهج لتحديثات الجسيمات وقوائم انتظار الانفجار وتوليد المكافآت: فحص الوظائف ذات الصلة ، واستعادة حالتها وتبعياتها ، ثم مقارنة التنفيذ بالأصل.

لفحص وظيفة الصوت عموم نفسك ، اتبع DX-Ball تعليمات إعداد المشروع وتوفير الهدف الأصلي المطابق. ثم تشغيل:

في ال DX-Ball الخروج
scripts/rea function original/DXBALL.EXE 0x00406400 \
  --snapshot .analysis/rea/dxball.snapshot.json --json

أعلى