PDA

View Full Version : Hook کردن IAT



r00tkit
یک شنبه 11 مهر 1389, 13:49 عصر
سلام

تو این (http://barnamenevis.org/forum/showthread.php?t=250339)پست نحوی اینجکت کردن DLL رو به پروسهی دیگه رو گفتم
اینجا هم روش hook کردن Import address table رو توضیح می دم
نگته: مشکلات غلط ها و... رو با پیام خصوصی بگید

------------------------------
پیش نیازها:

hooking: به زبان ساده مجموعه تکنیک هایی هستش برای تغییر سیستم عامل یا برنامه
به روش گوش کردن به فراخوانی یه تابع ، ارسال پیام و رخداد قبل رسیدن به هدف
، و به قطعه کدی که این intercepting رو هندل می کنه hook می گن

IAT: یه جدولی هستش برای نگه داری ادرس توابه ای که از ماژول های دیگه import شده ( static linkingها فقط و توسط لودر در زمان لود پر می شه)

روش: تغییر IAT ، نوشتن ادس توابع مورد نظر در جدول به جای تابع اولیه

هدف: به جای اینکه تابع اصلی اجرا بشه تابع ما اجرا می شه

ببینید وقتی می خواد تابعی از یه dll دیگه اجرا بشه کد زیر رو در نظر بگیرید


call xبه فرض اگه این تابع 100 بار invoke بشه به جای اینکه توی 100 نقطه ادرس جدید رو به دلیل Relocations(زمانی که dll تو بیس ادرس خودش لود نشده) تغییر بدیم یه بار توی IAT تغییر می دیم و همهی ان call ها به جدول وابسته می شه


کد زیر رو به روش dll انجکشن وارد یه پروسه ای بکنید که تابع MessageBox رو call میکنه


توضیح کد ها رو به صورت کامنت به انگلیسی نوشتم



#define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr)+(DWORD)(addValue))
bool HOOKED = false;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{

case DLL_PROCESS_ATTACH:
{

if(!HOOKED)
{


//Declarations
HMODULE hd;
PIMAGE_DOS_HEADER dosHeader;
PIMAGE_NT_HEADERS ntheader;
PIMAGE_IMPORT_DESCRIPTOR ImportDesc;
PIMAGE_THUNK_DATA pThunk;
PSTR ModuleName = "USER32.dll"; // Module to intercept calls to
PSTR FunctionName = "MessageBoxA"; // function name
DWORD OrginalFunction;

//Get the Base Address of the Injected Process
hd = GetModuleHandleA(NULL);
//Get the Function Address
OrginalFunction = (DWORD)GetProcAddress( GetModuleHandleA("user32.dll"),"MessageBoxA");
//MessageBoxW(NULL,(OrginalFunctionL),L"Sorry",MB_OK);
//Cast the Base Address to to Dos Header
dosHeader = (PIMAGE_DOS_HEADER)hd;

//Verify if it is a Valid Dos Signature
if ( dosHeader->e_magic == IMAGE_DOS_SIGNATURE)
{
//Get to the Nt NtHeader
ntheader = MakePtr(PIMAGE_NT_HEADERS, dosHeader, dosHeader->e_lfanew);
//Verify if it is valid NT Signature of "PE"
if ( ntheader->Signature != IMAGE_NT_SIGNATURE )
{

return 0;
}
else
{
//Get to Import Descriptor Structure
ImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, dosHeader,ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
//Verifying if there are any imoports
if ( ImportDesc == (PIMAGE_IMPORT_DESCRIPTOR)ntheader)
{

return 0;
}
else
{
//Iterate Through to find the and find the right Structure
while (ImportDesc->Name)
{
PSTR pszModName = MakePtr(PSTR, dosHeader, ImportDesc->Name);
if (pszModName == pszModName)
{

break;

}


ImportDesC++‎‎‎‎;

}
//Reach the IAT and Iterate through it find the desired function
pThunk = MakePtr(PIMAGE_THUNK_DATA, dosHeader, ImportDesc->FirstThunk);

while (pThunk->u1.Function)
{
if(pThunk->u1.Function == OrginalFunction)
{
//Change The IAT address with our function Address
pThunk->u1.Function = (DWORD)NewMessageBoxA ;

}
pThunk++;
}


}

}
HOOKED = true;

return 1;
}


}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
}
ادامه کد : تابع ای که قراره بجای MessageBox اصلی اجرا بشه



void __stdcall NewMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
int retval;
//Capture the Argument Sent to API
//printf("Value Sent To MessageBox Function is : %s", lpText);
//As we r not returning any information there will be no call to the actual fuction call
printf("The Value Sent to Message Box was :%d",lpText);
return;
}


حالا به جای messaebox این تابع اجرا می شه

منبع: google و books

(شاید اگه کتاب هایی رو که دارم می خونم تموم شد بیشتر در مورد ساختار PE , کار loader نوشتم)


read more:
Rootkits: Subverting the Windows Kernel , linkers and loaders , windows via c/C++‎‎‎‎‎

گام های بعدی :

windows message hooking ,inline hooking ,SSDT hooking

r00tkit
یک شنبه 11 مهر 1389, 16:44 عصر
منابع بیشتر در مورد PE

Microsoft Portable Executable Specification (http://kishorekumar.net/pecoff_v8.1.htm)

The Portable Executable File Format (http://www.csn.ul.ie/%7Ecaolan/publink/winresdump/winresdump/doc/pefile.html)

مقاله های اقای
Matt Pietrek
http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
http://msdn.microsoft.com/en-us/magazine/cc301805.aspx