الدرس 7 من 8
ترقيع البايتات
- 15 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
بايت واحد يغيّر السلوك
الشرح
الترقيع (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)
المطلوب
اكتب الدالة patch(program, index, value) التي تُرجع نسخة bytes جديدة فيها البايت رقم index يساوي value، دون أن يتغيّر الأصل. ثم رقّع مُعامَل LOAD في program واحفظ الناتج في patched بحيث يطبع الحرف J بدل H. والمحاكي run من الدرس السابق موجود لتجرّب به.
الفحوص
6 فحوص- الترقيع يغيّر البايت المطلوب
- الأصل يبقى كما هو
- الناتج من النوع bytes وطوله ثابت
- البرنامج المرقَّع يطبع الحرف J
- المتغيّر patched ناتج استدعاء patch على program
- على برنامج آخر وفهرس آخر