P01NT
0x5 05/10

التفريع المشروط (Conditional Branching)

CMP وTEST وعلم ZF والقفزات الموقعة وغير الموقعة، وأساسيات التحليل الساكن في IDA، ومعملا apple وbomb.

· 13 دقائق قراءة · 2763 كلمة
المحتويات

بسم الله الرحمن الرحيم

في هذا المقال سنتكلم عن القفز المشروط وتعليمات المقارنة.

1. التفريع المشروط (Conditional Branching)

الشكل 5.1: عبارات if-else تُترجم غالبًا إلى مزيج من تعليمات المقارنة والقفز المشروط

الشكل 5.1: عبارات if-else تُترجم غالبًا إلى مزيج من تعليمات المقارنة والقفز المشروط

تُعد بنى التفريع المشروط، مثل عبارات if-else أو الحلقات، من اللبنات الأساسية في اللغات عالية المستوى. لكن هذه البنى لا توجد على مستوى التجميع. بدلًا من ذلك، يترجم المترجم بنى التفريع المشروط إلى مزيج من:

  • تعليمات المقارنة التي تقارن معاملين وتضبط أعلام حالة محددة (قيمًا أحادية البت) في سجل EFLAGS بناءً على النتيجة.
  • تعليمات القفز المشروط التي تفحص هذه الأعلام وتقفز إلى موقع ما إذا تحققت شروط محددة. وإذا لم يتحقق الشرط، يمر التنفيذ (Falls Through) إلى التعليمة التالية.

2. تعليمات المقارنة: CMP و TEST

تُجري تعليمات المقارنة عمليات حسابية أو بتية بين معاملين لتقييم شروط التفريع. وتعليمتا المقارنة الشائعتان هما CMP و TEST:

  • تعليمة CMP تُجري عملية طرح (SUB) بين المعاملين.
  • تعليمة TEST تُجري عملية AND بتية.

لا تعدّل تعليمات المقارنة قيم معاملاتها؛ فالغرض الوحيد منها هو تحديث أعلام الحالة المناسبة في سجل EFLAGS، التي تؤثر في التعليمات المشروطة اللاحقة.

وبينما تؤثر هذه التعليمات في أعلام متعددة، فإن علم الصفر (ZF — Zero Flag) هو الأكثر أهمية للتفريع الأساسي:

  • ZF = 1 (مضبوط — Set): نتيجة العملية كانت صفرًا.
  • ZF = 0 (مصفَّر — Cleared): نتيجة العملية كانت غير صفرية.
mov  eax, 4
test eax, eax     ; ما قيمة ZF؟


mov  eax, 5
mov  ebx, 5
cmp  eax, ebx     ; ما قيمة ZF؟

القائمة 5.1: تعليمتا المقارنة CMP وTEST تقيّمان شروط التفريع

توضح القائمة 5.1 كيف تؤثر تعليمات المقارنة في علم الصفر:

  • التسلسل الأول يحمّل 4 في EAX ثم يختبرها ضد نفسها. تحسب تعليمة TEST الناتج 4 AND 4 = 4. وبما أن النتيجة غير صفرية، فإن علم الصفر مصفَّر (0). هذا النمط TEST REG, REG لا ينتج صفرًا إلا إذا كان السجل نفسه صفرًا؛ وهو نمط تجميع شائع لفحص ما إذا كان السجل يحمل قيمة NULL.
  • التسلسل الثاني يحمّل 5 في EAX و EBX ثم يقارنهما. تحسب تعليمة CMP الناتج 5 - 5 = 0. وبما أن النتيجة صفر، فإن علم الصفر مضبوط (1).

لاحظ أن EAX و EBX يبقيان دون تغيير بعد المقارنات.


3. القفزات المشروطة الشائعة (Common Conditional Jumps)

<≤=≠≥>
موقّعة (Signed)JL (Jump if Less Than)JLE (Jump if Less than or Equal)JZ ، JE (Jump if Zero / Jump if Equal)JNZ ، JNE (Jump if Not Zero / Jump if Not Equal)JGE (Jump if Greater Than or Equal)JG (Jump if Greater Than)
غير موقّعة (Unsigned)JB (Jump if Below)JBE (Jump if Below or Equal)——JAE (Jump if Above or Equal)JA (Jump if Above)

