استخراج فایل از Resource

در این قسمت فقط منابع مربوط به برنامه نویسی سیستمی در ویندوز قرار میگیرد
nimaarek
پست: 2
تاریخ عضویت: یک شنبه 5 شهریور 1396, 2:06 am
تشکر کرده: 1 دفعه
تشکر شده: 2 دفعه

استخراج فایل از Resource

پست توسط nimaarek » یک شنبه 5 شهریور 1396, 8:13 pm

سلام،
کد زیر ریسورس قرار گرفته در فایل اجرای را در هارد دیسک کپی میکند.

کد: انتخاب همه

bool decompress_sysfile() {
HRSRC aResourceH;
HGLOBAL aResourceHGlobal;
unsigned char * aFilePtr;
unsigned long aFileSize;
HANDLE file_handle;

//////////////////////////////////////////////////////////
// locate a named resource in the current binary EXE
//////////////////////////////////////////////////////////

aResourceH = FindResource(NULL, "MIGBOT", "BINARY");
if(!aResourceH) {
return false;
}

aResourceHGlobal = LoadResource(NULL, aResourceH);
if(!aResourceHGlobal) {
return false;
}

aFileSize = SizeofResource(NULL, aResourceH);
aFilePtr = (unsigned char *)LockResource(aResourceHGlobal);
if(!aFilePtr) {
return false;
}

file_handle = CreateFile("C:\\MIGBOT.SYS", FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, 0, NULL);

if(INVALID_HANDLE_VALUE == file_handle) {
return false;
}

while(aFileSize--) {
unsigned long numWritten;
WriteFile(file_handle, aFilePtr, 1, &numWritten, NULL);
aFilePtr++;
}
CloseHandle(file_handle);

return true;
}
کد مربوط به بدافزار migbot میباشد که سورس کد آن را انتهای پست پیوست میکنم..
خب کد بالا را بررسی میکنیم..
با استفاده از تابع FindResource محل ریسورس را با نوع و نام مشخص شد در ماژول مربوط پیدا میکند.

کد: انتخاب همه

HRSRC WINAPI FindResource(
  _In_opt_ HMODULE hModule,
  _In_     LPCTSTR lpName,
  _In_     LPCTSTR lpType
);
این API سه پارامتر دارد، پارامتر اول hModule که مقداردهی آن الزامی نیست و lpName که شامل نام ریسورس و lpType شامل نوع ریسورس است. مقدار بازگشتی این تابع در صورت موفقیت آمیزبودن فرآیند، شامل هندل به ریسورس است که نوع آن HRSRC است.

کد: انتخاب همه

aResourceH = FindResource(NULL, "MIGBOT", "BINARY");
if(!aResourceH) {
return false;
}
ریسورس قرار گرفته در بدافزار migbot، شامل اسم MIGBOT و نوع BINARY است. تابع LoadResource که ورودی آن هندل مربوط به ریسورس است، یک اشاره گر به اولین بایت از ریسورس در حافظه را به عنوان خروجی برمیگرداند.

کد: انتخاب همه

aResourceHGlobal = LoadResource(NULL, aResourceH);
if(!aResourceHGlobal) {
return false;
}
سپس با استفاده از تابع SizeofResource حجم ریسوری را به بایت بدست میآورد و برای دسترسی به محتویات ریسورس که در حافظه قرار گرفته اند از تابع LockResource استفاده میکنیم که در واقع aFilePtr اشاره گری به اولین بایت از محتویات ریسورس است.

کد: انتخاب همه

aFileSize = SizeofResource(NULL, aResourceH);
aFilePtr = (unsigned char *)LockResource(aResourceHGlobal);
if(!aFilePtr) {
return false;
}
در نهایت برای کپی کردن ریسورس در هارد باید یک فایل بسازیم و محتویات ریسورس را در آن کپی کنیم.. برای ساختن فایل از تابع CreateFile کمک میگیریم در بدافزار migbot ریسورس یک درایور است پس میبایست یک فایل با پسوند SYS درست کنیم..

کد: انتخاب همه

file_handle = CreateFile("C:\\MIGBOT.SYS", FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, 0, NULL);

if(INVALID_HANDLE_VALUE == file_handle) {
return false;
}
بعد از ساخت فایل با تابع WriteFile محتویات ریسوری را در فایل MIGBOT.SYS مینویسیم و هندل مربوط به ریسورس را میبندیم..

کد: انتخاب همه

while(aFileSize--) {
unsigned long numWritten;
WriteFile(file_handle, aFilePtr, 1, &numWritten, NULL);
aFilePtr++;
}
CloseHandle(file_handle);
این مطالب مربوط به کتاب Subverting the Windows Kernel است که به فارسی ترجمه شد.. البته ممکن است اشتباهاتی هم در نوشته وجود داشته باشه..
سورس بدافزار migbot پیوست شد و پسورد فایل "infected" است.
migbot.rar
(24.03 کیلو بایت) 9 مرتبه دانلود شده