تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Command & Conquer Generals Zero Hour (RANDOM hack)
#1
السلام عليكم
الكثير يود ان يجرب اللعبة مع تغييير قيم رئيسية تعتمد عليها اللعبة كالقوة/السرعة لتعطي تجربة لعب اخرى
وهذا ماسنفعله في هذا الموصوع على لعبة Command & Conquer : Generals Zero Hour
لغة برمجة اللعبة : C++
البئة : x32
محرك اللعبة يعتمد على : DirectX 8.1
الأدوات المستخدمة x32dbg,Process Monitor
قبل ان نبدأ لنأخذ لمحة عن هذه اللعبة
Command & Conquer Generals Zero Hur 2003-2004
هي لعبة استرتيجية اصدرت من شركة EA GAMES تدعم لعب فردي ولعب متعدد اللاعبين تتالف من ثلاث جيوش رئيسية هي GLA,USA,China من كل جيش رئيسي هناك ثلاث جيوش مثلا
GLA
GLA ToXin
GLA Demo
GLA Stealth
وبامكان اللاعب اختيار جيش واحد فقط من اصل 12 جيش كما يوجد خبار اختيار عشوائي وهو المستخدم في معظم الالعاب متعدد اللاعبين Random
صورة من داخل اللعبة
[صورة مرفقة: DemoPhoto.PNG]
تعتمد اللعبة بشكل رئيسي على ال DirectX(DirectPlay,DirecInput,DirectMusic,Direct3D...) مما يعطي فرصة لأستغلال هذا وعمل هوك لدوال DirectX عمل هوك لمكتبة d3d8.dll
____________________________
 تغير القيمة العشوائية عند اختيار جيش
 كما نعلم القيم العشوائية تعتمد عليها الكثير من الالعاب بعضها لجعل اللعبة ان لا تكون مملة ومن اجل التنويع
 وقد يمكن استخدام الدالة Rand() لتوليد قيمة عشوائية من بين قيم
 حسنا الان لنشغل اللعبة
 MultiPlayer>NETWORK>CREATE  GAME
 ونختار Random
[صورة مرفقة: StartGame.PNG] ثم نذهب للمنقح و نعمل Attach للعبة ونضع نقطة توقف عند الدالة Rand() ونبدأ اللعبة PLAY GAME
 نلاحظ ان اللعبة لم تتوقف
 اذن فاللعبة لا تستخدم دالة Rand() لتوليد ااختيار عشوائي من بين 12 قيمة
 حسنا الآن يوجد لدينا طريقتان لتحديد العنوان الذي سيقودنا للعنوان الذي سنبدأ التتبع منه , سأقوم بالطريقة الثانية
 1- اطلق ProcessMonitor وقم بقلترة جميع البرامج التي في الذاكرة للعبة فقط لكي نرى  نراقب سلوك اللعبة عند توليد اختيار عشوائي
 سنلاحظ انها تنشئ مقبض لملف موسيقى الجيش مثلا
 الاختيار العوائي كان جيش GLA ToXin
 فستحمل موسيقى GLA (وأشياء اخرى كصورة الجنرال واصوات القوات) (موسيقى GLA ,GLA ToXin , GLA Demo ,GLA Stealth واحدة ونفس الشيئ China , USA )
 [صورة مرفقة: ProcessMoitor_0.PNG]
 حسنا الآن اعد الدخول وختر Random وضع نقطة توقف عند الدالة CreateFile ومن هنا نبدء بالرجوع ونرى من يستدعى الروتين الذي يستدعي روتين اخر
 2- بالتاكيد عند اختيار GLA فانه سيتم دقع قيمة push [0xAddressFor"GLA"]
 اذن سنبحث عن في نصوص اللعبة على GLA سنضع على جميعهم نقطة توقف ونبدأ Play GAME
[صورة مرفقة: SearchGLASting.PNG]
[img] https://cdn.discordapp.com/attachments/7...eenGLA.PNG[/img]
 حسنا نلاحظ انه تم التوقف عند العنوان