الجدول 5.1: تصنيف تعليمات القفز المشروط الشائعة

تُنشئ تعليمات القفز المشروط تفريعات في تنفيذ الشيفرة بنقل التحكم إلى موقع ما إذا تحققت الشروط المحددة. ويُحدَّد شرط القفز بحالة أعلام الحالة في سجل EFLAGS. وبينما تدعم مجموعة تعليمات x86 العديد من الصيغ، فإن تعليمات القفز المشروط في الجدول 5.1 تغطي الغالبية العظمى مما يصادفه المرء في البرامج.

لترجمة قفزة مشروطة إلى منطق عالي المستوى، وسّع اختصارها (Mnemonic) إلى عبارة. فمثلًا، التعليمة JL تتوسع إلى “Jump if Less than” (اقفز إذا كان أقل من). إضافة إلى ذلك، لاحظ ما يلي:

  • اختصارات المساواة JZ (اقفز إذا كان صفرًا) و JE (اقفز إذا كان مساويًا) هما تمثيلان بديلان لنفس التعليمة. وينطبق الأمر نفسه على JNZ (اقفز إذا لم يكن صفرًا) و JNE (اقفز إذا لم يكن مساويًا). وفاكك التجميع هو من يختار أي اختصار يعرض.
  • قفزات عدم المساواة مصنفة إلى موقّعة و غير موقّعة. ونوع تعليمة القفز المستخدمة قد يوفر أحيانًا دليلًا على نوع بيانات متغير ما في البرنامج.

4. فهم التفريع المشروط بالطريقة السهلة

استخدم الطريقة التالية لفك شفرة التفريعات المشروطة دون القلق بشأن أعلام الحالة. عند مصادفة تعليمة CMP يليها قفزة مشروطة:

  1. ترجم شرط القفزة إلى المعامل الحسابي المقابل له. مثلًا، JG (اقفز إذا كان أكبر من) تعني >.
  2. ضع المعامل بين المعاملين لتكوين عبارة شرطية.
  3. إذا كانت تلك العبارة الشرطية صحيحة، خذ القفزة.

الشكل 5.2: تقييم تفريع مشروط باستخدام طريقة الاختصار

الشكل 5.2: تقييم تفريع مشروط باستخدام طريقة الاختصار

بتطبيق هذه الخطوات على المثال في الشكل 5.2:

  1. نترجم تعليمة JLE (اقفز إذا كان أقل من أو يساوي) إلى المعامل ≤.
  2. نضع المعامل بين المعاملين: “اقفز إذا كان EAX ≤ 50”.
  3. اقفز إلى الموقع الهدف إذا كان EAX ≤ 50؛ وإلا فمرّ إلى التعليمة التالية.

اختبار سريع: jump café

لكل تسلسل من تسلسلات التعليمات التالية، قيّم هل تُؤخذ القفزة (Taken) أم لا (Not Taken)؟

التسلسل 1:

xor  eax, eax
test eax, eax
jz   someplace

التسلسل 2:

mov eax, 2
lea ebx, [eax+1]
cmp eax, ebx
jg  someplace

التسلسل 3:

mov ax, 0xCAFE
cmp ax, 0xDEAD
jmp someplace

التسلسل 4:

mov eax, 0xCAFE
mov [esp], eax
cmp [esp], eax
jnz someplace
الحل (اضغط للعرض)
  • التسلسل 1 — تُؤخذ: يجعل xor eax, eax قيمة EAX = 0، ثم test eax, eax تنتج 0 AND 0 = 0 فيُضبط ZF = 1، لذلك تُؤخذ jz.
  • التسلسل 2 — لا تُؤخذ: ebx = 3، والمقارنة 2 - 3 تعطي نتيجة سالبة، فـ EAX ليس أكبر من EBX ولا يُضبط علم الصفر، لذلك لا تُؤخذ jg.
  • التسلسل 3 — تُؤخذ: jmp قفزة غير مشروطة؛ تُؤخذ دائمًا بغض النظر عن نتيجة المقارنة.
  • التسلسل 4 — لا تُؤخذ: القيمة في [esp] تساوي EAX، فالمقارنة تعطي صفرًا ويُضبط ZF = 1، لذلك لا تُؤخذ jnz (اقفز إذا لم يكن صفرًا).

