بسم الله الرحمن الرحيم
في هذا المقال سنتكلم عن القفز المشروط وتعليمات المقارنة.
1. التفريع المشروط (Conditional Branching)

الشكل 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 يليها قفزة مشروطة:
- ترجم شرط القفزة إلى المعامل الحسابي المقابل له. مثلًا،
JG(اقفز إذا كان أكبر من) تعني>. - ضع المعامل بين المعاملين لتكوين عبارة شرطية.
- إذا كانت تلك العبارة الشرطية صحيحة، خذ القفزة.

الشكل 5.2: تقييم تفريع مشروط باستخدام طريقة الاختصار
بتطبيق هذه الخطوات على المثال في الشكل 5.2:
- نترجم تعليمة
JLE(اقفز إذا كان أقل من أو يساوي) إلى المعامل≤. - نضع المعامل بين المعاملين: “اقفز إذا كان
EAX ≤ 50”. - اقفز إلى الموقع الهدف إذا كان
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)
| C | Assembly |
|---|---|
| |
القائمة 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
عند تحميل ملف تنفيذي، تُجري IDA تحليلًا تلقائيًا أوليًا يحلل الشيفرة ويضع تسميات للدوال ويرسم المراجع المتقاطعة. وهذا عادةً ما يكون سريعًا، لكنه قد يستغرق بضع دقائق للملفات التنفيذية الكبيرة. بعد انتهاء التحميل والتحليل التلقائي، تنقلك IDA إلى تخطيط التحليل الساكن الافتراضي كما في الشكل 5.4.

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

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

الشكل 5.8: دالة نقطة الدخول لـ apple.exe مع متغير محلي معاد تسميته وتعليق عادي وتعليق دالة قابل للتكرار من printf
إليك بعض النصائح الإضافية التي يجب تذكرها أثناء العمل على المعاملات:
- لا تتردد في استخدام أسماء طويلة ووصفية. فكلما زادت السياق الذي تنقله إلى ملف IDB، قلّ ما يتعين عليك تذكربه أثناء محاولة فهم البرنامج على مستوى أعلى.
- إذا شعرت بالتعثر، حاول إجراء تغيير تدريجي واحد: أعد تسمية متغير واحد غير معروف، أو أضف تعليقًا إلى تعليمة واحدة.
8. معمل — apple.exe (Lab - apple.exe)
معلومات العينة
- اسم الملف: apple.exe
- MD5:
30e92463ee572d8dbfa95ff3285bfa82
أهداف المعمل
هذا معمل تمهيدي للتدرب على استخدام IDA لتحليل تجميع 32-بت.
ابدأ بالتفاعل مع apple.exe من سطر الأوامر. هدف المعمل هو تحليل apple.exe وشرح كيفية عمل البرنامج.
الأسئلة
- ما القيمة المدفوعة عند العنوان
0x401099كوسيط للدالةsub_401000؟ - ادخل إلى الدالة
sub_401000. ما الذي تقابله الثوابت0x61و0x62و0x63؟ - أي بنية برمجية تُعرِّف الدالة
sub_401000؟ - لخّص كيف يعمل البرنامج.
ملاحظة: الحل التفصيلي لهذا المعمل في درس حلول معملَي apple وbomb.
9. معمل — bomb.exe (Lab - bomb.exe)
معلومات العينة
- اسم الملف: bomb.exe
- MD5:
ec2e81d6623299d881a2910c2827a14d
أهداف المعمل
هذا معمل تمهيدي للتدرب على استخدام IDA لتحليل تجميع 32-بت، مع التركيز على تحليل القفزات المشروطة.
ابدأ بالتفاعل مع bomb.exe من سطر الأوامر. هدف المعمل هو تحليل bomb.exe ومعرفة المزيج الصحيح من الأرقام الذي يبطل مفعول القنبلة.
الأسئلة
- ما الوسيطان لاستدعاء الدالة عند العنوان
0x4010A8؟ - ما القيمة التي يجب أن ترجعها الدالة
sub_401000حتى يطبع البرنامج “You are safe!"؟ - حلّل الدالة
sub_401000. في أي الظروف ترجع الدالة قيمة غير صفرية؟ - اكتب الشيفرة الوهمية (Pseudocode) للدالة
sub_401000.
ملاحظة: الحل التفصيلي لهذا المعمل في درس حلول معملَي apple وbomb.
خلاصة المقال
| المفهوم | النقاط الرئيسية |
|---|---|
| التفريع المشروط | يُبنى من تعليمات مقارنة + قفزات مشروطة؛ لا توجد if-else في التجميع |
CMP | تُجري طرحًا منطقيًا وتضبط الأعلام دون تعديل المعاملات |
TEST | تُجري AND بتية؛ نمط TEST REG, REG لفحص NULL |
علم الصفر ZF | 1 = النتيجة صفر، 0 = النتيجة غير صفرية |
| القفزات الموقّعة | JL/JLE/JG/JGE |
| القفزات غير الموقّعة | JB/JBE/JA/JAE |
| المساواة | JZ=JE و JNZ=JNE (تمثيلان لنفس التعليمة) |
| الطريقة السهلة | وسّع الاختصار إلى معامل، ضعه بين المعاملين، وإذا صحّت العبارة فخذ القفزة |
| نمط if-else | CMP + قفزة معاكسة إلى else + JMP غير مشروط للدمج |
| التحليل الساكن | نقل الفهم باستمرار إلى IDB عبر إعادة التسمية (N) والتعليقات (: و ;) |
| نقاط انطلاق سريعة | الاستيرادات والسلاسل النصية + المراجع المتقاطعة (X) |
المصدر الأصلي: Malware Analysis Crash Course — FLARE Learning Hub