
TRANSFORMERS: Forged to Fight هي لعبة قتال ثلاثية الأبعاد حيث تتولى قيادة بعض من أبرز الجنود الأكثر كاريزما من عالم Transformers. نحن نتحدث عن أسماء كبيرة مثل Optimus Prime وMegatron وBumblebee وRatchet وSoundwave وGrindor – ولا أقل. نعم، لقد قرأت ذلك بشكل صحيح. شخصياتك المفضلة من أي Transformers
تحتوي هذه الحزمة على إقلاع غير متصل يعمل للعبة Transformers: Forged to Fight، بالإضافة إلى كل أداة، تصحيح، وملاحظات الهندسة العكسية المستخدمة للوصول إلى هذه النقطة. وهي موجهة لشخص لديه الوقت والطاقة لاتخاذ الخطوة التالية والأكبر بكثير، وهي إعادة بناء محتوى جانب الخادم للعبة من الصفر. كل شيء هنا موثق حتى لا تضطر إلى البدء من الصفر كما فعلت أنا.
اقرأ هذا الملف بالكامل قبل أن تلمس أي شيء. قسم "المصائب" (Gotchas) بشكل خاص سيوفر لك أيامًا.
يقلع اللعبة بالكامل دون اتصال ويصل إلى شاشته الرئيسية التفاعلية الحقيقية دون أي خوادم حية في أي مكان. من الشاشة الرئيسية، تتنقل القوائم دون تعطل: القاعدة، قائمة الروبوتات (مع وجود روبوت مملوك في الحساب)، اختيار وضع القتال، شاشة الكريستالات، والنوافذ المنبثقة والنصائح المعتادة. يتم إكمال تدفق تسجيل الدخول الكامل، كل نظام فرعي عبر الإنترنت يتصل، ويتم تخطي تجربة أول مرة وبوابات التعليم. المعركة النصية التمهيدية (أوبتيموس ضد ستارسكريم) تصل حتى إلى حد تحميل المعركة، ونماذج الشخصيات ثلاثية الأبعاد تُعرض وتتحرك.
كان هذا الجزء الصعب وقد تم حله. العميل نفسه يعود للحياة دون اتصال الآن.
اللعب الفعلي لا يعمل. لا تُظهر القصة أي مهام، ولا يمكن تحميل المعارك بالكامل. هذا ليس خطأ وليس شيئًا يمكن لتصحيح إصلاحه.
كانت Forged to Fight خاضعة تمامًا لسلطة الخادم. التطبيق على الهاتف هو في الأساس شاشة مع أدوات تحكم. لا شيء تقريبًا من اللعبة كان موجودًا في التطبيق. كل مهمة، كل معركة، كل تشكيلة أعداء، إحصائيات وقدرات القائمة بأكملها، الاقتصاد، وكل التوازن كانت تعيش على خوادم Kabam ويتم بثها إلى الجهاز في كل جلسة. عندما أُغلقت الخوادم في أوائل عام 2020، ذهبت قاعدة بيانات المحتوى معها، ولم يتم إصدارها أو أرشفتها علنًا في أي مكان يمكنني الوصول إليه.
لذا ينقسم الموقف بوضوح إلى قسمين. الفن والصوت نجا، لأنهما يأتيان
داخل التطبيق (انظر re_notes/ASSET_INVENTORY.txt). كل شخصية هي حزمة أصول Unity كاملة
تحتوي على النموذج، القوام، الهيكل العظمي، مقاطع الرسوم المتحركة، وحدات تحكم الرسوم المتحركة، التأثيرات،
والصوت. البيئات، المباني، واجهة المستخدم، الصور الشخصية، مشاهد القطع، والحوار كلها
موجودة أيضًا. ما لم ينج هو البيانات التي أخبرت اللعبة أي من هذه الأصول
تستخدم، وكيفية تجميعها في معركة أو مهمة، وما كانت أرقام كل روبوت بالفعل.
كل القطع موجودة. لكن لا يوجد شيء يعرف كيفية تجميعها معًا. إعادة بناء ذلك هي
المهمة الكاملة المتبقية.
هناك أربعة أجزاء متحركة. معًا تجعل اللعبة غير المعدلة تعتقد أنها تتحدث إلى Kabam.
تصحيحات ثنائية أصلية. اللعبة هي Unity IL2CPP، لذا المنطق يعيش في مكتبة ARM
مترجمة، libil2cpp.so، وليس في ملفات نصوص قابلة للتعديل. patches/patch_il2cpp.py يعيد كتابة
ست وظائف في تلك المكتبة لتجاوز فحوصات الخادم الميتة: يهزم
مسارين لتثبيت الشهادة بحيث يتم قبول شهادة TLS الخاصة بنا، ويجبر كتلة تسجيل المدير
على التشغيل حتى عندما يكون التكوين الحي فارغًا، ويسمح بتسجيل الدخول بالنجاح باستخدام
جلسة جهازنا المحلي، ويُسكت الأخطاء الفادحة للنظام الفرعي التي كانت ستظهر
حوار "فشل تسجيل الدخول". كما يعيد حقن إدخال تبعية واحد (انظر
قسم المصائب) حتى يتم تحميل ربط وقت التشغيل بالفعل. المخرجات هي libil2cpp.patched.so.
خادم Sparx مزيف. server/fakeserver.py يقف مكان النهاية الخلفية لـ Kabam. يستمع على
TLS 443 و HTTP عادي 80 ويجيب على استدعاءات API للعبة. الردود المعلبة موجودة في
server/responses/، ملف واحد لكل نقطة نهاية، مسماة بالطريقة والمسار، على سبيل المثال
GET__account_data.json. تتم الإجابة على عدد قليل من نقاط النهاية ديناميكيًا في الكود بدلاً من
ملف، لأن اللعبة تتوقع منها أن تعكس القيم من الطلب (نقاط نهاية التعليم
ونقطة نهاية تفاصيل البطل). غلاف الرد هو
{"error":null,"result": ...}. لاحظ أنه داخل حمولات خطأ Sparx، الحقل مكتوب
err، وليس error. هذه التفاصيل مهمة ومن السهل تفويتها.
ربط وقت تشغيل أصلي. tools/nativehook/ يبني ، مكتبة صغيرة يتم
تحميلها في اللعبة عند بدء التشغيل وتسجل كل مفتاح بيانات تقرأه اللعبة، بالإضافة إلى
بعض التوجيهات السلوكية المستهدفة. هذه هي حلقة التغذية الراجعة التي جعلت كل شيء آخر ممكنًا:
تخبرك بالضبط بما تطلبه اللعبة حتى تتمكن من تجميع رد والتحقق منه.
إنه ربط سطري خالص لتجاوز البايت يتم تثبيته قبل التنفيذ، لأن
الأداة العادية لهذا (Frida) تتعطل تحت طبقة ترجمة ARM للمحاكي.
تدفق البيانات في وقت التشغيل هو: اللعبة تقوم باستدعاء HTTPS إلى نطاق Kabam، ملف المضيفين
يرسله إلى الكمبيوتر الشخصي، الخادم المزيف يجيب برد من server/responses/، المكتبة
المصححة تقبل الشهادة والرد، والربط يسجل ما تم قراءته. تلك الحلقة
هي كيف تم إحضار كل شاشة في هذا البناء.
README.md هذا الملف
TECHNICAL_NOTES.md المرجع التقني الأعمق: التصحيحات، أشكال البيانات المستردة، النتائج
patches/
patch_il2cpp.py التصحيحات الأصلية الستة بالإضافة إلى إعادة حقن التبعية
disasm_fn.py مساعد: تفكيك دالة عند إزاحة
find_callers.py مساعد: إيجاد مستدعي دالة
find_str_ref.py مساعد: إيجاد مراجع لسلسلة
server/
fakeserver.py خادم Sparx المزيف
gen_certs.sh إعادة إنشاء شهادة TLS و CA (شغّل هذا، انظر أدناه)
setup_device.sh مرجع إعداد الشبكة والثقة من جانب الجهاز
iterate.sh إعادة تشغيل سريعة وحلقة التقاط
responses/ ملف JSON واحد لكل نقطة نهاية تستدعيها اللعبة
tools/
provision_ldplayer.sh إعادة تجهيز المحاكي للحالة العاملة بضربة واحدة
setup_arm64.sh ملاحظات إعداد سلسلة الأدوات
decompile_targets.py تشغيل مفكك Ghidra بدون واجهة عند إزاحات مختارة
find_xrefs.py بحث عن المراجع المتقاطعة عبر الثنائي
apply_labels.py تطبيق تسميات رموز IL2CPP
light_analyze.py مساعدات تحليل ثابت خفيفة
frida_attach.py مساعدات Frida (محفوظة للرجوع إليها، انظر ملاحظة libnb)
frida_run.py
hook_dot.js
nativehook/
hook.c مصدر libdothook.so، ربط وقت التشغيل
libdothook.so ربط مبني مسبقًا، arm64
deploy.sh بناء ونشر الربط
relaunch_and_capture.sh إعادة تشغيل اللعبة والتقاط السجلات
hook/dothook.c نوع سابق من الربط، محفوظ للرجوع إليه
re_notes/
dump.cs تفريغ IL2CPP الكامل: كل صنف، طريقة، وحقل في اللعبة
decomp_out.c أجسام مفككة لوظائف رئيسية
decompile_targets.txt الإزاحات التي تستحق التفكيك
ASSET_INVENTORY.txt ما الفن والصوت الذي يأتي بالفعل داخل التطبيق
re_notes/dump.cs هو الملف الأكثر قيمة للعمل المتبقي. إنه
نموذج النوع الكامل للعبة: كل صنف، كل طريقة، والأهم كل حقل بيانات
يقرأه العميل من الخادم. إنه خريطتك لواجهة برمجة التطبيقات الخلفية بأكملها. عندما تحتاج
لمعرفة الشكل الذي يجب أن يكون عليه الرد، الإجابة موجودة هناك.
تم ترك هذه عن قصد، لأنها كبيرة، أو محمية بحقوق الطبع والنشر، أو سرية، أو يجب عليك إنشاء نسختك الخاصة.
com.kabam.bigrobot، الإصدار 9.2.0). حجمه حوالي 800 ميغابايت. احصل على
نسختك الخاصة. اسم الحزمة والإصدار موجودان في TECHNICAL_NOTES.md.libil2cpp.so الأصلي وأصول اللعبة. كلاهما يأتي مباشرة من APK. قم بفك ضغط
APK، المكتبة تحت lib/arm64-v8a/، الأصول تحت assets/.server/gen_certs.sh لإنشاء
زوج مطابق خاص بك، ثم وجه مخزن الثقة للجهاز إلى CA الجديد.patches/patch_il2cpp.py ضد
libil2cpp.so الأصلي من APK.re_notes/dump.cs من مكتبة APK والبيانات الوصفية العامة.تحتاج إلى تثبيت APK على محاكي يدعم ترجمة ARM (تم استخدام LDPlayer 9، مع صلاحيات الجذر ونظام قابل للكتابة)، و Python على الكمبيوتر الشخصي، والعناصر من القسم أعلاه.
bash server/gen_certs.sh.python patches/patch_il2cpp.py path/to/original/libil2cpp.so --apply.tools/nativehook/deploy.sh.python server/fakeserver.py. يجب أن يكون قابلاً للوصول
على المنفذين 443 و 80 من المحاكي.bash tools/provision_ldplayer.sh <your-PC-LAN-IP>. أعد تشغيل هذا
بعد كل إعادة تشغيل للمحاكي.إذا تعلق الأمر عند تسجيل الدخول، تحقق من أول عنصر في قسم المصائب قبل أي شيء آخر.
هذه هي التي كلفتني ساعات. تم تدوينها حتى لا تكلفك نفس الشيء.
libdothook.so. البايتات والإزاحات الدقيقة موثقة في
سكريبت التصحيح وفي TECHNICAL_NOTES.md.provision_ldplayer.sh أو لن يتصل أي شيء.err، وليس error. استخدام الحقل الخطأ ينتج
ردودًا يتجاهلها العميل بصمت أو يعالجها بشكل خاطئ.هذا هو العمل الحقيقي، وهو كبير. إليك شكله وأين تبدأ.
الهدف هو إعادة إنشاء، يدويًا، محتوى جانب الخادم الذي كان يُبث إلى العميل: المهام والبعثات، الخرائط وتشكيلات أعدائها، القائمة الكاملة بإحصائيات وقدرات كل روبوت، صيغ القتال، والاقتصاد. لا شيء من هذا موجود بعد الآن، لذا يجب كتابة كل شيء من جديد، بالأشكال الدقيقة التي يتوقعها العميل.
الطريقة التي تعمل هي الحلقة التي بني عليها هذا المشروع. شغّل اللعبة مع الربط
المرفق. يسجل الربط كل مفتاح يقرأه العميل. عندما يطلب العميل شيئًا لم تقدمه،
ترى بالضبط ما يريده. ثم تُنشئ ردًا بالشكل الصحيح،
تضعه في server/responses/ أو تضيفه إلى المعالج الديناميكي في
fakeserver.py، تعيد التشغيل، وتتحقق من أن العميل يقبله ويتقدم. كرر. كل
شاشة في البناء الحالي تم إحضارها بهذه الطريقة بالضبط. re_notes/dump.cs يخبرك
بشكل كل هيكل حتى قبل أن تشغل، لأنه يسرد كل حقل يقرأه العميل.
ترتيب معقول للهجوم:
decompile_targets.py) واقرأ
الحقول المحددة.ASSET_INVENTORY.txt، لذا أنت
تؤلف فقط أرقامًا وتعريفات قدرات، وليس أصولًا.TECHNICAL_NOTES.md للمفاتيح.كن واقعيًا بشأن الحجم. حتى للألعاب التي أنقذ فيها المعجبون بيانات الخادم الحي قبل الإغلاق، فإن إنشاء خادم خاص هو مشروع طويل. هنا لا توجد بيانات محفوظة لتبدأ منها، لذا كل رقم وكل قدرة يجب البحث عنها أو إعادة اختراعها ثم التحقق منها مقابل العميل. هذا جهد متعدد الأشخاص ومتعدد السنوات إذا كان الهدف هو اللعبة الحقيقية. ومع ذلك، لم يعد المسار لغزًا. الإقلاع تم حله، حلقة التغذية الراجعة موجودة، نموذج النوع تم تفريغه، والأصول سليمة. ما تبقى هو كمية كبيرة جدًا من إعادة بناء البيانات بعناية، وليس المزيد من الهندسة العكسية للمجهول.
ابدأ بـ TECHNICAL_NOTES.md. إنه المرجع التقني الأعمق، مع التصحيحات الدقيقة،
أشكال البيانات المستردة، والنتائج المحددة، بمزيد من التفصيل من هذا README. ثم شغّل الحلقة.
بالتوفيق. إنها آلة حقيقية الآن. تحتاج فقط إلى إعادة بناء محتواها.
libdothook.soتوصيل الجهاز. يجب على المحاكي إرسال نطاقات Kabam إلى الكمبيوتر الشخصي والثقة في
الشهادة المزيفة. tools/provision_ldplayer.sh يفعل هذا في خطوة واحدة: يدفع المكتبة المصححة
والربط، ويعيد توجيه أسماء مضيفي Kabam إلى عنوان LAN للكمبيوتر الشخصي عبر ملف المضيفين،
ويُركب CA المزيف في مخزن الثقة للنظام، ويُخفف SELinux. قم بتشغيله بعد كل
إعادة تشغيل للمحاكي، لأن تلك التركيبات لا تبقى بعد إعادة التشغيل.