5. عبارات If (If Statements)

CAssembly
int a = 0;
int b = 1;
if(a == b) {
  printf("a equals b\n");
} else {
  printf("a not equal to b\n");
}
mov     [ebp+var_4], 0
mov     [ebp+var_8], 1
mov     eax, [ebp+var_4]
cmp     eax, [ebp+var_8]
jnz     short else
push    offset aAEqualsB
call    printf
add     esp, 4
jmp     short merge


else:
push    offset aANotEqualToB
call    printf

القائمة 5.2: عبارة if-else في لغة C وتجميعها المُصرَّف

توضح القائمة 5.2 كيف تُنفَّذ العبارة الشرطية في التجميع. على اليسار مقتطف من شيفرة C يحتوي على عبارة if-else تقارن متغيرين محليين، a و b. وفي التجميع على اليمين:

  • تُنفَّذ عبارة if-else كتعليمة CMP يليها JNZ (اقفز إذا لم يكن صفرًا/مساويًا).
  • تقارن تعليمة CMP المتغيرين المحليين a (‏var_4) و b (‏var_8).
  • وبينما تستخدم شيفرة C معامل المساواة (if (a == b))، تستخدم التجميع JNZ لفحص الشرط المعاكس: “إذا كان a لا يساوي b، اقفز إلى كتلة else”. وإذا تساوى المعاملان، لا تُؤخذ القفزة وينفّذ البرنامج جملة if، مطبعًا “a equals b”.
  • لاحظ قفزة JMP غير المشروطة إلى merge في نهاية كتلة if. فبعد فرع if، تتخطى القفزة غير المشروطة كتلة else لتكملة بقية البرنامج.

اختبار سريع: chargin’ my lasers

اختر شيفرة C التي تطابق على أفضل وجه التفكيك التالي.

mov  eax, [ebp+var_4]
cmp  eax, [ebp+var_8]
jz   short loc_401028
call fireLaserBeams
jmp  short loc_40102D
loc_401028:
call chargeLaserBeams
loc_40102D:

الخيار A:

if (var_8 == eax)
  chargeLaserBeams()
else
  fireLaserBeams()

الخيار B:

if (var_4 == 0)
  chargeLaserBeams()
else
  fireLaserBeams()

الخيار C:

if (var_4 != var_8)
  fireLaserBeams()
else
  chargeLaserBeams()

الخيار D:

if (var_8 == var_4)
  fireLaserBeams()
else
  chargeLaserBeams()
الحل (اضغط للعرض)

الإجابة الصحيحة: الخيار C.

تقارن cmp eax, [ebp+var_8] بين var_4 و var_8. إذا تساويَا يُضبط ZF وتُؤخذ jz إلى loc_401028 التي تستدعي chargeLaserBeams(). أما إذا اختلفا فلا تُؤخذ القفزة ويُستدعى fireLaserBeams(). أي: إذا كان var_4 != var_8 نفّذ fireLaserBeams()، وإلا نفّذ chargeLaserBeams() — وهو تمامًا الخيار C.


6. تمارين اختراق

تمرين اختراق: iffy_sleep

اكتب ونفّذ تسلسل تعليمات من أجل:

  • السكون لمدة ثانية واحدة إذا كان سجل EAX يساوي 0، وإلا فالسكون لمدة ثانيتين.
  • اختياريًا: اقرأ قيمة عددية من لوحة المفاتيح باستخدام scanf() بدلًا من استخدام EAX، باستخدام سلسلة التنسيق %d.
الحل (اضغط للعرض)
test eax, eax
jz   sleep_short
push 2000              ; ثانيتان
call dword ptr [_Sleep]
jmp  done
sleep_short:
push 1000              ; ثانية واحدة
call dword ptr [_Sleep]
done:

