أساسيات Auto Assembler: فهم سكربتات حقن AOB في Cheat Engine
ما هو إدخال السكربت، وكيف يعمل [ENABLE] و[DISABLE]، وشرح سطرًا بسطر لقالب حقن AOB في Cheat Engine: aobscanmodule وalloc والتسميات والرموز والأحرف البديلة.
معظم الإدخالات المفيدة في جداول الغش المشتركة ليست قيمًا عادية بل سكربتات: صحة لا نهائية، بلا إعادة تعبئة، صناعة مجانية. تُكتب هذه السكربتات في Auto Assembler الخاص بـ Cheat Engine، وهو تنسيق برمجي صغير يجمع بين لغة التجميع x86 وأوامر للعثور على الشيفرة وتعديلها. يشرح هذا الدليل ما يفعله هذا السكربت، ويستعرض قالب حقن AOB الذي يولّده Cheat Engine لك، ويغطي القواعد التي تجعل السكربت موثوقًا.
ستستفيد أكثر إذا كنت تعرف كيف تعثر على قيمة وما هو المؤشر؛ يغطي دليل فحص المؤشرات هذه الخلفية. تغيّر السكربتات شيفرة اللعبة أثناء تشغيلها، لذا استخدمها فقط في الألعاب الفردية وغير المتصلة، واحفظ قبل الاختبار، واحتفظ بنسخ احتياطية من ملفات الحفظ.
ما هو إدخال السكربت
إدخال السكربت هو عنصر في قائمة العناوين يعرض عمود القيمة فيه <script>. وبدلًا من الإشارة إلى قيمة، فهو يحتوي على شيفرة Auto Assembler. تفعيل خانة Active للإدخال يشغّل قسم [ENABLE] في السكربت، وإلغاء التفعيل يشغّل قسم [DISABLE]. يغطي دليل كيفية استخدام جدول الغش هذا من جهة المستخدم.
السكربت النموذجي لا يغيّر القيمة مرة واحدة. بل يغيّر تعليمة اللعبة نفسها التي تكتب القيمة، فيبقى التأثير دائمًا ما دام السكربت مفعّلًا. فمثلًا، يمكن تحويل التعليمة التي تخزّن صحتك الجديدة بعد الضرر إلى شيفرة تخزّن الحد الأقصى بدلًا منها.
للسكربتات ميزة كبيرة على العناوين العادية: فهي تحدد هدفها بالبحث عن نمط من البايتات في شيفرة اللعبة، فتعمل بعد إعادة التشغيل دون أي مؤشر. الثمن هو اعتمادها على بقاء تلك الشيفرة كما هي، ما يربطها بإصدار معين من اللعبة.
[ENABLE] و[DISABLE]
لكل سكربت قابل للتبديل القسمان معًا. يعثر [ENABLE] على الشيفرة، ويحجز ذاكرة للشيفرة الجديدة، ويكتب قفزة من تعليمة اللعبة إلى الشيفرة الجديدة. أما [DISABLE] فيتراجع عن كل ذلك: يعيد كتابة البايتات الأصلية، ويزيل الأسماء التي سجّلها، ويحرر الذاكرة. القسم [DISABLE] المكتوب جيدًا يترك اللعبة كما كانت تمامًا. وإذا كان مفقودًا أو خاطئًا، فإن إلغاء تفعيل الإدخال يترك اللعبة في حالة معدّلة أو معطوبة حتى تعيد تشغيلها.
العثور على التعليمة وتوليد القالب
- ابحث عن القيمة التي تريد التحكم بها وأضفها إلى قائمة العناوين.
- انقر عليها بزر الفأرة الأيمن واختر Find out what writes to this address. اجعل القيمة تتغير في اللعبة. ستظهر تعليمة واحدة أو أكثر في القائمة.
- حدد التعليمة وافتحها في المفكك (Memory Viewer).
- مع تحديد تلك التعليمة في Memory Viewer، افتح Tools → Auto Assemble.
- في نافذة Auto Assemble، اختر Template → AOB Injection. أكّد العنوان واقبل اسم الرمز أو غيّره، وقيمته الافتراضية
INJECT. - عدّل السكربت، ثم استخدم قائمة File في النافذة لإسناده إلى جدول الغش الحالي. سيظهر في قائمة العناوين كإدخال سكربت جديد.
قالب حقن AOB سطرًا بسطر
فيما يلي مثال على البنية التي ينتجها القالب. اسم العملية والرمز والبايتات مختلقة للتوضيح؛ وهذه ليست شيفرة لأي لعبة حقيقية.
{ EXAMPLE STRUCTURE ONLY - not code for a real game.
Process: game.exe Symbol: INJECT Bytes: made up }
[ENABLE]
aobscanmodule(INJECT,game.exe,89 83 F0 00 00 00 48 8B 5C 24 ??) // should be unique
alloc(newmem,$1000,INJECT)
label(code)
label(return)
newmem:
mov eax,#999 // your change: store 999 instead
code:
mov [rbx+000000F0],eax // the original instruction
jmp return
INJECT:
jmp newmem
nop
return:
registersymbol(INJECT)
[DISABLE]
INJECT:
db 89 83 F0 00 00 00 // original bytes: mov [rbx+000000F0],eax
unregistersymbol(INJECT)
dealloc(newmem)
aobscanmodule
يبحث aobscanmodule(INJECT,game.exe,...) في ذاكرة الوحدة game.exe عن نمط البايتات، وإذا عثر عليه يعرّف الاسم INJECT بأنه العنوان الذي يبدأ منه. حصر البحث في وحدة واحدة أسرع ويتجنب التطابقات الخاطئة في أماكن أخرى. توجد أوامر مشابهة: يبحث aobscan في كل الذاكرة، ويبحث aobscanregion بين عنوانين. إذا لم يُعثر على النمط يفشل تفعيل السكربت مع خطأ، وهذا هو العرض المعتاد بعد تحديث اللعبة.
alloc
يحجز alloc(newmem,$1000,INJECT) 0x1000 بايت من الذاكرة لشيفرتك ويسميها newmem. يطلب المعامل الثالث من Cheat Engine حجزها قرب INJECT. في ألعاب 64 بت هذا مهم: فالقفزة القصيرة jmp ذات 5 بايت لا تصل إلا إلى نحو 2 غيغابايت في أي اتجاه، والحجز القريب يبقي القفزة صغيرة بما يكفي لتحل محل التعليمة الأصلية.
label
يعلن label(code) وlabel(return) عن أسماء لمواضع تُعرَّف لاحقًا. يحدد code المكان الذي تُعاد فيه تعليمة اللعبة الأصلية؛ ويحدد return التعليمة التالية مباشرة للتعليمة المعدّلة، حيث يستمر التنفيذ.
newmem وcode
كل ما تحت newmem: هو شيفرتك، يليه التعليمة الأصلية تحت code:. في المثال، يضبط mov eax,#999 المسجّل على 999 (العلامة # تدل على رقم عشري)، ثم تخزّنه التعليمة الأصلية mov [rbx+000000F0],eax، فتُكتب القيمة دائمًا 999. وأخيرًا يعود jmp return إلى شيفرة اللعبة.
INJECT: jmp newmem
عند العنوان الذي عُثر عليه، يستبدل السكربت التعليمة الأصلية بـ jmp newmem. تشغل القفزة 5 بايت لكن التعليمة الأصلية هنا كانت 6 بايت، لذلك يملأ nop البايت المتبقي؛ وإلا حاول المعالج تنفيذ نصف تعليمة. يحسب القالب ذلك لك. يوضع return: بعدها مباشرة، فيحدد التعليمة التالية غير المعدّلة.
registersymbol وunregistersymbol
يجعل registersymbol(INJECT) الاسم INJECT معروفًا عالميًا في Cheat Engine. وهذا ما يتيح لقسم [DISABLE]، الذي يعمل لاحقًا وبشكل منفصل، أن يجد العنوان نفسه دون فحص جديد. كما يتيح لإدخالات أخرى الإشارة إليه. ويزيل unregistersymbol(INJECT) في [DISABLE] الاسم.
استعادة البايتات الأصلية وdealloc
في [DISABLE]، يكتب INJECT: متبوعًا بـ db 89 83 F0 00 00 00 البايتات الأصلية فوق القفزة، فتعود تعليمة اللعبة كما كانت تمامًا. ثم يحرر dealloc(newmem) الذاكرة التي كانت تحمل شيفرتك. الترتيب مهم: استعد القفزة أولًا حتى لا تكون اللعبة تستخدم newmem عند تحريرها.
الأحرف البديلة ولماذا تهم التواقيع الفريدة
يسمى نمط البايتات في aobscanmodule توقيعًا. ويجب أن يحقق شرطين:
- يجب أن يكون فريدًا. إذا تكرر النمط أكثر من مرة، يعدّل السكربت أول تطابق، وقد يكون دالة مختلفة تمامًا. هكذا تتسبب السكربتات في تعطل الألعاب أو تغيير الشيء الخطأ. يضيف القالب التعليق "should be unique" كتذكير.
- يجب أن يصمد أمام التغييرات الصغيرة. بعض البايتات تتغير بسهولة بين إصدارات اللعبة أو حتى بين مرات التشغيل: الإزاحات داخل التعليمات، والعناوين النسبية للاستدعاءات والقفزات، والثوابت المضمنة. استبدال هذه البايتات بأحرف بديلة
??يجعل النمط يستمر في التطابق عندما تتغير هذه التفاصيل فقط.
يتعارض هذان الهدفان. إذا كانت البايتات قليلة جدًا يتطابق النمط في أماكن كثيرة؛ وإذا كانت الأحرف البديلة كثيرة جدًا يصبح عامًا من جديد. الطريقة العملية هي الإبقاء على بايتات رمز العملية، واستبدال الإزاحات والعناوين المتغيرة بأحرف بديلة، وتضمين بضع بايتات من التعليمات التالية للسياق. ثم تحقق من أن النمط فريد: في النافذة الرئيسية، اضبط Value Type على Array of byte، والصق النمط وافحص مع ضبط خيارات الذاكرة لتشمل الذاكرة القابلة للتنفيذ. النتيجة المطلوبة هي نتيجة واحدة بالضبط. تساعدك أداة إنشاء توقيع AOB على تحويل البايتات المنسوخة إلى نمط بأحرف بديلة وعلى معرفة البايتات المرجح تغيّرها.
اختبار السكربت
- احفظ اللعبة واحتفظ بنسخة احتياطية من الحفظ قبل أول اختبار.
- فعّل السكربت، وتحقق من التأثير، ثم عطّله وتأكد من أن اللعبة تعمل بشكل طبيعي مجددًا.
- بدّله عدة مرات. السكربت الذي يفشل عند التفعيل الثاني غالبًا ما يكون قسم
[DISABLE]فيه لا يتراجع بالكامل عما فعله[ENABLE]. - احذر من التعليمات المشتركة. فقد تكتب التعليمة التي تكتب صحتك صحة الأعداء أيضًا؛ وفي هذه الحالة يؤثر تغييرك على الجميع، وستحتاج إلى التمييز بين الحالتين قبل تغيير أي شيء.
عندما يعمل السكربت، أعطِ الإدخال وصفًا واضحًا واحفظ الجدول. وعندما تتحدث اللعبة ويفشل تفعيل السكربت، فالتوقيع هو أول ما يجب فحصه.
التعليقات
لا توجد تعليقات بعد
كن أول من يشارك رأيه.