منذ مقالتي الأخيرة ، لدهشتي الكبيرة ، مهتم بك. قررت أن أكمل نتيجتها ، وهي نسخة مخترقة من لعبة "Contra (J) [T + Rus_Chronix]" ، مع القليل من الوظائف ، مع إظهار "حقن الكود" في نفس الوقت على NES. هذه المرة سأجعل اللاعبين يبدأون اللعبة باستخدام Spreadgun المضخّمة ، لتحصل عليها في اللعبة تحتاج إلى اختيار الرمز "S" ، متبوعًا بـ "R".

كل المهتمين ترحيب تحت القط.
تقليديا:
تسجيل الفيديو مملة ومملة لهذه العملية ونحن نخطط تقليديا تسلسل الإجراءات.
- البحث عن العناوين
- معرفة قيمة Spreadgun ضخها
- اكتشف ما يكتبه لهذه العناوين في بداية اللعبة
- أعد كتابة ROM
- Easyway - تغيير قيمة السلاح الأساسي إلى ضلع نشر
- الطريق الصعب - استخدم حقنة الشفرة الكاملة في حالة فشل الطريقة السهلة
- احفظ النتيجة في ملف جديد
للبحث عن عناوين ، نستخدم الطريقة الموضحة مسبقًا ، ولكن تذكر أن الأرواح كانت في عناوين مجاورة ، وسوف نبحث فقط عن أسلحة من اللاعب الأول على أمل أن يكون اللاعب الثاني في مكان قريب. عند فتح نافذة "ساعة رام" بعد بداية المستوى الأول ، فإننا نبحث عن قيمة غير معروفة. أعتقد أن السلاح الأساسي مضبوط على 0 ، لكنني لا أعرف بالتأكيد.
نركض على طول المستوى دون أن نمضي قدمًا ، ونطلق النار في كل الاتجاهات ونتخلص من القيم المتغيرة. السلاح لم يتغير بعد.
دعنا نستخدم خيار نافذة أخرى ، أو بالأحرى ، في الحقل "مقارنة بـ / حسب" ، مع تسليط الضوء على تردد الراديو "عدد التغييرات" ، وضعت في الحقل 0. ونوع المقارنة بالطبع "يساوي". السلاح لا يزال لم يتغير.
لذا فإن القفز من الخيار "يساوي القيمة السابقة" ، إلى الخيار "عدد التغييرات يساوي 0" ، يمكنك الوصول إلى حوالي 10000 عنوان. عندما تقلل الفحوصات الإضافية من قائمة العناوين بشكل طفيف للغاية أو لا تقلل على الإطلاق ، يمكن للمرء المضي قدمًا بما يكفي لضرب السلاح الأول.
بعد الحصول عليها ، نستخدم طريقة البحث على الفور "لا تساوي القيمة السابقة" ، ونخفض القائمة من خلال البحث "عدد التغييرات هي 1" ، تغير السلاح مرة واحدة بالضبط.
في المكان الذي نلتقط فيه سلاحنا الأول ، يظهر مكبر للصوت أيضًا. بعد تحديده واختياره ، يمكنك تقليل عدد العناوين إلى 1 ، ولكن إذا لم ينجح ذلك ، فقتل شخصيتك فقط ، ثم غيِّر السلاح مرة أخرى. (لا تنس البحث بعد كل تغيير).
مع وجود مضخم سلاح ، هناك بعض المخاطرة في أنه لن يغير قيمة السلاح نفسه ، ولكن العلم في مكان آخر في الذاكرة ، ولكن دعونا نأمل أن يحفظ مؤلفو اللعبة الذاكرة والتعليمات. وكنت محظوظاً لقد غيرت "R" قيمة السلاح ذاتها وكان العنوان بتنسيق AA 16 . (قد أكون مخطئًا ، لكنني راقبت سلاح البطل مرارًا وتكرارًا في إصدارات مختلفة من لعبة Contra ، كما في كل مكان كان هذا العنوان AA 16 ).
لاحظت أيضًا أن المكافأة "R" زادت القيمة في العنوان بمقدار 16 10 أو 10 16 ، أي بزيادة الرقم الأول للرقم السداسي عشر.
بعد إعادة التشغيل في نافذة "ساعة رام" ، يمكن أن نرى أن القيمة الأساسية هي حقا 00 16 ، وزيادة المكافأة "M" الرقم الثاني بنسبة 1 ، والمكافأة "R" الأول.
يُمكنك الذهاب إلى موقع نشر ، فسوف يجتمع بالتأكيد على هذا المستوى ، أو يمكنك تغيير قيمة العنوان لمعرفة الأرقام والأسلحة التي يصنعونها. من الناحية العملية ، اكتشفت أن 01 16 هو "Machinegun" ، و 02 16 هي "Fire" ، و 03 16 هي "Spreadgun" ، و 04 16 هي "Laser". عند إدخال قيم أخرى في الرقم الثاني ، تحدث العديد من مواطن الخلل.
بعد إعادة ضبط اللعبة وإدخال القيمة 1x 16 ، (حيث يمثل "x" أحد الخيارات المقبولة) قبل تحديد المكافأة "السريعة" ، يمكنك معرفة أن إعادة تحديد المكافأة لا تغير أي شيء.
يمكنك الآن إعادة تشغيل اللعبة وبدء اللعبة لشخصين ومحاولة تغيير العناوين المجاورة لـ AA 16 . (هناك اثنان منهم ، لن يكون البحث طويلاً). بعد إطلاق النار على اللاعب الثاني ، اكتشفت بسرعة كبيرة أن أسلحة اللاعب الثاني مخزنة بالفعل بالقرب من العنوان AB 16 . والآن نحن نعرف العناوين التي تهمنا والقيمة التي ينبغي وضعها هناك ، فقد حان الوقت لمعرفة ما يكتبه لهذه العناوين.
بعد إلقاء نقطة توقف على سجل هذا العنوان ، اكتشفت أن التسجيل يحدث هناك عدة مرات وواحد بعد شاشة البداية. الكود التالي يجعل هذا الإدخال:
عنوان | شفرة التشغيل | ذاكري | الحجج | A | X |
---|
C307 | A2 28 | LDX | # 28 دولار | ؟؟ | ؟؟ |
C309 | A9 00 | LDA | # $ 00 | ؟؟ | 28 أو 29 أو ... أو F0 |
C30B | 95 00 | STA | 00 دولار ، س | 00 | 28 أو 29 أو ... أو F0 |
C30D | E8 | INX | | 00 | 28 أو 29 أو ... أو F0 |
C30E | E0 F0 | CPX | # $ F0 | 00 | 29 أو 30 أو ... أو F0 |
C310 | D0 F9 | BNE | C30B دولار | 00 | 29 أو 30 أو ... أو F0 |
إذا كنت تقرأ اللعبة بعناية ، فستحدد نطاق العناوين من 0028 16 إلى 00F0 16 ، ومن الواضح أن كلا العنوانين يهمنا في النطاق. لذلك لن يكون هناك طريقة سهلة. يجب أن أستخدم "Code Injection" وأبسط الحلول التي أراها لاكتشاف من أين أتيت من هنا ، وأعد توجيه التنفيذ إلى مكان ما خالٍ من الشفرة والبيانات في الذاكرة ، واكتب إصدار روايتي من الحلقة التي تشغل النطاق بالكامل باستثناء العنوانين 00AA 16 و 00AB 16 وإرجاع النقل التنفيذ مرة أخرى. بالمناسبة ، هذا هو الإصدار الأكثر كلاسيكية للحقن. يمكنك أيضًا افتراض أننا وصلنا إلى هنا من تعليمات JSR (الانتقال إلى SubRoutine) ، وهذا سهل للتحقق من المكدس.
كيف يعمل المكدس؟في المعالجات 6502 ، يوجد المكدس دائمًا في نطاق العنوان 0100 16 - 01FF 16 لجميع أجهزة الكمبيوتر التي تعتمد على هذا المعالج ، وينمو من عنوان أكبر إلى عنوان أصغر. يوجد سجل منفصل يشير إلى الجزء العلوي من الحزمة ، في البداية يساوي FF 16 نظرًا لأن البايت الأكثر أهمية لا يتغير أبدًا. يشير السجل نفسه دائمًا إلى أعلى بايت مشغول ببيانات مفيدة.
لا يُظهر مصحح أخطاء بروتوكول المضاهاة قيمة سجل "Stack Pointer" ، بل يُظهر العنوان الذي يشير إليه السجل وهو الآن 01F2 16 ، وتظهر الحسابات البسيطة أن آخر البيانات الموجودة على المكدس هي C3 16 و C2 16 ، مما قد يؤدي إلى أفكر في العنوان C3C2 16 ولكن 6502 هو معالج من النوع "Little Endian" ، وبالتالي ، عند تنفيذ الإرشادات وتخزين العنوان في الذاكرة أو في الحزمة ، تتم كتابة البايت الأقل أهمية أولاً. وإذا كان العنوان موجودًا بالفعل في الجزء العلوي من الحزمة ، فهذا هو العنوان C2C3 16 . وهذا هو عنوان الحجة الأخيرة لتعليمات JSR ، إذا ، مرة أخرى ، هو عنوان على الإطلاق. من السهل جدًا التحقق ، انظر فقط إلى ما كتبه وحدتي بايت أعلى العنوان C2C3 16 .
عنوان | شفرة التشغيل | ذاكري | الحجج |
---|
C2C1 | 20 07 C3 | JSR | C307 دولار |
كما ترون ، هذه تعليمات JSR إلى C307 16 ، مما يعني أن افتراض الروتين الفرعي صحيح.
الآن تحتاج إلى كتابة رمز الحقن بشكل صحيح ، والعثور على مكان مناسب له ، وكتابته إلى هذا المكان وإعادة توجيه تعليمات JSR إلى هذا الحقن.
لهذا ، من المريح جدًا استخدام المفكرة ، ولدي رمز Visual Studio لذلك. لكل شخص أسلوبه في الكتابة ، شخصيًا ، أنا أول من يكتب تعليمة JSR بعنوانه ، من أجل معرفة مكان التغيير وكود التشغيل الكامل ، لمعرفة ما الذي يجب تغييره.
بعد بضعة مسافات بادئة ، قمت بتكرار رمز الحلقة ، ويمكن استخدامه بالفعل بدون عناوين ، لكن من المفيد للغاية رؤية بعض المصطلحات المختصرة التي تحتوي على وسيطات غير رموز الشفرات ، ومن المفيد الحصول على التعليمات التي تتبع هذه الحلقة مع العنوان لمعرفة مكان الإرجاع من الحقن.
C2C1:20 07 C3 JSR $C307 A2 28 LDX #$28 A9 00 LDA #$00 95 00 STA $00,X E8 INX E0 F0 CPX #$F0 D0 F9 BNE $C30B C312:A2 07 LDX #$07
بضعة مسافات أسفل يمكنك كتابة رمز الحقن نفسه ، في الواقع هو تكرار للدورة نفسها مع بعض الإضافات.
C312:A2 07 LDX #$07 A2 28 LDX #$28 A9 00 LDA #$00 95 00 STA $00,X E8 INX E0 AA CPX #$AA D0 F9 BNE -7 A9 13 LDA #$13 95 00 STA $00,X E8 INX E0 AC CPX #$AC D0 F9 BNE -7 A9 00 LDA #$00 95 00 STA $00,X E8 INX E0 F0 CPX #$F0 D0 F9 BNE -7
من أجل الوضوح ، أشرت إلى المسافة البادئة بدلاً من عنوان موقع الانتقال.
إذا لم تتمكن من قراءة هذا الرمزهذه هي نفس الدورة ، ولكن مقسمة إلى ثلاثة أجزاء ، في الدورة الأولى ، نقارن السجل X بالقيمة AA 16 ، حيث نحتاج إلى صفر كل العناوين على العنوان 00AA 16 ، بعد أن وضعنا 13 16 في السجل A ، قيمة الموزعة التي تم ضخها وكتابة الدورة الثانية إلى العنوان 00AC 16 يبدأ من خلالها يجب أن تبقى بقية النطاق صفراً مرة أخرى. نعود لتسجيل الصفر والصفر ما تبقى من النطاق.
لا بد من استكمال تعليمات عودة الحقن في النهاية.
E0 F0 CPX #$F0 D0 F9 BNE -7 4C 12 C3 JMP $C312
الآن ، من أجل الراحة ، أفضل كتابة الرموز الرمزية أدناه في الملف.
4C 12 C3 JMP $C312 A2 28 A9 00 95 00 E8 E0 AA D0 F9 A9 13 95 00 E8 E0 AC D0 F9 A9 00 95 00 E8 E0 F0 D0 F9 4C 12 C3
وبعد حساب شفرة التشغيل ، من السهل معرفة وجود 32 منها. لذلك ، تحتاج إلى العثور على 16 16 عناوين غير مشغولة على ROM. وكقاعدة عامة ، فإن العناوين غير المأهولة عبارة عن مسافات كبيرة بنفس القيم ، وغالبًا ما تكون الأصفار أو FF 16. إنها مجرد قطعة كبيرة يجب العثور عليها ، ويجب أن تحتوي على 35 10 عنوانًا على الأقل حتى يكون هناك بعض الهامش.
في "محرر Hex" ، وجدت هذا النطاق في B29E 16- BFFF 16 . قد يكون استخدام بداية هذه المواقع المجانية للحقن أمرًا خطيرًا ، لذلك أنصحك بكتابة رمز الحقن في النهاية. العنوان الأكثر ملاءمة لبدء الحقن هو BFE0 16 ، ولكن هذا هو العنوان في ذاكرة وحدة التحكم ، لمعرفة مكان وجوده في ملف ROM ، وانقر بزر الماوس الأيمن فوقه واختر "Go Here In ROM File".
الآن يمكنك نسخ شفرة التشغيل بأكملها هنا (32 قيمة). تعليمات تغيير اللمس النهائي
C2C1:20 07 C3 JSR $C307
للقفز إلى عنوان الحقن لدي هو BFE0 16 .
C2C1:20 E0 BF JSR $BFE0
بالطبع ، العثور على المكان الحقيقي للتعليمات على ROM.
الجواب على سؤال المهنيين غافل.يحصل عنوان تعليمة JSR على الحزمة ، وبالتالي ، بصرف النظر عن مكان القفز ، سيكون هناك نفس عنوان المرتجعات ، ومن الحقن نعود إلى الرمز مع تعليمة JMP التي لا تؤثر على الرصة بأي شكل من الأشكال. وبالتالي ، فإن تعليمات RTS تعمل في نفس المكان دون حقن ، وتعود إلى نفس المكان مثل بدون حقن. نتيجة لذلك ، هذا الحقن لا يكسر المكدس.
ملاحظة: من أجل الخير ، لا تزال بحاجة إلى التأكد من أنه بعد الموت يتم إعادة إنتاج الأحرف بنطاق انتشار كبير ، لكنني متأكد من أنني كنت مسلحًا بالمعرفة المكتسبة يمكنك التعامل معها بنفسك. سأحول عيني إلى شيء آخر. محرك الوحدة على سبيل المثال.