بسم الله الرحمن الرحيم
ادا كنت مهتما بالهندسة العكسية تحت بيئة Linux فانك ولابد سوف تحتاج لهدا المقال فكما هو معروف لكل من يزاول فن الهندسة العكسية اهمية معرفة بنية الملف التنفيدي ففي Winows مثلا هناك بنية PE اما في Linux فهناك ELF لدلك سوف احاول بادن الله ان اضع موضوعا بسيطا حول هده البنية خصوصا انني لم ارى اي مقال عربي يعرض هده البنية بشكل نهائي (حسب بحثي) فعلى بركة الله.
بنية ELF اختصار لجملة Executable and Linking Format تم تطويرها من طرف نظام UNIX لكي تكون عبار عن ملف غرضي (object file) قابل للاشتغلال تحت بيئات مختلفة التي تستخدم معالج Intel .
كما هو الامر بالنسبة ل بنية PE فان بنية ELF تحتوي على اقسام (sections) و جداول (Tables) و ترويسة (Header) و..

قبل التعمق بشكل اكثر اود ان اشير الى ان بنية ELF يمكن مجازيا التعبير عنها بشكلين شكل في الداكرة وشكل في القرص الصلب وكل ما ساتناوله هو فقط الشكل المتعلق بالقرص الصلب ولن اتطرق للكيفية التي يعمل بها البرنامج في الداكرة.
ان كل ملف ELF يحتوي على Header Table وهو اشبه بخريطة تصف الملف بشكل دقيق وهده هي بنيتة
هده البنية تمكننا من معرفة عدة معلومات مهمة مثلا e_machine تمكننا من معرفة البيئة التي تم عمل compile فيها للبرنامج و e_entry تمكننا من معرفة نقطة دخول البرنامج اي العنوان الدي سيبدا منه البرنامج بالاشتغال والعديد العديد بالطبع كل واحد من البيانات المعرفة في البنية يمكننا ان نجعله موضوع بحد داتها ولكنني لن اتوقف عندها
program header هو عبارة عن خريطة بدوره يخبر النظام عن كيفية انشاء اجراء يخص هدا البرنامج ان صح التعبير
section header table هو عبارة عن جدول كل خانه من هدا الجدول ان صح التعبير تحتوي على section header خاص ب section ما
و section header معرف كالتالي
وهده البنية كسابقتها مهمة جدا فهي تعطي لنا عدة معلومات حول section مثلا sh_name يعطي اسم section و sh_addr يعطي لنا عنوان section في الداكرة بعد التشغيل و sh_flags يعطي لنا خصائص section هل هي قابلة للكتابة هل هي قابلة للقرائة ...
واخيرا وليس اخرا sections التي تتعلق بالبرنامج ولكن هناك ما يعرف ب special sections اي الاقسام الخاصة والتي هي عبارة عن اقسام محجوزة من طرف النظام وهده الاقسام مسبوقة بنقطة في اسمها وهي كالتالي (ليست كلها وبالطبع قد لا توجد كلها في البرنامج)
بالطبع اهمها هو text الدي يحتوي على تعليمات البرنامج
بالطبع كما دكرت في بداية الموضوع ان الموضوع لن يكون معمقا بشكل كبير لانه فعلا هناك عدة امور جميلة ويصعب دكرها كلها في موضوع بسيط.
ادا كنت مهتما بالهندسة العكسية تحت بيئة Linux فانك ولابد سوف تحتاج لهدا المقال فكما هو معروف لكل من يزاول فن الهندسة العكسية اهمية معرفة بنية الملف التنفيدي ففي Winows مثلا هناك بنية PE اما في Linux فهناك ELF لدلك سوف احاول بادن الله ان اضع موضوعا بسيطا حول هده البنية خصوصا انني لم ارى اي مقال عربي يعرض هده البنية بشكل نهائي (حسب بحثي) فعلى بركة الله.
بنية ELF اختصار لجملة Executable and Linking Format تم تطويرها من طرف نظام UNIX لكي تكون عبار عن ملف غرضي (object file) قابل للاشتغلال تحت بيئات مختلفة التي تستخدم معالج Intel .
كما هو الامر بالنسبة ل بنية PE فان بنية ELF تحتوي على اقسام (sections) و جداول (Tables) و ترويسة (Header) و..

قبل التعمق بشكل اكثر اود ان اشير الى ان بنية ELF يمكن مجازيا التعبير عنها بشكلين شكل في الداكرة وشكل في القرص الصلب وكل ما ساتناوله هو فقط الشكل المتعلق بالقرص الصلب ولن اتطرق للكيفية التي يعمل بها البرنامج في الداكرة.
ان كل ملف ELF يحتوي على Header Table وهو اشبه بخريطة تصف الملف بشكل دقيق وهده هي بنيتة
كود PHP:
typedef struct
{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
} Elf32_Ehdr;
program header هو عبارة عن خريطة بدوره يخبر النظام عن كيفية انشاء اجراء يخص هدا البرنامج ان صح التعبير
section header table هو عبارة عن جدول كل خانه من هدا الجدول ان صح التعبير تحتوي على section header خاص ب section ما

كود PHP:
typedef struct
{
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
} Elf32_Shdr;
واخيرا وليس اخرا sections التي تتعلق بالبرنامج ولكن هناك ما يعرف ب special sections اي الاقسام الخاصة والتي هي عبارة عن اقسام محجوزة من طرف النظام وهده الاقسام مسبوقة بنقطة في اسمها وهي كالتالي (ليست كلها وبالطبع قد لا توجد كلها في البرنامج)
كود PHP:
.bss
.comment
.data
.data1
.debug
.dynamic
.dynstr
.dynsym
.fini
.got
.hash
.init
.interp
.line
.note
.plt
.relname
.relaname
.rodata
.rodata1
.shstrtab
.strtab
.symtab
.text
بالطبع كما دكرت في بداية الموضوع ان الموضوع لن يكون معمقا بشكل كبير لانه فعلا هناك عدة امور جميلة ويصعب دكرها كلها في موضوع بسيط.
تعليق