pe نوعی فایل میباشد که استاندارد فایل های اجرایی ویندوز از جمله exe و dll و sys و .... میباشد . در این پست ما قصد داریم تا هدر  و دیتا های خام این فایل را تا حدودی بررسی نماییم.

در این عکس هدر فایل pe را مشاهده میکنیم .

pe

MS_DOS Header :
اولین بخش از فایل اجرایی هدر فایل pe میباشد . نکته این که اگر فایل اجرایی مخصوص ویندوز باشد در این هدر رشته ای شامل "This program cannot be run in DOS mode" (یا شبیه به آن) میباشد و ساختار آن نیز به شکل زیر میباشد .

typedef struct _IMAGE_DOS_HEADER {// DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
}IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;

e_magic : این مقدار در فایل های pe همیشه برابر "4D 5A" در مبنای هگز ، یا MZ بصورت کد اسکی میباشد.

e_lfanew : این مقدار حاوی مدار آدرس شروع هدر بعدی (pe) میباشد.


NT HEADERS :

بخش دوم هدر فایل pe میباشد که بعد از هدر MS_DOS ظاهر میشود و ساختار آن مطابق زیر است.

typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;


Signatur : همانند داس هدر این هدر نیز امضایی دارد که مقدار آن برابر "50 45"در مبنای هگز ، و PE بصورت کد اسکی میباشد.

IMAGE_FILE_HEADER : یه ساختمان داده میباشد که بخشی از هدر فایل pe را تشکیل میدهد .

typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
}IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;

machine : نوع معماری کامپیوتر راتعیین میکند .یک فایل pe تنها می تواند بر روی کامپیوتر مشخص شده یا یک سیستم که رایانه مشخص شده را شبیه سازی می کند اجرا شود. مقادیر این عضو را در کد انهای برنامه یا در لایبرری های ویندوز (؟) یا در msdn مشاهده نمود .

NumberOfSections : تعداد سکشن های موجود در فایل pe .

TimeDateStamp : نشان دهنده تاریخ و زمان (لینکر) میباشد.


IMAGE_OPTIONAL_HEADER : ساختمان داده ای که بخش دیگری از هدر فایل pe را تشکیل میدهد.

typedef struct _IMAGE_OPTIONAL_HEADER{
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
}IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;


Magic : وضعیت ایمیج فایل را با این عضو می تواند گرفت .(مقادیر موجود در سورس کد انتهایی موجود است و از سایت msdn نیز قابل مشاهده است)

MajorLinkerVersion :شماره نسخه اصلی لینکر.

MinorLinkerVersion : شماره نسخه فرعی لینکر.

SizeOfCode : سایز کد سکشن فایل pe را بر حسب بایت نشان میدهد . در صورت داشتن چند کد سکشن مجموع آنها را نشان میدهد.

SizeOfInitializedData : اندازه بخش داده ها (که مقدار دهی اولیه شده)بر حسب بایت میباشد و درصورت وجود چند سکشن داده ، این داده مجموع آن ها را نشان میدهد.

SizeOfUninitializedData : اندازه بخش داده ها (که مقدار دهی اولیه نشده)بر حسب بایت میباشد و درصورت وجود چند سکشن داده ، این داده مجموع آن ها را نشان میدهد.

AddressOfEntryPoint : یک اشاره گر به نقطه ورودی اولین تابع میباشد. برای فایل های اجرایی این آدرس اولیه است. برای درایور های دستگاه، این آدرس تابع اولیه است. تابع نقطه ورود برای DLL اختیاری است. هنگامی که هیچ ورودی وجود ندارد، این عضو صفر است.

BaseOfCode : اشارهگر به آغاز بخش کد.

BaseOfData : یک اشاره گر به ابتدای بخش داده.

ImageBase : آدرس ترجیحی اولین بایت ایمیج ،زمانی که در حافظه بارگذاری می شود. این مقدار چندین بایت 64K است. مقدار پیش فرض برای DLL 0x10000000 است. مقدار پیش فرض برای برنامه ها 0x00400000 است، به جز در ویندوز CE که 0x00010000 است.

MajorOperatingSystemVersion : شماره نسخه اصلی سیستم عامل مورد نیاز.

MinorOperatingSystemVersion : شماره نسخه فرعی سیستم عامل مورد نیاز.

Win32VersionValue : مقدار رزرو شده میلشد و باید 0 باشد.

SizeOfStackReserve : سایز حافظه رزرو شده برای استک بر اساس بایت.

SizeOfHeapReserve : سایز حافظه رزرو شده برای هیپ بر اساس بایت.


_______________________________________________________________

سورس کدی رو به عنوان مثال تهیه کردم درصورت مشکل داشتن ممنون میشم در کامنت ها بهم اطلاع بدید:

دریافت
حجم: 4.95 کیلوبایت