
تقنيات إساءة استخدام Win32 والنواة لاختبار الاختراق
تقنيات استغلال Win32 والنواة لصالح مختبري الاختراق وفريق الأحمر، من إعداد @UVision و@RistBS
وضع المطوّر مفعّل، نرحب بأي مساعدة :)
DOS_HEADER : الرأس الأول لملف PE، يحتوي على رسالة MS DOS ("This programm cannot be run in DOS mode....")، ورأس MZ (بايتات سحرية للتعرف على PE) وبعض محتوى الإجراء الافتتاحي (stub).IMAGE_NT_HEADER : يحتوي على توقيع ملف PE، ورأس الملف (File Header) والرأس الاختياري (Optionnal Header)SECTION_TABLE : يحتوي على رؤوس الأقسامSECTIONS : ليست رأسًا ولكن من المفيد معرفتها: هذه هي أقسام ملف PEالتفاصيل : https://www.researchgate.net/figure/PE-structure-of-normal-executable_fig1_259647266
تحليل PE بسيط للحصول على العنوان المطلق لـ IAT و ILT:
GetModuleHandleA(NULL);BaseAddress+PIMAGE_DOS_HEADER.e_lfnanew (RVA الخاص بـ NT_HEADER)OptionnalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] من PIMAGE_NT_HEADERIMAGE_DATA_DIRECTORY.VirtualAddress (RVA الخاص بـ IMAGE_IMPORT_DIRECTORY)BaseAddress + IMAGE_IMPORT_DIRECTORY.VirtualAddress (RVA الخاص بـ IMAGE_IMPORT_DESCRIPTOR)يعمل EAT على حل جميع الدوال التي يصدرها PE ويحل أيضًا ملفات DLL. وهو معرَّف في بنية IMAGE_EXPORT_DIRECTORY:```c
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name; // name of DLL
DWORD Base; // first ordinal number
DWORD NumberOfFunctions; // number of entries in EAT
DWORD NumberOfNames; // number of entries in (1) (2)
DWORD AddressOfFunctions; // RVA EAT and contains also RVA of exported functions
DWORD AddressOfNames; // Pointer array contains address of function names
DWORD AddressOfNameOrdinals; // Pointer array contains address of ordinal number of functions (index in AddressOfFunctions)
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
يُرجى ملاحظة أن EAT مُعرَّف في DLL، وليس في PE "حقيقي" (حيث يستخدم الـ PE جدول EAT الخاص بـ DLL مُحمَّل لحل المؤشرات إلى الدوال التي يريد استخدامها).
### تحليل عنوان دالة
**باستخدام عنوان الدالة**
على ماذا تنتظر؟ ابحث عن هذه الدالة!
**باستخدام الرقم الترتيبي**
الرقم الترتيبي هو **موضع فهرسي** يشير إلى عنوان الدالة المقابل في مصفوفة `AddressOfFunctions`. يمكن استخدامه **لاسترجاع العنوان الصحيح للدالة**، كما يلي:
لنحاول العثور على العنوان المقابل (Addr4) باستخدام الرقم الترتيبي 3.
- **AddressOfFunctions** : *Addr1 Addr2 Addr3 Addr4 .... AddrN*
- **AdressOfNameOrdinals** : *2 5 7 3 ... N*
العنوان الذي نبحث عنه يقع في الموضع الثالث (بدءًا من 0)، والرقم الترتيبي لدينا يقابل **فهرس هذا العنوان**.
**باستخدام اسم الدالة**
العنصر Nth في مصفوفة AddressOfNames يقابل العنصر Nth في مصفوفة AddressOfNameOrdinals: باستخدام اسم معيّن، يمكنك استرجاع الرقم الترتيبي المقابل، ثم المتابعة للعثور على عنوان الدالة باستخدام هذا الرقم.
## جدول عناوين الاستيراد (IAT)