005753F6
وقد تم تحميل صورة الجنرال و الموسيقى
حسنا
من هنذا الروتين الذي سنطلف عليه Army0 سنبدا بالرجوع ونرى من يستدعى هذا الروتين الى ان نصل الى عنوان لا تحمل منه الموسيقى ثم سنعود للتنقيذ ونحدد الروتين الذي يحمل الموسيقى ونرى على ماذا يعتمد
وهي عملية طويلة وبسيطة ولن اشرح كيف يتم الرجوه لانه بسيط
فمثلا اصعد للاعلى وانظر من يستدعى هذا الروتين Army0 سترى
CALL From 004503BB
[صورة مرفقة: Army0_1.PNG]
او انزل للاسفل وضع نقطة توقف عند التعليمة RET
بعد تنفيذها ستكون في روتين يستدعي روتين Army0 ضع نقطة توقف في ذلك الروتين على تعليمة RET وانظر من يستدعي ذلك الروتين
وهكذا الى ان تستشعر انه لم يتم تحميل الموسقى من خلال نافذة Process Monitor لانها ستخبرك حين اللعبة تنشئ مقبض مع ملف موسيقى الجيش
[صورة مرفقة: Army0_2.PNG]

[صورة مرفقة: Army0_3.PNG]

اخيرا ستصل للروتين "الرئيسي" الذي يستدعي تلك الروتينات الخاصة بتحميل ملحقات الجيش (صورة الجنرال/الجيش , الاصوات,الموسيقى..)
وسنلاحظ نافذة اللعبة بقيت كما هي دلالة على انه لم يتم تحميل اي شيئ بعد
[صورة مرفقة: Army0_NoThing.PNG]
حسنا الان استمر في تنفيذ تلك الروتينات F8 الى ان ترى في نافذة Process Monitor انه تم تحميل الموسيقى
وسنلاحظ انه تم تحميل الموسيقى عند استدعاء الروتين عند العنوان 004A38EB وسنلاحظ سواد شاشة اللعبة
[صورة مرفقة: Army0_6.PNG]
وسنلاحظ انه بعد تنفيذ الروتين الذي يليه تماما  عند العنوان 004A38FB انه تم تحميل صورة الجيش وتفاصيله  واظهار شاشة التحميل  عبر استدعاء الدالة Present()
المهم اول مايتحمل يتحمل الموسيقى قبل الجيش
حسنا الان لنرى هل هذا الروتين خاص بجيش GLA ام كل الجيوش
اختر Random  وضع نقطة توقف عند اسستدعاء روتين الموسيقى
اذا حلصنا على جيش ليس من احد جيوش GLA الأربعة فهذا يعني ان روتين الموسيقى هو الروتين المستخدم لجميع الجيوش
وهذا ماستلاحظه
الروتين يستخدم لجميع الجيوش
حسنا الان عد واختر Random ودعنا ندخل لروتين الموسيقى Music1 ونرى على ماذا يستند هذا الروتين في تحميل موسيقى الجيوش
[صورة مرفقة: Army0_7.PNG]
يبدو انه روتين طويل  ومليئ بالاستدعائات , حسنا لنقم بعمل مثلما عملنا في الروتين السابق نعمل بهذا الروتين
نبدأ التببع من بداية الروتين ونراقب في شاشة ال ProcessMonitor في متى سيتم انشاء  مقبض بواسطة CreateFile مع ملف الموسيقى
اذا رأينا هذا ونحن نتتبع فسيكون اخر روتين نفذناه هو روتين الموسيقى
ملاحظة : بامكاننا ان نضع نقطة توقف عند الدالة CreateFileA ونرى من سيستدعي تلك الدالة (روتين) ثم نرى من يستدعي ذلك الروتين وهكذا الى ان نصل للروتين Music1 ونرى الاستدعاء روتين Music0 )
 حسنا ونحن نتتبع ...
 [صورة مرفقة: Army0_11.PNG]
 نلاحظ عند العنوان 0060C325 تعليمة تنقل مايشير البه العنوان الذي داخل المسجل EAX اضافة اليه +4 الى المسجل CL
 وذلك العنوان EAX+4 = 033F992D يشير الى نص "LOAD_GLA"
 حسنا الان انسى روتين الموسيقى Music0 و دعنا نغير هذا المحتوى النصي الذي شير اليه العنوان  (033F992D) EAX+4 الى LOAD_USA ونتتبع ونرى ماذا سيحدث حتى روتين Present() (سننفذه)
 
 سنلاحظ انه طلب موسيقى USA بدلا من GLA ولكن مازال الجيش والوحدات كلها  GLA يعني لم يغير الا الموسيقى
 [صورة مرفقة: Army0_10.PNG]
 اذا عد لذلك العنوان وارجعه مثلما كان LOAD_GLA
 هنا نريد ان نعلم هل يتم الكتابة لهذا العنوان ب Load_GLA
 الان نريد ان نعلم من يغير قيمة ُEAX
  هنا تبدأ رحلة بحث عن جذور هذه القيمة ومن المسؤول عن تغيررها
 انظر فوق  تعليمة تنقل نص Load_GLA  سترى تعليمة
 0060C315 | 8B4424 34               | mov eax,dword ptr ss:[esp+34 |
حسنا والان سنبدأ بالنظر للمسجل ESP
 ضع نقطة توقف عند النداء ذو العنوان 0060C310 ثم انظر [ESP+34+4] = 0018F5CF هل تتغير ام لا
 [صورة مرفقة: Army0_12Befor.PNG]
 [صورة مرفقة: Army0_13After.PNG]
لقد تغيرت الى القيمة 031F9924 وهذه القيمة اذا اضفنا اليها 0x4 ستكون عنوان لنص "Load_GLA"
حسنا الات اعد بدء اللعبة  ودعنا ندخل للروتين المنادى عند العنوان 0060C310 ونرى ماذا يحدث هناك
[صورة مرفقة: Army0_14.PNG]
نقل القيمة التي يشير البها العنوان ECX+AC الى EAX حيث  مايشير اليه [ECX+AC] = [07C78E60[ = 031F9924
يعني عنوا1 محتواه يشير الى عنوان2
وعنوان2 يشير الى  القيمة التي اذا اضفنا لها 0x4+ سيصبح عنوان يشير الى Load_GLA
واذا جربت ان تعيد تحميل اللعبة وتختر CHINA ستراه ثابت لم يغير (يبقى يشير الى LOAD_GLA )
حسنا يتضح ان ماسنراقبه الان هو التعليمات التي ستؤثر في تغيير ECX+AC قبل هذا الروتين ولنعلم ان اذا كان ECX = 7C78DB4 قبل دخول الروتين فان الجيش المختار GLA لأننا عندما اخترنا GLA كانت هكذا قيمته عند دخول الروتين
حسنا الان لنخرج من الروتين (نعود لاينما كنا) ونراقب التعليمات التي تتنفذ قبل نداء ذلك الروتين
 نلاحظ قبل نداء الروتين تماما عند العنوان 0060C30E نقل محتويات المسجل ESI الى ECX
 [صورة مرفقة: Army0_15.PNG]
 حسنا الان من الواضح اننا سنبدأ بمراقبة المسجل ESI متى يصبح قيمته 07C78DB4 (لأننا سنختار GLA)
 نيدأ عند نداء الرتين Music1 عند العنوان 004A38EB
 [صورة مرفقة: Army0_16.PNG]
 ونبدأ بالتتبع داخل هذا الروتين F8 وبالطبع لن يكون غريب اذا رأينا أحد المسجلات قد خزنت العنوان الخاص بال GLA (07C78DB4) في غير مسجل ال ESI فمثلما رأبنا انه يتم تبادل القيم بين المسجلات
 سنتوقف عندما نرى اي مسجل يشير او يخزن القيمة 07C78DB4
 استدعاء روتين عند العنوان 0060BD21 , بعد تنفيذه أصبحت قيمة ُEAX = 07DB8DB4 لندعي هذا الروتين A1  
 [صورة مرفقة: Army0_18.PNG]
 هذا الروتين يدفع قيمة EAX قبل تنفيذه وقيمة EAX == 4 في حالة اختيار GLA
 حسنا لنجرب ان نغير قيمة EAX عندما نختار China او USA الى 4 (قبل تنفيذ الروتين) ونستمر بالتنفيذ ونرى ماذا سيحدث (سنراقب نافذة ProcessMonitor )
 (عند دراسة القيم المختلفة بين الجيوش ستلاحظ ان الجيوش مرقمة من الاعلى للأسفل فمثلا USA = 0x2 ,China = 0x3 ,GLA = 0x4 ,USA AirForce = 0x5 وهكذا)
 
 نلاحظ عند العنوان 0060C325
 [صورة مرفقة: Army0_20.PNG]
 أصبح يشير الى Load_GLA
  بعد تنفيذ اللعبة F9
  نلاحظ في نافذة اللعبة   استبدال شعار China (لأني قمت باختيار China ) بشعار GLA وموسيقى China بموسيقى GLA
    [صورة مرفقة: Army0_21.PNG]
  ولكن بعد تحميل اللعبة نلاحظ من القوات والابنية انه  جيش China
حسنا الان نريد ان نعرف متى واين تصبح قيمة EAX = 0x4 قبل دفعها للمكدس ونداء الروتين A1 عند اختيار GLA
ضع نقطة توقف عند بداية الروتين Music1 وابدأ التتبع الى ان ترى EAX = 0x4
يعد التحري والدخول للروتين A1 نلاحظ ان جيع القيم ثابتة حتى ECX ولكن الشيئ المختلف هو ماشير اليه العنوان EAX+14 عند تنفيذ التعليمة عند العنوان 0060BD13
يعني بعد تنفيذ الروتين مباشرة  
[صورة مرفقة: 2.gif]
 هذه القيمة تتغير باستمرار عند تغير الجيش
 فمثلا لو اخترنا RANDOM ستكون القيمة الأولية FF لأنه لم يولد قيمة بعد
 تاكد من وضع نقطة توقف عند استدعاء الروتين Music1 واختر RANDOM وعند التوقف غير هذه القيمة الى 0x4 ستلاحظ ان جيش GLA قد تحمل بكامله (موسيقاه,قواته,شعاره)
 ومن هنا نكون قد عرفنا كيف تغير القيمة العشوائية RANDOM لتصبح على اختيارنا
 ملاحظة : هذه القيمة فقط للاعب1 Player1 يعني الهوست
 واذا جربت ان تتعمق أكثر ستجد انه يعتمد على القيمة التي عبارة عن ناتج جمع EAX,ESI عند العنوان 0048DE8A
  ومن هنا يبدأ البحث عن قيمتين EAX و ESI
هذا فيديو لما عملته بدون تعليقات وشرح
 https://youtu.be/-BQX_AAPWes
 
 حسنا لان لنجرب هذا على لعبة متعددة الاعبين نكون نحن الهوست فيها
 https://www.youtube.com/watch?v=D2TRJUYG6fY
 
 ظهور شاشة سوداء غريبة تقول بان البيانات خسرت تزامنها يعني (قواعد اللعبة) عند اللاعب 0 مختلفة عن اللاعب1
وبالتأكيد هذه الشاشة كان سببها ارسال اشارة من عند اللاعب1 تطلب فيها وقف اللعبة Abort بسبب عدم توافق البيانات المستقبلة مع البيانات الموجودة (غش) ومن هنا ياتي
ضرورة دراسة تلك الاشارة المرسلة وهندستها عكسيا لتخطيها وجعل اللعبة عند الهوست لاتقوم ب Abort للعبة
ولا استطيع اكمال الشرح لأني لم اكمل هندسة عكسية اللعبة حيث التنقل بين المنقح واللعبة عنما تكون Full Screen صعب وانتظار لاعب ليدخل كل مرة ممل (لأن GameRanger لايدعم ادخال Argumetn لبدئ اللعبة واذا جربت ان أدخل للسيرفر الغير رسمي يجب علي تثبيت GenTool (مكافح غش)) يعني بحاجة اما لجهاز اخر يحتوي نسخة غير معدلة
او بالامكان ان كان الجهاز مواصفاته جيد تشغيل اللعبة على نظام اخر في الذاكرة باستخدام VMware/VirtualBox وعمل اتصال جسر Bridge بينهم  او الاتصال بنفس السيرفر كسيرفر VPN ومن ثم تغير ال LAN IP في اللعبة
لتشغيل اللعبة في Windiwed mmode انشئ اختصارا لها Shortcut
خصائص => الهدف
ادخل اخر شيئ
-win -x300 -y300
مثلا
"D:\Program Files (x86)\EA Games\Command & Conquer Generals Zero Hour\generals.exe" -win -quickstart -x300 -y300
 ه
أعضاء أعجبوا بهذه المشاركة : TeRcO , Mahmoud Gz


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم