ساختار فایل های اجرایی در ویندوز
فایل اجرایی توی ویندوز یا به عبارتی PE با پسوند exe , dll و ... شناخته میشن که قطعا با فایلهایی با پسوند اینجوری روبرو شدید:)
اکثر اینا از یک قالب تعیین شده ای استفاده می کنند (VxDs و DLL های 16 بیتی ازین قالب مستثنی هستند) این قالب اجازه میده که یک فایل اجرایی توی همه نسخه های ویندوز قابل حمل باشه و دیگه ما نیاز به کامپایل دوباره مخصوص نسخه ی ویندوزیمون نداشته باشیم.
ساختار فایل اجرایی به شکل زیر هستش
DOS MZ header
اگه ما یه فایل اجرایی رو توی برنامه هگزادیتور باز کنیم 64 بایت اولش به Dos Header اختصاص داده شده و ازین قسمت برای تعیین اعتبار یک فایل اجرایی استفاده میشه یعنی اگه فایل اجرایی Dos Header نداشته باشه یه فایل اجرایی معتبر نیست.
Dos Header ساختارش به صورت زیر هستش که البته magic و lfanew مهمترینش هستند.
Magic محتوی مقدار 4D, 5A هستش که اگه به اسکی تبدیل بشه MZ میشه.
همه فایل هایی اجرایی باید اولین دو بایتشون MZ باشه در غیر اینصورت فایل اجرایی نامعتبر هستند و اجرا نمیشن.
lfanew که 4 بایت هستش محتوی آفست PE Header هستش یعنی با مقدار این فیلد میتونیم به آدرس شروع PE Header برسیم.
Dos Stub
درست بعد از Dos Header قرار داره و معمولا هم رشته ی زیر رو چاپ میکنه
" This program must be run under Microsoft Windows"
این قسمت برای ما اهمیتی نداره
توی شکل زیر میتونید قسمت هایی که توضیح دادیم رو ببینید
PE Header
خوب گفتیم که lfanew محتوی آفست PE Header هستش توی شکل بالا میبینید که فیلد lfanew
محتوی 00010000
هستش و اگه ما این مقدار رو برعکس کنیم 00000100 میشه پس یعنی PE Header از آفست 100 شروع میشه (ترتیب خوندن بایت ها بصورت عکس هستش,برای اطلاعات بیشتر جستجو کنید حتما!)
ساختار PE Header به صورت زیر تعریف شده:
اولین فیلد (Signature) 4 بایت هستش که نوع فایل اجرایی رو مشخص میکنه یعنی اگه 50450000 (که میشه حرف PE) باشه این یه فایل PE هستش اگه NE باشه یه فایل NE 16بیتی ویندوز هستش و الا آخر...
دومین فیلد FileHeader هستش که خودش یه ساختار متفاوت داره و 20 بایت هم فضا اشغال میکنه ساختار FileHeader بصورت زیر هستش
اکثر این فیلدها برای ما اهمیتی ندارند و نام اونها هم مشخص کننده کاراییشون هست مثلا اولین فیلد نوع پردازنده رو مشخص میکنه ,دومین فیلد تعداد سکشن های برنامه رو مشخص میکنه و ...
سومین فیلد توی PE Header یعنی OptionalHeader هم خودش یه ساختار متفاوت داره که 224 بایت فضا اشغال میکنه و ساختارش بصورت زیر تعریف شده
فیلدهای مهم این ساختار عبارتند از:
فیلد AddressOfEntryPoint
محتوی آدرس ورودی برنامه هستش
فیلد ImageBase
محتوی آدرس بارگزاری ارجع فایل اجرایی هستش و لودر سعی میکنه تا فایل رو داخل فضای آدرس مجازی که از این آدرس شروع میشه بارگزاری کنه
فیلد SectionAlignment
محتوی سایز تنظیم سکشن ها توی حافظه هستش و هر سکشن باید مضربی ازین مقدار باشه
فیلد FileAlignment
محتوی سایز تنظیم سکشن ها در فایل روی دیسک هستش
فیلد SizeOfImage
محتوی سایز کل فایل در حافظه هستش
فیلد SizeOfHeaders محتوی سایز همه ی هدرها + section table هستش.البته سایز سکشن ها رو به این اضافه نمی کنیم.
فیلد DataDirectory
این فیلد 128 بایت فضا اشغال کرده و دارای 16 تا ساختار هستش که بعدا در موردش توضیح کاملتر رو میدم. پس تا اینجا میتونیم توی هگز ادیتور بصورت زیر هدر ها و فیلد هارو مشخص کنیم