تمرين اختراق: loopy_printer

اكتب ونفّذ تسلسل تعليمات من أجل:

  • طباعة متسلسلة الأعداد من 0 إلى 9 على الشاشة.
  • استخدم حلقة مع الدالة printf() لطباعة عدد واحد (باستخدام سلسلة التنسيق %d) في كل دورة من الحلقة.
  • استخدم متغيرًا عامًا أو محليًا كعدّاد للحلقة — لا تستخدم سجلًا.
الحل (اضغط للعرض)
; استخدم موقع ذاكرة كعدّاد (مثل [esp] أو موقع محجوز)
mov dword ptr [esp-10h], 0     ; العداد = 0
loop_start:
mov eax, [esp-10h]
cmp eax, 9
jg  loop_end
push eax
push offset fmt_d              ; "%d"
call dword ptr [_printf]
add esp, 8
inc dword ptr [esp-10h]
jmp loop_start
loop_end:

تمرين اختراق: little_caesar

ابدأ بالملف little_caesar.i64. يحتوي البرنامج على شيفرة تقوم بما يلي:

  • قراءة نص من لوحة المفاتيح.
  • استدعاء دالة غير منفَّذة بعد عند العنوان 401100h لتعمية السلسلة النصية.
  • طباعة السلسلة المعمَّاة على الشاشة.

اكتب الدالة عند العنوان 401100h بحيث:

  • تأخذ وسيطًا واحدًا — السلسلة النصية المراد تعميتها.
  • تستخدم حلقة لتعمية سلسلة الإدخال عن طريق زيادة كل حرف بمقدار واحد. أوقف الحلقة عند مصادفة بايت NULL (‏0x00).
  • تحتوي على مقدمة وخاتمة للدالة وفق اصطلاح الاستدعاء __cdecl.
الحل (اضغط للعرض)
org 401100h
push ebp
mov  ebp, esp
mov  eax, [ebp+8]        ; عنوان السلسلة
loop_obf:
mov  cl, [eax]
test cl, cl
jz   done                ; توقف عند NULL
inc  cl                  ; زد الحرف بمقدار واحد
mov  [eax], cl
inc  eax
jmp  loop_obf
done:
mov  esp, ebp
pop  ebp
ret                      ; cdecl: التنظيف على عاتق المستدعي

7. التحليل الساكن مع IDA (Static Analysis with IDA)

اقتربنا من مواجهة أول معمل تحليل عملي لدينا. لكن أولًا، دعنا نغطي بعض أساسيات IDA الإضافية. في هذا العرض التوضيحي، تابع معنا باستخدام العينة apple.exe:

  • اسم الملف: apple.exe
  • MD5: 30e92463ee572d8dbfa95ff3285bfa82

للبدء، عليك تحميل الملف التنفيذي إلى IDA. سيؤدي ذلك إلى إظهار نافذة حوار “Load a new file” كما في الشكل 5.3. ولأن IDA تكشف تنسيق الملف وبنية المعالج تلقائيًا، فإن إعدادات التحميل الافتراضية تكون عادةً مناسبة تمامًا. في معظم سيناريوهات التحليل القياسية، يمكنك ترك الإعدادات الافتراضية كما هي والنقر على OK.

الشكل 5.3: تحميل ملف PE تنفيذي جديد للتحليل باستخدام IDA

الشكل 5.3: تحميل ملف PE تنفيذي جديد للتحليل باستخدام IDA

عند تحميل ملف تنفيذي، تُجري IDA تحليلًا تلقائيًا أوليًا يحلل الشيفرة ويضع تسميات للدوال ويرسم المراجع المتقاطعة. وهذا عادةً ما يكون سريعًا، لكنه قد يستغرق بضع دقائق للملفات التنفيذية الكبيرة. بعد انتهاء التحميل والتحليل التلقائي، تنقلك IDA إلى تخطيط التحليل الساكن الافتراضي كما في الشكل 5.4.

الشكل 5.4: تخطيط التحليل الساكن الافتراضي في IDA

الشكل 5.4: تخطيط التحليل الساكن الافتراضي في IDA

