- 55
- وظائف جيم التي تمت صيانتها
- 45,380
- مقارنات مع الكود الأصلي
- 33
- وظائف مع مطابقة بايت المترجمة
نقطة تفتيش المشروع: 7 أكتوبر 2026. التقدم ليدجر · تغطية الاختبار
المشروع حتى الآن
يغطي الرمز المسترد معالجة اللوحة والموارد ، وضربات الطوب ، والرسوم المتحركة ، والجسيمات ، وإنتاج المكافآت. توفر البنيات الحالية أدوات فحص ومكتبة تحليل. يستمر العمل في اللعبة القابلة للعب مع فيزياء الكرة والمجداف ومعالجة الطاقة و Windows التكامل.
العثور على حساب يسار / يمين موقف الصوت
عندما يتم ضرب الطوب ، يتم تمرير موضعه الأفقي إلى رمز الصوت. التحقيق اللازمة لاستعادة كيف أن تنسيق الشاشة يصبح قيمة بالغسل يسار/يمين.
استخدام REA لمعرفة كيف DX-Ball يحسب بالغسل الصوت. شرح الحساب وإظهار التعليمات البرمجية.
مثال موجه لعامل الترميز الخاص بك ، مع توفر الملف التنفيذي المحلي. التحقيق أدناه يوضح REA الاستفسارات والأدلة وراء الجواب.
استخدم المساعد REA لفحص الدالة، وتتبّع الدالة التي تستدعيها عند إصابة الطوب، وقراءة الثوابت من الملف التنفيذي. حدّدت هذه النتائج المدخلات وخطوات الحساب اللازمة لكتابة دالة C أدناه.
نتيجة التحليل الأولى للوظيفة من أجل 0x406400 وشملت بسيودوكود إعلان FUN_00406400(void) والدعوة __ftol(). أظهر عرض التعليمات الخاص به إدخال مكدس وعمليات الفاصلة العائمة. أعطى هذا التناقض الوكيل سببا ملموسا لمواصلة التحقيق.
عرض فك التحويل الأول
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]يعرض الإدخال الصحيح المفقود من طريقة عرض برنامج فك التحويل البرمجي. -
اتبع الدالة المستدعية لفهم المدخلات
وكيل → 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البايتات التي تم إرجاعها تنشئ الثوابت الحسابية ومقياس عموم الأولي. يحتوي العامل الآن على القيم اللازمة للتعبير ج.
من عند REAالنتائج إلى ج
اتبع الخطوات الخمس أدناه. كل اختيار يسلط الضوء على التعليمات الأصلية وخطوط ج أبلغوا.
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.
02 * اضرب في 1.5625. FMUL يقرأ المزدوج في 0x420068. البايتات التي تم إرجاعها بواسطة REAفي read_bytes فك التشفير إلى 1.5625؛ ال ج يستخدم نفس الثابت.
03 * اطرح 500.0. FSUB يقرأ المزدوج في 0x420070. REAيتم فك تشفير نتيجة البايت إلى 500.0، تحويل مركز الحساب إلى تنسيق الشاشة 320.
04 * تطبيق المقياس المخزن. الثاني FMUL يقرأ 0x4210a0. هذا العالمي يدعى dxball_pan_scale في المصدر المحفوظ. REAقراءة البايت الثاني تحدد قيمتها الأولية لـ 1.0.
05 * إرجاع عدد صحيح. الدعوة في 0x406430 يصل __ftol، تم تحديدها في REAنتائج المستدعي. ج يلقي النتيجة إلى DxBallInt المقارنات الأصلية-86 تحقق من القيمة التي تم إرجاعها.
يختار مقتطف التجميع تعليمات الإدخال والحساب والإرجاع. تتضمن القائمة الكاملة أدناه أيضا المتاجر المتداخلة وإعداد الوظائف وتنظيفها.
التجميع الكامل والأدلة الداعمة
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 هدف. تحتفظ مذكرات التحقيق المرتبطة بهويات الأدلة.
التحقق من الوظيفة المستردة
تمر الدالة المستردة بفحصين: تتطابق قيم الإرجاع الخاصة بها مع الأصل ، وتتطابق وحدات البايت المترجمة مع الملف القابل للتنفيذ.
3,205 حالات السلوك
الاختبارات تنفيذ وظيفة س 86 الأصلي ومقارنة قيمة عودتها مع الحفاظ على ج. أنها تغطي كل موقف صحيح من 0 إلى 640 في خمسة جداول عموم: 0 ، 0.5 ، 1 ، 20 و -1.
63 بايت مطابقة
يتم تجميع دالة C مع سلسلة أدوات فك 4.0 المثبتة. يتطابق إعادة تشغيل المترجم مع الوظيفة الكاملة بعد تطبيق عمليات الترحيل التي تمت مراجعتها والتحقق من الثوابت المشار إليها.
على مقياس من 1 ، يعود الحساب المسترد -500 في الحافة اليسرى ، 0 في المركز و 500 في الحافة اليمنى. الجزء التالي من العمل الصوتي هو دمج هذه القيمة مع الخلفية الصوتية للعبة.
مواصلة التحقيق
يتم استخدام نفس النهج لتحديثات الجسيمات وقوائم انتظار الانفجار وتوليد المكافآت: فحص الوظائف ذات الصلة ، واستعادة حالتها وتبعياتها ، ثم مقارنة التنفيذ بالأصل.
لفحص وظيفة الصوت عموم نفسك ، اتبع DX-Ball تعليمات إعداد المشروع وتوفير الهدف الأصلي المطابق. ثم تشغيل:
scripts/rea function original/DXBALL.EXE 0x00406400 \
--snapshot .analysis/rea/dxball.snapshot.json --json
- DX-Ball مستودعالمصدر الحالي والتقدم والإعداد المحلي.
- REA تحليل سير العملاتبع الحساب ، ثم استخدم نفس النهج مع الثنائي الخاص بك.
- الجسيمات وإنتاج المكافأةتحقيق أكبر في الدولة ، طوابير ويكتب بكسل.