Structured Exception Handler (SEH) Part 1
السلام عليكم ورحمة الله وبركاته
في هذه المقالة باذن الله راح نناقش الـ Windows Structured Exception Handling (SEH)
المقالة تلخيص لقراءات متفرقة من عدّة مصادر، كتب ومقالات، بالنسبة للكتب فهذه هي القائمة :
- Buffer. Overflow. Attacks. DETECT, EXPLOIT, PREVENT
- Chapter 8 : Windows Buffer Overflows
- Windows System Programming
- Chapter 4 : Exception Handling
- Practical Malware Analysis
- Chapter 15 : Anti-Disassembly
بسم الله ، لنبدأ
ما المقصود بالـ Exception
و الـ Exception Handlers
؟
قبل أن نخوض في الـ SEH
لنعرف أولًا ماذا نقصد بالـ Exception
و الـ Exception Handlers
بالنسبة للـ Exception
، في كتاب Buffer. Overflow. Attacks نجد التعريف التالي :
an exception is a condition that occurs outside the normal flow of a program
إذا فالـ Exception
أو الاستثناء بالمعنى الحرفي، هي حالة معينة تحصل وقت تنفيذ البرنامج، وهذه الحالة خارج سِياق عمل البرنامج الطبيعي، وفي أغلب الأحوال يُشار للـ Exception
بالأخطاء التي تحصل وقت تنفيذ البرنامج
أحد الأمثلة لحالات الأخطاء الممكن حدوثها وقت تنفيذ البرنامج هي استعمال pointer
ويكون هذا الـ pointer
يُشير إلى قيمة NULL
أو مثلًا القسمة على صفر ، مثل المثال في الكود الآتي :
- Buffer. Overflow. Attacks - page : 350
بالنسبة للـ Exception Handlers
، فهو الجزء من البرنامج المسؤول عن التعامل مع الحالة الخاصة أو الأخطاء الوارد حدوثها ( الـ Exception
)
كتاب Windows System Programming يذكر لنا تفاصيل جميلة توضّح الغاية من وجود الـ Exception Handlers
Without some form of exception handling, an unintended program exception, such as dereferencing a pointer or division by zero, will terminate a program immediately without performing normal termination processing, such as deleting temporary files. SEH allows specification of a code block, or exception handler, which can delete the temporary files, perform other termination operations, and analyze and log the exception. In general, exception handlers can perform any required cleanup operations before leaving the code block.
إذًا وجود الـ Exception Handlers
في البرنامج يمكّننا من إجراء عمليات إضافية في حال حدوث أي أخطاء ( Exceptions
) ، على سبيل المثال لا الحصر : في حال حدوث أي Exception
خلال سير عمل البرنامج، يقوم البرنامج بحذف الملفات المؤقتة التي تم إنشاءها على النظام ( cleanup operations
) ، أو حتى قد يقوم البرنامج بكتابة تفاصيل هذا الخطأ في السجلات الخاصة بالبرنامج ( logs files
) ليعود لها المبرمج لاحقًا
إذًا فالـ Exception Handlers
بكل بساطة هو جزء من البرنامج مسؤول عن العمليات اللازم إجراءها في حال حدوث أي Exception
ماهو الـ Windows Structured Exception Handling (SEH)
بعد المقدمة السابقة، نستطيع الآن الحديث عن الـ SEH
هذه المقالة قديمة جدًا لكنها تشعّبت في شرح الـ SEH
، سنأخذ بعض التفاصيل العامة منها
في البداية، نجد المعلومة الآتية
Win32 structured exception handling is an operating system-provided service.
تخبرنا المقالة أن الـ SEH
هو جزء من نظام ويندوز وليست ميزة مرتبطة بلغة برمجة معينة ( وهذه نقطة مهمة ؛ أنا حقيقة في بداية القراءة حول الـ SEH
كنت أعتقد أنها ميزة مرتبطة بـ C / C++ )
نجد كذلك نفس المعلومة السابقة مذكورة في موقع مايكروسوفت
The structured exception handling and termination handling mechanisms are integral parts of the system; they enable the system to be robust. You can use these mechanisms to create consistently robust and reliable applications.
إذًا، فالـ SEH
هي ميزة أو خدمة يقدمها نظام التشغيل ويندوز لإدارة الـ Exceptions
المحتمل حدوثها خلال تنفيذ البرنامج
لنأخذ المثال التالي حتى نستوعب الـ SEH
أكثر ( المثال من نفس المقالة القديمة )
Imagine I told you that when a thread faults, the operating system gives you an opportunity to be informed of the fault. More specifically, when a thread faults, the operating system calls a user-defined callback function. This callback function can do pretty much whatever it wants. For instance, it might fix whatever caused the fault, or it might play a Beavis and Butt-head .WAV file.
نعرف بشكل عام أن البرنامج عبارة عن عملية ( Process
) والعملية تحتوي Threads
واحد على الأقل أو أكثر ( المهتم بهذه التفاصيل أرشّح له الاطلاع على كتاب Windows Internals )
الآن لنتصوّر أنه خلال تنفيذ البرنامج حدث خطأ ( Exception
) في أحد الـ Threads
الخاصة بالبرنامج ، مع وجود الـ SEH
كميزة في نظام التشغيل، لن يقوم نظام التشغيل بانهاء البرنامج تمامًا ( لأنه حدث خطأ في أحد الـ Threads
)
لكن سيتيح نظام التشغيل ويندوز للمبرمج الفرصة لتصحيح هذا الوضع عن طريق نداء دالة مسؤولة عن التعامل مع هذا الخطأ، هذه الدالة هي ما قمنا بذكره سابقًا ، وهي الـ Exception Handlers
أو الـ callback function
كما هو مذكور في المثال أعلاه
قبل أن نختم هذه المقالة ، هذا تعريف آخر جميل أيضًا وجدته في هذه المقالة ولعله يلخّص العديد من النقاط المهمة التي ذكرناها حول الـ SEH
SEH can be described as a generalized error handling mechanism supported by the Windows OS. It is an Operating System feature and not tied to any programming language. It forms part of the Windows Application Binary Interface (ABI) so it’s a contract between an application and the Windows OS.
نكتفي بهذا القدر من المعلومات، ونكمل بقية المواضيع حول الـ SEH
في جزء آخر باذن الله
ℹ️ [ملاحظة] هذه المقالة تمّت كتابتها خلال دراسة هذه المواضيع، فكل ما تم ذكره هنا قد يحتمل الخطأ، لكن بالإمكان العودة إلى المراجع التي إستندت عليها هذه المقالة