ينقسم تخطيط التحليل الساكن الافتراضي في IDA إلى المناطق الرئيسية التالية:

  • المخرجات (Output): تعرض رسائل الأخطاء والحالة والمعالجة.
    • تشير IDA إلى اكتمال التحليل التلقائي بطباعة “The initial autoanalysis has been finished” في هذه النافذة.
    • هذه النافذة هي أيضًا المكان الذي يمكنك فيه تشغيل أوامر IDAPython أو IDC تفاعليًا.
    • ولأنها لا تُحتاج فعليًا أثناء التحليل الساكن، يُنصح بإغلاق هذه النافذة لتوفير مساحة الشاشة. يمكنك إعادتها عبر Windows ➔ Output window.
  • فك التجميع (Disassembly): بعد اكتمال التحليل التلقائي، تعرض نافذة IDA View نقطة دخول الملف الثنائي. تكون النافذة افتراضيًا في وضع المخطط (Graph Mode)، ويمكنك الضغط على مفتاح المسافة للتبديل إلى وضع النص الخطي.
  • نظرة عامة على المخطط (Graph Overview): تعرض خريطة مصغرة لمخطط الدالة الحالية. وتتتبع المنطقة المميزة موقع عرضك الحالي في نافذة التفكيك، مما يجعلها مفيدة للتنقل في مخططات الدوال الكبيرة والمعقدة.
  • الدوال (Functions): تعرض قائمة بجميع الدوال التي تعرفتها IDA في الملف الثنائي. يؤدي النقر المزدوج على أي دالة في القائمة إلى نقل IDA View إلى عنوانها. ولكل دالة، توفر النافذة التفاصيل التالية:
    • Name: اسم الدالة.
    • Start: عنوان الذاكرة الابتدائي للدالة.
    • Length: حجم الدالة بالبايتات.
    • Locals: مقدار مساحة المكدس (بالبايتات) المخصصة للمتغيرات المحلية.
    • Arguments: مقدار مساحة المكدس المستخدمة لوسائط الدالة.
  • شريط التنقل (Navigation Band): شريط أفقي في أعلى مساحة العمل يوفر نظرة بصرية شاملة للملف الثنائي الذي تم تحليله بالكامل.
    • مساحة العناوين بأكملها مُرمَّزة بالألوان لتمثيل أنواع مختلفة من البيانات.
    • سهم أصفر صغير على الشريط يشير إلى موضع مؤشرك الحالي داخل الملف الثنائي.
    • يؤدي النقر في أي مكان على الشريط إلى نقل IDA View إلى ذلك الموقع.
    • يمكنك التكبير والتصغير (Ctrl + تمرير الفأرة) للحصول على عرض أكثر تفصيلاً لمناطق محددة.

بالإضافة إلى IDA View، تُنشئ IDA افتراضيًا علامات التبويب الفرعية المفيدة التالية:

  • الاستيرادات (Imports): تسرد الدوال التي يستوردها الملف الثنائي الذي يتم تحليله من مكتبات الربط الديناميكي الخارجية (DLLs). يمكنك فتح هذه النافذة عبر View ➔ Open subviews ➔ Imports.
    • تحديد الاستيرادات المثيرة للاهتمام (مثل وظائف معالجة الملفات أو الشبكات) واستخدام المراجع المتقاطعة لتتبع كيفية استخدام الملف الثنائي لها هو أحد أسرع الطرق لفهم سلوك البرنامج.

الشكل 5.5: التبويب الفرعي Imports يسرد استيرادات الملف الثنائي

الشكل 5.5: التبويب الفرعي Imports يسرد استيرادات الملف الثنائي

  • على سبيل المثال، ابحث عن printf في التبويب الفرعي Imports وانقر عليه نقرًا مزدوجًا. سينقلك هذا إلى مدخل الاستيراد في جدول عناوين الاستيراد (IAT) الخاص بالملف الثنائي، والذي يملؤه محمّل ويندوز بعنوان وظيفة الاستيراد وقت التشغيل. من هناك، حدد اسم الوظيفة وافتح نافذة المراجع المتقاطعة (الاختصار X) لرؤية جميع المواقع التي يستدعيها البرنامج فيها، كما في الشكل 5.6.

