Image-backed Memory و
VAD
تا اینجا درباره RW → RX صحبت کردیم
این Memory اصلا متعلق به چیه؟
وقتی یک Process رو بررسی میکنید همه Memory هایی که میبینید یک جنس نیستن
برای تحلیل Memory-based Behavior باید بدونیم هر Region چطور ساخته شده و چه رابطهای با فایل روی دیسک داره
Image-backed Memory
وقتی یک PE مثل:
notepad.exe
ntdll.dll
kernel32.dll
داخل Process قرار میگیره بخش هایی از Virtual Address Space به یک Image File روی دیسک مرتبط میشن
بهصورت مفهومی:
PE File
│
▼
Image Mapping
│
▼
Process Virtual Address Space
مثلا یک Executable ممکنه Section هایی مثل این داشته باشه:
notepad.exe
├── .text
├── .rdata
├── .data
└── ...
در Memory این بخشها معمولا به Image مربوط به همان Module مرتبط هستن پس وقتی یک Region از نوع Image باشه یکی از سوالهای مهم اینه:
این Region به کدوم Module روی دیسک مربوطه؟
Private Memory
نوع دیگری از Memory به شکل Private ایجاد میشه
این Memory مستقیما یک Image Mapping از فایل PE مشخص نیست
مثلا Process ممکنه برای موارد مختلف از Private Memory استفاده کنه:
Process
│
├── Image-backed Memory
│
└── Private Memory
├── Heap
├── Runtime Data
├── Temporary Allocations
└── Other Private Allocations
نکته مهم:
Private Memory ≠ Malware
برنامه های کاملا Legitimate هم دائما از Private Memory استفاده میکنن
پس صرفا دیدن
Type = Private
هیچ چیزی رو اثبات نمیکنه
پس چرا Private Memory برای تحلیل امنیتی مهمه؟
چون باید چند ویژگی رو کنار هم بررسی کنیم
مثلا:
Private Memory
+
Executable Permission
+
Unusual Thread
+
Unexpected Call Stack
هر کدوم به تنهایی میتونه کاملا طبیعی باشه
ولی وقتی چند Evidence کنار هم قرار میگیرن ارزش Investigation بیشتر میشه
مثلا یک Region:
Private
RX
`به تنهایی نمیگه:
Malicious
اما میتونه یک نقطه مناسب برای بررسی بیشتر باشه
تحلیلگر باید Context رو بررسی کنه
VAD
حالا میرسیم به VAD
Virtual Address Descriptor
VAD
یکی از ساختارهای داخلی
Windows
برای توصیف محدودههای یک Virtual Address Space Process هست
به صورت مفهومی:
Process Virtual Address Space
0x0000
│
├── Region A
├── Region B
├── Region C
├── Region D
└── ...
0xFFFF
VAD ها به Kernel کمک میکنن اطلاعات
مربوط به محدوده های Virtual Memory یک Process رو مدیریت و توصیف کنه
مثلا اینکه یک محدوده کجاست و چه ویژگی هایی داره
Memory Region
فقط یک Address نیست
فرض کنید در Debugger یا Memory Analysis چنین چیزی ببینید:
Address: 0x7...
Size: 0x...
Protection: RX
Type: Private
اگر فقط Address رو ببینید اطلاعات زیادی از دست میدید
باید چند تا سوال بپرسید:
این Region کجاست؟
↓
چه اندازهای داره؟
↓
Protection اون چیه؟
↓
Private
هشت یا Image؟
↓
به چه Mapping یا Allocation ای مربوطه؟
↓
چه Thread هایی به اون دسترسی یا اجرای مرتبط دارن؟
↓
در طول زمان چه اتفاقی برای اون افتاده؟
اینجا Memory Analysis از نگاه کردن به چند Hex Value تبدیل میشه به تحلیل رفتار
VAD در Memory Forensics
در Memory Forensics میتونیم ساختار های Virtual Memory مربوط به Process رو بررسی کنیم
بهصورت مفهومی:
Process
│
├── Image
│ ├── .text
│ └── .data
│
├── DLLs
│
├── Heap
│
└── Private Regions
حالا فرض کنید یک Region پیدا کردیم که نیاز به بررسی بیشتری داره
میتونیم بپرسیم:
Protection چیه؟
↓
Private هست یا Image?
↓
به Module شناختهشده ای مرتبطه؟
↓
محتواش چه شکلیه؟
↓
Thread ی با اون ارتباط داره
↓
Call Stack چه چیزی نشون میده؟
↓
وضعیت Region در طول زمان تغییر کرده؟
نکته مهم اینه که VAD بهتنهایی جواب همه این سؤالها رو نمیده
VAD
یکی از منابع Evidence در تحلیل Memory هست
یک سناریوی تحلیلی
فرض کنید داخل یک Memory Dump این وضعیت رو داریم:
Process: example.exe
Region A
Image
RX
Region B
Private
RW
Region C
Private
RX
Region A خیلی عادی به نظر میرسه
چون به یک Image مربوطه و Permission اون هم برای اجرای Code قابل انتظاره