ايها المشفر توقف قليلا
؟
؟
؟
؟
السلام عليكم ورحمة الله تعالى وبركاته
اذا ما نظرنا الى جميع المنتديات العربية و حتى الاجنبية
و اطلعنا على صفحاتها الاولى نجد :
تشفير بفروست خام فقط بالهيكس
تشفير بوزون من الافيرا و الباندا بتغيير قيمة ثنائية وثلاثية و حتى سباعية.
و هكذا من العناوين البراقة لكن
هل تعرف مكونات هذا الملف exe و ما هي البنية الاساسية له؟ ام فقط تغيير قيم وكفى؟
اذن هيا بنا نكشتف سويا اسرار هذه النوعية من الملفات
الملف exe من الملفات التنفيذية كما يعلم الجميع وتندرج اضافة الى ملفات dll و ocx و..
في ما يعرف بملفات pe
لكن ما معنى هذا الاختصار؟
هو اختصار لكلمة portable executable
و كما قلنا اضافة الى exe توجد dll و ocx
لكننا هنا سنحاول شرح مكونات exe وطبعا ما ينطبق عليه ينطبق على الباقي
اذن ماهي البنية الاساسية لملفات pe
يتكون ملف pe من خمسةاقسام
اقتباس:
1 قائمة تعريف الدوس = Dos MZ Header
2 قسم الدوس = Dos stub
3قائمة تعريف بي = Pe Header
4 قائمة اقسام البرنامج = Section table
5 اقسام البرنامج = Section
على الاقل لابد من وجود قسمين في اقسام البرنامج و قد تصل حتى ثمانية اقسام
كل ملفات pe تبدأ Dos Header و التالي تشغل مساحة 64 بايت من الملف في هذه الحالة يتم تشغيل الملف من
الدوس
فإن كان الملف ملائم يتم نداء مقاطعات الدوس وهي 21hأما اذا كان البرنامج يعمل تحت بيئة win32 انذاك سيتم نداء
المقاطعة
21h ثم الخدمة رقم 9 وهي الخاصة بطبع النصوص مثل L.!This program cannot be run in DOS mode
اذن دعنا نتعمق قليلا في مكونات هذا الملف و التجربة ستكون على سرفر بفروست مدمنين بفروست خخخخخ
لنفتح السرفر باي محرر الهيكس و ليكن hex workshop
اول ما يثير الانتباه عند فتح اي ملف pe الحرفان MZ
الحرفان اختصار لmark zbikowsky و هو واحد من افضل مصممين MS-DOS
كما قلنا في السابق ان dos header يشغل 64 بايت من مساحة الملف و اذا ما حسبنا عدد البايتات الملونة (باللون
الاسود) في الصورة السابقة
سنجد 64 بايت تليها 21 خاصة بنداء مقاطعة الدوس (اللون الاصفر) ان كان البرنامج سيشتغل في بيئة الدوس ان لم
يشتغل يتم طباعة الجملة الشهيرة
خاصة بقسم الدوس (اللون الاخضر)ومعناه ان البرنامج سيشتغل على win32
هل رأيت الأربع بايتات التي باللون الاحمر D8000000 هذه البايتات خاصة بالدالة e_ifanew
و هذه هي البنية الخاصةDos MZ header
19 عنصر كما موضح في صورة كل عنصر من نوع word اي 2بايت عادا الدالة e_ifanew التي تاتي في اخر الصورة
فطولها dword اي 4 بايت
كما تعلمنا في السابق ان الذاكرة تقرأ القيم عكسيا
بمعنى ان القيمة D8000000 ستقرأها الذاكرة هكذا 000000D8
اي ان البايت الايمن يصبح الاول يليه الثاني يليه الى اخر
و هو الاوفست بداية القسم PE header
و بذلك نكون قد انتهينا من شرحDos MZ header و dos stub
PE header
ال Pe header يمثل الجزء الاساسي من بينية الملف و يشمل 248 بايت كما في الصورة
و هذا القسم له بنية خاصة به و هي IMAGE_Nt_HEADERS و يتكون من ثلاث عناصر وهي معرفة كما يلي
signature يمثل 4 بايت اي 00 00 45 50 و هذه هي القيم الخاصة ببداية PE Header
اما file Header يمثل 20 بايت بعد signature و يشمل معلومات حول خصائص الملف مثل عدد الاقسام .تاريخ انشاء
الملف نوع الجهاز
و العنصر File Header له بنية خاصة به
هذه الدالة تدل على نوعية الجهاز المستخدم
بالنسبة لمستخدمي intel 386 القيمة هي 014c
اما ان كان cpu من نوع intel 486 فالقيمة هي 014d
الدالة NumberofSections خاصة بعدد اقسام البرنامج بحيث اذا ما اردنا ان نضيف قسم او نحذف قسم لازم نعدل
على هذه القيمة على حسب ما نريد
و بإمكاننا التأكد بواسطة البرنامج LordPE
TimeDateStamp هذه الدالة تدل على تاريخ ووقت انشاء الملف
PointerToSymbolTable و NumberOfSymbols هذين العنصرين يستخدموا لdebuginformation
SizeOfOptionalHeader هو حجم
OptionalHeader
اذا عكسنا هذه القيمة و اخدت وضعها الطبيعي فإنها تصبح هكذا 00e0 وهي تساوي 224 بالعشري وهو فعلا حجم
الOptionalHeader
characteristics هذه الدالة تشير الى خصائص الملف كونه exe ام DLL و الصورة التالية توضح
كما ترى في الصورة القيمة 0F01 لوعكسنها ستصبح 010F
واذا استعملنا برنامج LordPe
ذا ضغطنا على التبويب الملون بالأخضر ستحصل على هذا الشكل
0001+0002+0004+0008+0100=010F
كيف تم حساب تلك القيمة؟ انطلاقا من هذا الجدول
optionalHeader تمثل 224 بايت بعد fileHeader ويشمل معلومات خاصة بملف Pe مثل حجم الكود و حجم البيانات و
نقطة الادخال الاصلية للبرنامج
وهذا العنصر له بنية خاصة به وهي
سوف نتطرق لأهم الدوال
AddressOfEntryPoint هذه الدالة تحدد نقطة انطلاقة البرنامج وهو اول امر سوف يتم تنفيذه وهذه النقطة هي عبارة
عن عنوان في الذاكرة و يتم الاشارة إليها بRVA
Relative virtual address
imagebase تشير هذه الدالة الى عنوان بداية البرنامج في الذاكرة و هذا هو العنوان 400000 وهو ثابت بنسبة 99%
SectionAlignment هذه الدالة تشير الى تنسيق محتويات اقسام البرامج في الذاكرة و في الاغلب تكون القيمة
1000h وعلى سبيل المثال اذا كانت قيمة هذه الدالة 1000h
عندئد كل قسم يجب ان يبدأ في مضاعفات العدد 1000h فإذا كان القسم الاول يبدأ عند 401000h القسم الثاني
سيكون 402000
fileAlignment تشير الى تنسيق محتويات البرنامج على القرص الصلب و غالبا ما تكون قيمة هذا القسم 200h
على سبيل المثال اذا كانت قيمة هذه الدالة 200h عندئد كل قسم يجب ان يبدأ في مضاعفات هذا العدد ان كان
offset للقسم الأول يساوي 200h فإن القسم الثاني يجب ان يحدد عند offset
400h
sizeOfImage حجم البرنامج ككل في الذاكرة
sizeOfheaders حجم كل header اضافة الى قائمة اقسام البرنامج وهذه القيمة مساوية لحجم الملف ناقص حجم
اقسام البرنامج
dataDirectory عبارة عن مصفوفة تتكون من 16 عنصر ولها بينية خاصة بها وهي Image_data_Directory
وهي تمثل 128 بايت من ال Optionalheader و الDataDirectory وهي معرفة كما في الشكل التالي
virtual address ينسب اليه فهو ImageBase + RVA
isize يشمل حجم بيانات كل عنصر من العناصر 16 ولكن بالبايتات و كما قلنا من قبل ان هذه المصفوفة تتكون من 16
عنصر كما في الشكل التالي
ولكي تتضح لنا الصورة جيدا نحمل سرفرنا الى برنامج lordPe ثم نضغط على directoies لنرى مثل هذه الصورة
كما ترى في الصورة 16 عنصر لكن في برنامجنا توجد اربع عناصر لهم قيم اما الباقي قيمهم صفر
و يتم توضيح الاربع عناصر في برنامج محرر hex على الشكل التالي
ملاحظة الRVA هو عبارة عن virtualAddress-Imagebase
و بذلك نكون قد انتهينا من شرح Pe header
و ان شاء الله لنا عودة في الجزء الثاني و المتعلق بشرح Section Table و ٍsection
السلام عليكم ورحمة الله
hjp]h; dh hdih hglatv juvt i`i hglug,lhj >>>>>>>>>