الشكل 5.6: استخدام المراجع المتقاطعة لتحديد مواضع استدعاء printf في الملف الثنائي

الشكل 5.6: استخدام المراجع المتقاطعة لتحديد مواضع استدعاء printf في الملف الثنائي

  • التصديرات (Exports): تسرد الدوال التي يجعلها الملف الثنائي متاحة للبرامج الأخرى. يمكنك فتح هذه النافذة عبر View ➔ Open subviews ➔ Exports.
    • بينما تصدّر مكتبات DLL عادةً وظائف متعددة، فمن الشائع أن تقلل المكتبات الخبيثة من التصديرات أو تُغني عنها.
    • لاحظ أن الملفات التنفيذية القياسية (.exe) عادةً ما يكون لها تصدير واحد فقط: نقطة دخول الملف التنفيذي، والتي تسميها IDA باسم start.
  • الأنواع المحلية (Local Types): تعرض تعريفات الأنواع. يمكنك تعريف بنيات بياناتك الخاصة أو استيراد أنواع قياسية من مكتبات أنواع IDA. يمكن فتح هذه النافذة من View ➔ Open subviews ➔ Local Types.
  • السلاسل النصية (Strings): تسرد السلاسل النصية المستخرجة من مناطق البيانات في الملف الثنائي. يمكنك فتح هذه النافذة عبر View ➔ Open subviews ➔ Strings.
    • استهدافُ السلاسل المثيرة للاهتمام (مثل رسائل الخطأ أو مسارات الملفات أو عناوين IP) ثم استخدام المراجع المتقاطعة يمكن أن يكونا استراتيجية عالية الكفاءة لتحديد موقع الروتينات الخبيثة الرئيسية في الملف الثنائي بسرعة.

الشكل 5.7: التبويب الفرعي Strings يسرد السلاسل النصية من مناطق بيانات الملف الثنائي

الشكل 5.7: التبويب الفرعي Strings يسرد السلاسل النصية من مناطق بيانات الملف الثنائي

في جوهره، التحليل الساكن هو نقل مستمر لفهمنا للملف الثنائي إلى قاعدة بيانات IDA. فمن خلال توثيق تحليلك باستمرار وبشكل تكراري، تبني السياق الذي يتيح لك استنتاج سلوك البرنامج على مستوى أعلى تدريجيًا. ويتحقق ذلك أساسًا من خلال إعادة التسمية و التعليقات:

  • إعادة التسمية (Renaming): يمكنك إعادة تسمية المتغيرات والدوال ومواقع الذاكرة بالنقر بزر الفأرة الأيمن على تسميتها واختيار Rename (الاختصار N).
  • التعليقات العادية (Regular Comments): يمكنك كتابة تعليق قياسي في موقع واحد بالنقر بزر الفأرة الأيمن على موقع واختيار Enter comment (الاختصار :).
  • التعليقات القابلة للتكرار (Repeatable Comments): يمكنك كتابة تعليق قابل للتكرار بالنقر بزر الفأرة الأيمن على موقع واختيار Enter repeatable comment (الاختصار ;). يظهر التعليق القابل للتكرار كلما أُشير إلى ذلك الموقع في مكان آخر من الشيفرة.
    • على سبيل المثال، إضافة تعليق قابل للتكرار إلى عنوان ذاكرة سلسلة نصية سيجعل ذلك التعليق مرئيًا عند كل تعليمة تشير إلى تلك السلسلة.
  • تعليقات الدوال القابلة للتكرار: يمكنك تطبيق تعليق قابل للتكرار على دالة كاملة بوضعه عند تعريف ترويسة الدالة أو تعليمتها الأولى. سيظهر هذا التعليق بعد ذلك عند كل استدعاء CALL يُجرى لتلك الدالة.

الشكل 5.8: دالة نقطة الدخول لـ apple.exe مع متغير محلي معاد تسميته وتعليق عادي وتعليق دالة قابل للتكرار من printf

