您的位置:首页 > 其它

IAT_HOOK

2013-05-25 23:54 197 查看
使用IAT HOOK 截获MessageBox函数

步骤如下

1..写一个自己的MessageBox 函数 注意调用约定为 __stdcall、、

2..定义一MessageBox函数指针如下

typedef int (__stdcall *pOldMBox)(HWNDhWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType);

3..遍历本进程的导入表寻找MessageBox的地址、、

4..修改MessageBox 所在THUNK的地址 为自己写的函数地址

#include <windows.h>

HANDLE pBegin = GetModuleHandle(NULL);

PBYTE pBegin2 = (PBYTE)pBegin;

PIMAGE_DOS_HEADER DOS = PIMAGE_DOS_HEADER(pBegin2);

PIMAGE_NT_HEADERS NT = PIMAGE_NT_HEADERS(pBegin2+DOS->e_lfanew);

PIMAGE_OPTIONAL_HEADER OPTION = &(NT->OptionalHeader);

PIMAGE_IMPORT_DESCRIPTOR IMPORT = PIMAGE_IMPORT_DESCRIPTOR(OPTION->DataDirectory[1].VirtualAddress + pBegin2);

typedef int (__stdcall *pOldMBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType);

pOldMBox pMBox = NULL;

int __stdcall HookMBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)

{

if (NULL == pMBox)

{

return MessageBox(hWnd,lpText,lpCaption,uType);

}

else

{

return pMBox(NULL,"哈哈! IAT HOOK到了","HOOK",MB_OK);

}

}

int ReAPI(const char* DllName, const char* FunName)

{

/************************** 找相同的DLL ****************************/

while (IMPORT->Name)

{

char* OurDllName = (char*)(IMPORT->Name + pBegin2);

if (0 == strcmpi(DllName , OurDllName))

{

break;

}

IMPORT++;

}

/****************************************************************************/

/************************* 找相同的API 函数 ****************************/

PIMAGE_IMPORT_BY_NAME pImportByName = NULL;

PIMAGE_THUNK_DATA pOriginalThunk = NULL;

PIMAGE_THUNK_DATA pFirstThunk = NULL;

pOriginalThunk = (PIMAGE_THUNK_DATA)(IMPORT->OriginalFirstThunk + pBegin2);

pFirstThunk = (PIMAGE_THUNK_DATA)(IMPORT->FirstThunk + pBegin2);

while (pOriginalThunk->u1.Function) //记住是 Function

{

DWORD u1 = pOriginalThunk->u1.Ordinal; //记住是 Ordinal

if ((u1 & IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG) // 说明MSB不是1 不是以序号导入

{

pImportByName = (PIMAGE_IMPORT_BY_NAME)((DWORD)pOriginalThunk->u1.AddressOfData + pBegin2);

char* OurFunName = (char*)(pImportByName->Name); // 下边的计算也可以

//char* OurFunName2 = (char*)((DWORD)pOriginalThunk->u1.AddressOfData + pBegin2 + 2);

if (0 == strcmpi(FunName,OurFunName))

{

//获取以 pFirstThunk 开始的内存的 信息 并将其保存到 MEMORY_BASIC_INFORMATION 结构中

MEMORY_BASIC_INFORMATION mbi_thunk;

VirtualQuery(pFirstThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));

//VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);

//修改以pFirstThunk 开始的内存的的保护属性为 PAGE_READWRITE 并将原保护属性保存到&dwOLD中

DWORD dwOLD;

VirtualProtect(pFirstThunk,sizeof(DWORD),PAGE_READWRITE,&dwOLD);

//更改 真正MessageBoxA的地址 为自己写的HookMBox函数的地址、、

//将真正的地址付给 先前定义的函数指针

//结果正确的话就是 当本程序调用messagebox的时候 程序转去执行 咱的HookMBox函数

//并且在咱的HookMBox函数中 咱还调用了 真正的messagebox函数、、

pMBox =(pOldMBox)(pFirstThunk->u1.Function);

pFirstThunk->u1.Function = (PDWORD)HookMBox;

//::WriteProcessMemory(NULL,pFirstThunk->u1.Function,HookMBox, sizeof(DWORD), NULL);

//恢复 之前更改的内存的 保护属性 为 人家自己的、、

VirtualProtect(pFirstThunk,sizeof(DWORD),dwOLD,0);

break;

}

}

pOriginalThunk++;

pFirstThunk++;

}

/****************************************************************************/

return 0;

}

int main()

{

ReAPI("User32.dll","MessageBoxA");

MessageBox(NULL,"没有HOOK到","HOOK",MB_OK);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: