Structured Exception Handler (SEH) Part 3
السلام عليكم ورحمة الله وبركاته
في المقالات السابقة ناقشنا الـ SEH
من جوانب نظرية بتفصيل
في هذه المقالة سنرى الـ SEH
من الجانب العملي ، سنعتمد بشكل أساسي على الـ windbg
بسم الله لنبدأ
نظرة على الـ Structures
ذكرنا في المقالات السابقة Structures
عدة ، مثل الـ TEB
والـ TIB
والـ _EXCEPTION_REGISTRATION_RECORD
سنرى الآن كيف بإمكاننا النظر بتفصيل للتعريف ( Definition ) الخاص بكل Structures
عبر الـ windbg
سنستخدم الـ dt
Command
مثل المذكور في المرجع الخاص بالـ Command ، الـ dt
تتيح لنا الاستعلام عن المتغيرات أو الـ Data Types
والـ Structures
وغيرها
The dt command displays information about a local variable, global variable or data type. This can display information about simple data types, as well as structures and unions.
سنستخدم الـ Command التالية لإستعراض الـ TEB Structure
dt nt!_TEB
نلاحظ في الـ Command الـ TEB
مسبوقة بالـ nt
وهو اسم الـ Module
المعرّف فيه هذا الـ Structure
مثل ما ناقشنا في المقالات السابقة، الـ TIB
هو أول العناصر في الـ TEB
لنلقي نظرة الآن على الـ TIB Structure
، بإمكاننا الاستعلام عن هذا الـ Structure
باستخدام الـ Command الآتية :
dt _NT_TIB
نرى في الصورة أعلاه أن الـ ExceptionList
هي أول العناصر في الـ TIB
وهي عبارة عن Pointer
مثل ما ناقشنا في المقالات السابقة
لنستعرض الآن الـ _EXCEPTION_REGISTRATION_RECORD
ونرى كيف يبدو ، بإمكاننا استخدام الـ Command الآتية للإستعلام عن الـ _EXCEPTION_REGISTRATION_RECORD
dt _EXCEPTION_REGISTRATION_RECORD
مثل ما ذكرنا سابقًا ، الـ ExceptionList
أو الـ _EXCEPTION_REGISTRATION_RECORD
مكوّنة من عنصرين
هما الـ Next
والـ Handler
، الأول عبارة عن Pointer
يُشير للعنصر التالي ، والثاني عبارة عن Pointer
كذلك لكنه يُشير للدالة المسؤولة عن التعامل مع الـ Exception
للمراجعة ، الصورة التالية تمثّل ما رأيناه بعد استعراض الـ _EXCEPTION_REGISTRATION_RECORD Structure
تتبُّع الـ SEH Chain
سنرى الآن كيف بإمكاننا عمل trace
للـ SEH Chain
كما ذكرنا سابقًا، نستطيع الوصول الى الـ Exception List
عن طريق الـ TEB
، فأول خطوة سنقوم بها هي الاستعلام عن محتوى الـ TEB
( في الجزء الأول استعلمنا عن بُنيته ، الآن نستعلم عن محتواه )
وسنقوم تحديدًا بمعرفة العنوان ( address ) الخاص بالـ Exception List
، نستطيع الاستعلام عن الـ TEB
باستخدام الـ Command الآتية :
!teb
نلاحظ أن الـ Exception List
موجودة في العنوان : 01aeff70
الآن، باستخدام هذا العنوان بإمكاننا الوصول لأول عنصر في الـ Exception List
ومن العنصر الأول سنستطيع الوصول للعنصر الثاني ( لأن الـ _EXCEPTION_REGISTRATION_RECORD
كما ذكرنا من قبل مكوّن من عنصرين، أحدهما الـ Next
، والذي يُشير للعنصر التالي في الـ List
)
ومن العنصر الثاني سنستطيع الوصول للعنصر الثالث، وهكذا حتى نصل لآخر عنصر في الـ Exception List
بعد معرفة عنوان الـ Exception List
بإمكاننا الاستعلام عن أول العناصر باستخدام الـ Command التالية :
dt _EXCEPTION_REGISTRATION_RECORD 01aeff70
نلاحظ أن العنصر التالي من الـ List
موجود في العنوان 0x01aeffcc
وبإمكاننا الوصول للعنصر الثاني من الـ List
باستخدام نفس الـ Command السابقة، مع تغيير العنوان للعنصر الذي نود الإستعلام عنه ، وفي حالتنا ستكون الـ Command كالآتي :
dt _EXCEPTION_REGISTRATION_RECORD 0x01aeffcc
نرى من الصورة السابقة أن العنوان الخاص بالعنصر الثالث هو : 0x01aeffe4
ونستطيع الاستعلام عنه كالآتي :
dt _EXCEPTION_REGISTRATION_RECORD 0x01aeffe4
نلاحظ من الصورة أعلاه، أننا وصلنا الى آخر الـ SEH Chain
، لأن الـ Next
يُشير الى العنوان 0xffffffff
ومثل ما عرفنا في المقالات السابقة، آخر عنصر في الـ SEH Chain
عبارة عن الدالة الخاصة بالنظام، والتي سيتم تنفيذها في حال لم يجد نظام التشغيل دالة تقوم بمعالجة الـ Exception
والى هنا نكتفي،
بتوفيق الله انتهت سلسلة مقالات الـ SEH
، أو ربما نُكمل -إن شاء الله- في مقالات لاحقة في حال وجدنا ما يستحق الذكر
ℹ️ [ملاحظة] هذه المقالة تمّت كتابتها خلال دراسة هذه المواضيع، فكل ما تم ذكره هنا قد يحتمل الخطأ، لكن بالإمكان العودة إلى المراجع التي إستندت عليها هذه المقالة