الشكل 5.8: دالة نقطة الدخول لـ apple.exe مع متغير محلي معاد تسميته وتعليق عادي وتعليق دالة قابل للتكرار من printf

إليك بعض النصائح الإضافية التي يجب تذكرها أثناء العمل على المعاملات:

  • لا تتردد في استخدام أسماء طويلة ووصفية. فكلما زادت السياق الذي تنقله إلى ملف IDB، قلّ ما يتعين عليك تذكربه أثناء محاولة فهم البرنامج على مستوى أعلى.
  • إذا شعرت بالتعثر، حاول إجراء تغيير تدريجي واحد: أعد تسمية متغير واحد غير معروف، أو أضف تعليقًا إلى تعليمة واحدة.

8. معمل — apple.exe (Lab - apple.exe)

معلومات العينة

  • اسم الملف: apple.exe
  • MD5: 30e92463ee572d8dbfa95ff3285bfa82

أهداف المعمل

هذا معمل تمهيدي للتدرب على استخدام IDA لتحليل تجميع 32-بت.

ابدأ بالتفاعل مع apple.exe من سطر الأوامر. هدف المعمل هو تحليل apple.exe وشرح كيفية عمل البرنامج.

الأسئلة

  1. ما القيمة المدفوعة عند العنوان 0x401099 كوسيط للدالة sub_401000؟
  2. ادخل إلى الدالة sub_401000. ما الذي تقابله الثوابت 0x61 و 0x62 و 0x63؟
  3. أي بنية برمجية تُعرِّف الدالة sub_401000؟
  4. لخّص كيف يعمل البرنامج.

ملاحظة: الحل التفصيلي لهذا المعمل في درس حلول معملَي apple وbomb.


9. معمل — bomb.exe (Lab - bomb.exe)

معلومات العينة

  • اسم الملف: bomb.exe
  • MD5: ec2e81d6623299d881a2910c2827a14d

أهداف المعمل

هذا معمل تمهيدي للتدرب على استخدام IDA لتحليل تجميع 32-بت، مع التركيز على تحليل القفزات المشروطة.

ابدأ بالتفاعل مع bomb.exe من سطر الأوامر. هدف المعمل هو تحليل bomb.exe ومعرفة المزيج الصحيح من الأرقام الذي يبطل مفعول القنبلة.

الأسئلة

  1. ما الوسيطان لاستدعاء الدالة عند العنوان 0x4010A8؟
  2. ما القيمة التي يجب أن ترجعها الدالة sub_401000 حتى يطبع البرنامج “You are safe!"؟
  3. حلّل الدالة sub_401000. في أي الظروف ترجع الدالة قيمة غير صفرية؟
  4. اكتب الشيفرة الوهمية (Pseudocode) للدالة sub_401000.

ملاحظة: الحل التفصيلي لهذا المعمل في درس حلول معملَي apple وbomb.


خلاصة المقال

المفهومالنقاط الرئيسية
التفريع المشروطيُبنى من تعليمات مقارنة + قفزات مشروطة؛ لا توجد if-else في التجميع
CMPتُجري طرحًا منطقيًا وتضبط الأعلام دون تعديل المعاملات
TESTتُجري AND بتية؛ نمط TEST REG, REG لفحص NULL
علم الصفر ZF1 = النتيجة صفر، 0 = النتيجة غير صفرية
القفزات الموقّعةJL/JLE/JG/JGE
القفزات غير الموقّعةJB/JBE/JA/JAE
المساواةJZ=JE و JNZ=JNE (تمثيلان لنفس التعليمة)
الطريقة السهلةوسّع الاختصار إلى معامل، ضعه بين المعاملين، وإذا صحّت العبارة فخذ القفزة
نمط if-elseCMP + قفزة معاكسة إلى else + JMP غير مشروط للدمج
التحليل الساكننقل الفهم باستمرار إلى IDB عبر إعادة التسمية (N) والتعليقات (: و ;)
نقاط انطلاق سريعةالاستيرادات والسلاسل النصية + المراجع المتقاطعة (X)

المصدر الأصلي: Malware Analysis Crash Course — FLARE Learning Hub