تکنیک Module Overloading یکی از روشهای پیشرفته برای پنهانسازی بدافزار در حافظه است که در آن یک تصویر کامل PE (Portable Executable) درون نگاشت حافظه (Memory Mapping) یک DLL قانونی قرار میگیرد. این روش با تکنیکهای مشابهی مانند Function Stomping و DLL Hollowing تفاوتهای ساختاری مهمی دارد.
تمایز تکنیکها در مدیریت حافظه
برای درک بهتر Module Overloading، باید آن را با روشهای دیگر مقایسه کرد:
- Function Stomping: جایگزینی دستورالعملها (Instructions) در یک تابع مشخص از یک ماژول.
- Module Stomping: جایگزینی دستورالعملها در نقطه ورود (Entry Point) یک DLL حامل.
- Module Overloading: جایگزینی کامل هدرها (Headers) و محتویات بخشها (Sections) یک ماژول با استفاده از یک تصویر PE کاملاً جدید.
مکانیسم عملیاتی و مراحل اجرا
در این تکنیک، مهاجم از یک فایل سیستمی معتبر (مانند WsmSvc.dll در ویندوز) به عنوان حامل (Carrier) استفاده میکند. فرآیند اجرای این حمله شامل مراحل زیر است:
- آمادهسازی Payload: فایل بدافزار (DLL) به صورت خام خوانده شده و ساختار آن پارس میشود.
- ایجاد نگاشت تصویری: با استفاده از
CreateFileMappingو فلگSEC_IMAGE، یک نمای تصویری از فایل حامل در حافظه ایجاد میشود. - جایگزینی محتوا: پس از تغییر سطح دسترسی حافظه به
PAGE_READWRITE، هدرها و بخشهای فایل بدافزار بر روی فضای نگاشت شدهی فایل حامل کپی میشوند. - اصلاح آدرسها (Relocation): از آنجایی که فایل بدافزار در آدرس پایه (Image Base) متفاوتی بارگذاری شده است، باید تمامی آدرسهای مطلق در بخش Relocation اصلاح شوند تا با آدرس جدید در حافظه مطابقت داشته باشند.
- حل کردن واردات (Import Resolution): جدول واردات (IAT) بدافزار باید به صورت دستی با استفاده از توابعی نظیر
LoadLibraryAوGetProcAddressتکمیل شود تا وابستگیهای بدافزار به سایر DLLها برطرف گردد. - تنظیم سطوح دسترسی: پس از کپی، سطوح دسترسی بخشها (مانند Executable یا Read-only) با استفاده از
VirtualProtectتنظیم میشود تا امنیت و عملکرد مشابه یک ماژول واقعی حفظ شود. - اجرا: در نهایت با فراخوانی
FlushInstructionCache، کش دستورالعملها پاک شده و نقطه ورود (Entry Point) جدید اجرا میگردد.
چالشهای شناسایی
یکی از جنبههای پیچیده این تکنیک، نحوه گزارشدهی سیستمعامل است. حتی پس از اینکه محتوای یک صفحه حافظه از طریق مکانیزم Copy-on-Write تغییر میکند، تابع VirtualQuery همچنان ممکن است نوع حافظه را به عنوان MEM_IMAGE گزارش دهد. این ویژگی باعث میشود که ابزارهای تحلیل حافظه و EDRها در تشخیص تفاوت بین فایل اصلی روی دیسک و محتوای تغییر یافته در حافظه دچار چالش شوند.