الدرس 7 من 8

ترقيع البايتات

هدف الدرس

بايت واحد يغيّر السلوك

01

الشرح

الترقيع (patching) أن تغيّر بايتات برنامج جاهز فيتغيّر سلوكه دون أن تعيد بناءه من شفرته. وهو مفيد حين تصلح خطأ في برنامج قديم لك ضاعت شفرته، أو حين تختبر فهمك أثناء التحليل: إن كان هذا البايت مُعامَل LOAD فتغييره يغيّر المخرجات. فإن تغيّرت كما توقّعت فقد فهمت البرنامج.

والنوع bytes في Python لا يتغيّر بعد إنشائه، فالسطر program[1] = 0x4a يرمي خطأً. أمّا bytearray فنسخة قابلة للتعديل، تنسخ البايتات إليها وتغيّر ما تريد ثم تحوّلها إلى bytes من جديد:

ba = bytearray(data)
ba[i] = new_value
patched = bytes(ba)

والنسخ مهمّ، فلا تعدّل الأصل أبدًا، لأنك قد تحتاج إلى المقارنة بين النسختين أو إلى ترقيع آخر من نقطة البداية نفسها.

وأوامر الآلة كما عرفتها:

0x00 HALT      break
0x01 LOAD imm  acc = imm
0x02 ADD  imm  acc = (acc+imm) & 0xFF
0x03 XOR  imm  acc = acc ^ imm
0x04 SUB  imm  acc = (acc-imm) & 0xFF
0x05 OUT       out.append(acc)
02

المطلوب

اكتب الدالة patch(program, index, value) التي تُرجع نسخة bytes جديدة فيها البايت رقم index يساوي value، دون أن يتغيّر الأصل. ثم رقّع مُعامَل LOAD في program واحفظ الناتج في patched بحيث يطبع الحرف J بدل H. والمحاكي run من الدرس السابق موجود لتجرّب به.

الفحوص

6 فحوص
  1. الترقيع يغيّر البايت المطلوب
  2. الأصل يبقى كما هو
  3. الناتج من النوع bytes وطوله ثابت
  4. البرنامج المرقَّع يطبع الحرف J
  5. المتغيّر patched ناتج استدعاء patch على program
  6. على برنامج آخر وفهرس آخر
03

تلميحات

0/3
دروس المسارأتممت 0 من 8

اقرأ الأسمبلي واصطلاح الاستدعاء وتدفّق التحكّم، وابنِ لآلة صغيرة مفكّكًا ومحاكيًا، ثم رقّع بايتاتها وتحقّق من سلامتها.

مستواه متوسّط، وفيه 8 دروس مجموع مدّتها ساعتان.

main.py
المخرجاتPython (Pyodide)

نحمّل بيئة Python الآن. يحدث هذا مرّة واحدة فقط، ثم يحفظها متصفّحك.

–/6

يبدأ الفحص حين تجهز البيئة.

تجد 6 فحوص في بطاقة «المطلوب».

دروس المسارأتممت 0 من 8

اقرأ الأسمبلي واصطلاح الاستدعاء وتدفّق التحكّم، وابنِ لآلة صغيرة مفكّكًا ومحاكيًا، ثم رقّع بايتاتها وتحقّق من سلامتها.

مستواه متوسّط، وفيه 8 دروس مجموع مدّتها ساعتان.