الدرس 1 من 8
قراءة الأسمبلي
- 16 دقيقة
- 4 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
تتبّع المسجّلات سطرًا سطرًا
الشرح
المعالج لا يقرأ Python ولا C، بل أوامر مرمَّزة بايتات. والأسمبلي (assembly) هو الصورة المقروءة لهذه الأوامر، كل سطر فيه أمر واحد. فحين تحلّل برنامجًا لا تملك شفرته المصدرية تقرؤه بالأسمبلي، وأوّل مهارة تحتاجها أن تقرأ دالة صغيرة وتعرف ما تحسبه.
نكتب الأسمبلي هنا بصيغة Intel، وهي ما تعرضه أدوات التحليل مثل Ghidra وIDA وx64dbg. وفيها يُكتب الأمر هكذا: اسمه، ثم الوجهة، ثم المصدر، والناتج يُحفظ في الوجهة. فالسطر add eax, edi معناه eax = eax + edi. والمسجّلات (registers) خانات صغيرة سريعة داخل المعالج، والدالة تستقبل وسيطها الأوّل في edi وتضع ناتجها في eax قبل أن تعود. والاسمان edi وeax هما النصف الأدنى من المسجّلين الكاملين rdi وrax، أي 32 بتًا من 64.
وهناك صيغة أخرى اسمها AT&T تعرضها أدوات لينكس مثل objdump وgdb افتراضيًّا، وفيها ينعكس الترتيب فيأتي المصدر قبل الوجهة، وتسبق المسجّلَ علامة % والعددَ علامة $. فالأمر نفسه يُكتب فيها هكذا:
Intel add eax, edi eax = eax + edi AT&T add %edi, %eax eax = eax + edi
فإن فتحت ملفًّا بـ objdump فأضف -M intel لتراه بالصيغة التي نقرؤها هنا.
- الأمر
mov a, bينسخ، أيa = b. - الأمر
add a, bيجمع، أيa = a + b. - الأمر
sub a, bيطرح، أيa = a - b. - الأمر
retيعود من الدالة، وناتجها ما فيeax.
وهذه دالة صغيرة كما يُخرجها المترجِم (compiler)، والتعليق بعد الفاصلة المنقوطة يتتبّع قيمة eax:
f: mov eax, edi ; eax = x add eax, eax ; eax = x + x add eax, edi ; eax = (x + x) + x ret
الطريقة أن تمشي سطرًا سطرًا كأنك المعالج، وتكتب قيمة كل مسجّل بعد كل أمر. ولا تحكم على الدالة من أمر واحد، فالمترجِمات تكتب الضرب جمعًا أحيانًا لأنه أسرع، والمعنى في أثر الأوامر كلّها معًا. وقد يُخرج المترجِم الدالة نفسها على صورة أقصر تفاجئك، إذ يحسب الضرب في ثلاثة بأمر عنونة واحد:
f: lea eax, [rdi + rdi*2] ; eax = x + x*2 = 3*x ret
فالأمر lea يحسب عنوانًا لكن المترجِمات تستعمله للحساب السريع، وهذه مفاجأة شائعة في التحليل. والمسجّل eax يلتفّ إذا تجاوزت القيمة 32 بتًا، لكن القيم في هذا الدرس صغيرة فلن تبلغ حدّه.
المطلوب
اكتب الدالة f(x) في Python بحيث تُرجع ما تُرجعه دالة الأسمبلي أعلاه لأي عدد صحيح x، سالبًا كان أو موجبًا.
الفحوص
4 فحوص- الدالة f تُرجع 15 للقيمة 5
- الدالة f تُرجع صفرًا للصفر
- الدالة f تكافئ شفرة الأسمبلي على أعداد كثيرة منها السالبة
- الدالة f على قيمة كبيرة