در حافظه و تفاوتش با فایل روی دیسک
تا اینجا درباره ی
Private Memory Image-backed Memory و VAD صحبت کردیمحالا میخوایم ببینیم وقتی یک فایل اجرایی ویندوز وارد حافظه میشه چه اتفاقی براش میوفته و چرا نسخهی داخل Memory معمولا با نسخهی روی دیسک یکی نیست
اول ببینیم PE چیه
فرمت اجرایی اصلی بسیاری از برنامههای ویندوز PE یا Portable Executable هست
فایلهایی مثل اینها رو در نظر بگیرید:
program.exe
library.dll
ساختار کلی یک فایل PE تقریبا به این شکله:
PE File
│
├── DOS Header
├── PE Signature
├── COFF File Header
├── Optional Header
├── Section Headers
│
├── .text
├── .rdata
├── .data
├── .pdata
└── Other Sections
همه ی فایلها لزوما تمام این Section ها رو ندارن و ترتیب و جزئیاتشون هم ممکنه متفاوت باشه
هر بخش اطلاعات مشخصی داره و Windows از ساختار PE برای شناخت و بارگذاری فایل اجرایی استفاده میکنه
وقتی PE وارد Memory میشه چه اتفاقی میوفته؟
فرض کنید این فایل روی دیسک وجود داره:
C:\Program Files\App\program.exe
وقتی Windows اون رو اجرا میکنه Loader سیستم عامل فرایند اپلود رو انجام میده
نمای ساده :
PE File on Disk
|
v
Windows Loader
|
v
Virtual Address Space
|
v
Program Execution
اما نکته اینجاست که Windows معمولا فایل رو به شکل یک تیکه ی خام و بدون تغییر داخل Memory کپی نمیکنه
Loader باید ساختارهای فایل رو پردازش کنه و بخشهای مختلف رو در جای مناسب قرار بده
تفاوت Raw Offset و RVA
اینجا به یکی از مفاهیم پایهای میرسیم
Raw Offset
آدرسیه که برای پیدا کردن اطلاعات داخل خود فایل روی دیسک استفاده میشه
مثلا:
File Offset = 0x600
یعنی اطلاعات موردنظر از Offset برابر با
0x600 در فایل شروع میشهRVA
مخفف این عبارته:
RVA = Relative Virtual Address
یعنی آدرس یک بخش نسبت به
ImageBase در فضای آدرس مجازیمثلا:
ImageBase = 0x140000000
RVA = 0x2000
در این مثال:
VA = ImageBase + RVA
پس:
VA = 0x140002000
این محاسبه آدرس مجازی موردنظر رو به دست میاره به شرطی که از
ImageBaseواقعی Image بارگذاری شده استفاده کنیم
تفاوت اصلی
Raw Offset
|
+--> موقعیت در فایل روی دیسک
RVA
|
+--> موقعیت نسبت به
ImageBase
در فضای آدرس مجازی
Raw Offset و RVA
لزوما برابر نیستن
برای تبدیل بین اونها باید اطلاعات Section مربوطه مثل
PointerToRawData و VirtualAddressرو هم در نظر بگیریم
ضمن اینکه همه ی آدرس های مجازی
لزوما معادل یک بخش از دادههای موجود در فایل نیستن برای مثال ممکنه یک بخش در حافظه بزرگتر از دادهی خام متناظر با خودش باشه
ImageBase
هر Image در حالت اپلود شده یک Base Address داره که بهش
ImageBase میگیمبرای مثال:
Preferred ImageBase:
0x140000000
این آدرس محل ترجیحی تعریف شده برای بارگذاری Image در فایل PE هست
ولی Windows همیشه مجبور نیست Image رو دقیقا همونجا قرار بده
چرا؟
چون ممکنه اون محدوده از فضای آدرس مجازی در دسترس نباشه یا شرایط دیگهای وجود داشته باشه
در این شرایط Image ممکنه در آدرس دیگری بارگذاری بشه
اینجا میریم سراغ مفهوم بعدی
Base Relocation
فرض کنید برنامه انتظار داره Image در این آدرس قرار بگیره:
Preferred Base = 0x140000000
اما در عمل در آدرس دیگه ای اپلود میشه:
Actual Base = 0x180000000
اختلاف این دو آدرس:
Delta = Actual Base - Preferred Base
در صورتی که Image به Relocation نیاز داشته باشه و اطلاعات لازم موجود باشه Loader از اطلاعات Relocation برای اصلاح آدرسهای وابسته به محل بارگذاری استفاده میکنه
به این فرایند Base Relocation میگیم
نکتهی مهم اینه که تمام آدرس های داخل فایل نیازمند Relocation نیستن فقط مواردی که طبق ساختار PE به محل بارگذاری وابسته هستن و اطلاعات Relocation مناسب براشون وجود داره باید درست بشن
Import Table
چه کاری انجام میده؟
برنامهها معمولا از توابع کتابخانههای دیگه استفاده میکنن
برای مثال یک برنامه ممکنه به توابعی از این Moduleها نیاز داشته باشه:
KERNEL32.dll
USER32.dll
ADVAPI32.dll
اطلاعات مربوط به وابستگیهای خارجی در ساختارهای Import فایل PE قرار میگیره
Loader
این وابستگی ها رو پردازش میکنه و آدرس توابع موردنیاز رو در ساختار های مرتبط قرار میده