السلام عليكم ورحمة الله
والصلاة والسلام على اشرف خلق الله محمد بن عبد الله
بسم الله نبدء
PE FILES [ Portable Executable Files ]
وهو الرمز اللذي يعني الملفات التنفيذية في بيئة الوندوز
( EXE , SCR , COM .. )
بالتأكيد هناك تركيب للملفات التنفيذية كما انه هناك تركيب اخر للصور على سبيل المثال
هل يمكنك فتح صورة بدون عارض للصور ؟ او فيديو او مستند نصي إلخ ..
إذن كذلك الملفات التنفيذية هنالك مترجم لها يقوم بتفنيذ ماتحتويه من اكواد ويكون موجود بالوندوز بشكل أساسي لنسميه حاليا Loader
للتعمق
أكثر في الموضوع تطبيقات الدوت نت على سبيل المثال لماذا لاتعمل الا
بالدوت نت فريم ورك في الجهاز ؟ لأن الدوت نت فريم ورك هو بمثابة اللودر
هنا وهو من يقوم بترجمة اكودها ليستطيع الجهاز فهمها
هذه هي الفكرة في تشغيل الملفات .
نقطة الإدخال ( Entry Point ) :
عندما
يقوم اللودر بتحميل الملف لتشغيله عند إعطائك الامر له كيف يعلم اللودر من
أي يبدء بتنفيذ أكواد الملف ؟ ( تعليماته ) ونستطيع ان نسميها ( opcodes ) وهي التعليمات في لغة الأسمبلي مثل JMP – XOR – PUSH .. إلخ
نعود لمحور النقطة كيف يعلم ذلك هل يبدء بتنفيذ الكود من الوسط ؟ النهاية ام البداية
من
البداية بكل تأكيد لكن كيف يعرف أين البداية هذه هي نقطة الإدخال نقطة بدء
الملف وتكون موجودة في الملف نفسه يقرأها اللودر منه ثم يبدء بتنفيذ الملف
بدئا من نقطة الإدخال أين تكون موجودة في الملف من أين يقرائها هنا يجب أن
نبدء بالتعرف على تركيب الملفات التفيذية بالوندوز PE Format .
PE FORMAT – تركيب الملفات التنفيذية
لنأخد هذه الصورة أولا
الملف بالتأكيد عبارة عن بايتات هذه البايتات مقسمه لهذه الأقسام الموجودة بالصورة
لدينا MZ Header واللذي يستطيع اللودر عن طريقه التعرف إن كان الملف تنفيذي فعلا أم لا
عن طريق عنصر يسمى توقيع الدوس او ( DOS Signature )
نستطيع الوصل للـ MZ Header عن طريق ستركشر وفرته ميكروسوفت وهو
IMAGE_DOS_HEADER
للتوضيح أكثر ماهو الستركشر لمن لايملك فكرة عنه
الستركشر عبارة عن قائمة تحتوي عدة متغيرات بداخلها
تكتب بهذه الطريقة على سبيل المثال الستركشر السابق :
كود:<StructLayout(LayoutKind.Sequential, Pack:=1)> _Public Structure IMAGE_DOS_HEADERPublic e_magic As UInt16Public e_cblp As UInt16Public e_cp As UInt16Public e_crlc As UInt16Public e_cparhdr As UInt16Public e_minalloc As UInt16Public e_maxalloc As UInt16Public e_ss As UInt16Public e_sp As UInt16Public e_csum As UInt16Public e_ip As UInt16Public e_cs As UInt16Public e_lfarlc As UInt16Public e_ovno As UInt16Public e_res_0 As UInt16Public e_res_1 As UInt16Public e_res_2 As UInt16Public e_res_3 As UInt16Public e_oemid As UInt16Public e_oeminfo As UInt16Public e_res2_0 As UInt16Public e_res2_1 As UInt16Public e_res2_2 As UInt16Public e_res2_3 As UInt16Public e_res2_4 As UInt16Public e_res2_5 As UInt16Public e_res2_6 As UInt16Public e_res2_7 As UInt16Public e_res2_8 As UInt16Public e_res2_9 As UInt16Public e_lfanew As UInt32
يوجد به الكثيير من المعلومات أولها e_magic وهو التوقيع الـ DOS Signature
نلاحظ وجود UInt16 لمآذآ إستخدمناه ؟ لأن حجمه يعادل WORD أي 2 بايتات
فلو جعلنا الستركشر يشير لبايتات ملف مآ ستحوي الـ e_magic أول 2 بايتات فيه وهي التوقيع
واللذي بعدها ال 2 بايتات التالية وهكذا نحصل على المعلومات في هذا الستركشر فهذا الستركشر
يجب أن ياخد بايتات الملف من أول بايت فيه حتى يجلب المعلومات بشكل صحيح فهناك ستركشر آخر
معلومة التوقيع للملف التنفيذي هو MZ بالهيكس
4D5A
معلومة إخرى ايضا UInt16 نلاحظ وجود الرقم 16 ممايعني 16 بت
وهو حجم بايتين أي word لأن البايت الواحد = 8 بت
معلومة التوقيع للملف التنفيذي هو MZ بالهيكس
4D5A
معلومة إخرى ايضا UInt16 نلاحظ وجود الرقم 16 ممايعني 16 بت
وهو حجم بايتين أي word لأن البايت الواحد = 8 بت
إذن انتهينا من الطبقة الإولى MZ Header وعرفنا الستركشر اللذي يشير لها
الطبقة الثانية PE Header الطبقة الرائعة
واللتي تحتوي بداخلها على عدة طبقات كل طبقة نشير لها بستركشر اخر ايضا
لنتعرف على مابداخلها
إذن تحتوي على File Header – Optional Header – 2 Section Header
ونشير لها بالستركشر IMAGE_NT_HEADERS
لكن وبما أن بايتات الملف من البداية إلى منقطة معينة توجد بها طبقة ال MZ HEADER
إذن أين توجد طبقة الـ PE Header ( ( IMAGE_NT_HEADERS
هنا نرجع لإستخدام الستركشر الأول في طبقة الـ MZ Header فآخر متغير فيه e_lfanew
يحتوي على اوفست ( موقع ) بداية هذه الطبقة PE Header
لنقل أننا وصلنا لها إذن IMAGE_NT_HEADERS جلبنا لنا ستركشرين اخرين بداخله
Signature - IMAGE_FILE_HEADER – IMAGE_OPTIONAL_HEADER
الـ DWORD او المتغير الأول هو توقيع الـ NT
الـ DWORD او المتغير الأول هو توقيع الـ NT
لنتعرف على محتوى الـ Optional Header منطقة جميلة إخرى فيها اهم المعلومات
ملاحظة تعريف الستركشر بالسي ++ لكن ليست مشكلة ايضا 0x00 .. هي مجرد عنواين او اوفسيتس تخيلية لانضعها في التعريف اصلا .
نرى العنصر المهم موجود AddressOfEntryPointادرس او عنوان نقطة الادخال .
لمحات بسيطة عن باقي الطبقات
طبقة الكود سكشن CODE SECTION
الطبقة اللتي توجد فيها التعليمات الاكواد الموجودة في البرنامج
طبقة الداتا سكشن DATA SECTION
ويوجود بها الثواب من نصوص وارقام وغيره من داتا او متغيرات وضعت ليتم تخزينها في هذا القسم
والوصول لها من الكود سكشن وإستخدامها وغيره ..
قسم الإمبورتس IMPORTS او IMPORTS TABLE
ويحتوي على الدوال المستوردة ( دوال الوندوز ) API's
مثل MessageBoxA – LoadLibraryA وغيره سنتعرف على الدوال أكثر في الدروس القادمة
قسم الريسورسيس Resources
ويحتوي على اي ملف في البرنامج يتم تخزينه في الريسورس
مثل إيقونة البرنامج كاقرب مثال
توضيح أكثر للمعلومات السابقة :
لو قمنا بفتح أحد الملفات بالهيكس فنجد بايتاته بالهيكس وكل بايتين يعني WORD = UInt16
فكل متغير بالسترشكر سيحتوي عليه
بالنسبة للستركشر IMAGE_DOS_HEADER
e_magic
e_cblp
e_cp
وهكذا لكن ربما يوجد متغير حجمه أكبر أو أصغر وذلك على حسب السترشكر والبايتات المطلوبة
فلوا جعلنا UInt16 إلى UInt32 سنحصل على e_magic + e_cblp فيه ممآيعطينا معلومة خاطئة
بالتوفيق
e_magic
e_cblp
e_cp
وهكذا لكن ربما يوجد متغير حجمه أكبر أو أصغر وذلك على حسب السترشكر والبايتات المطلوبة
فلوا جعلنا UInt16 إلى UInt32 سنحصل على e_magic + e_cblp فيه ممآيعطينا معلومة خاطئة
بالتوفيق
رائع ياصديقي موضوع مفيد جدا شكرا لك
ردحذف