IAT Hook示例

#include "stdafx.h"
//在这个文件中实现IATHook

//这个函数,只Hook exe文件的IAT

typedef int (WINAPI  *MESSAGEBOXW)(
	_In_opt_ HWND hWnd,
	_In_opt_ LPCWSTR lpText,
	_In_opt_ LPCWSTR lpCaption,
	_In_ UINT uType);
MESSAGEBOXW g_MessageBox;



int WINAPI MyMessageBox(
	_In_opt_ HWND hWnd, 
	_In_opt_ LPCWSTR lpText,
	_In_opt_ LPCWSTR lpCaption,
	_In_ UINT uType)
{
	lpText = L"IATHook成功";
	lpCaption = L"哈哈";
	return g_MessageBox(hWnd, lpText, lpCaption, 0);
}



//************************************
// 函数名: OnIATHook
// 说明  :进行IATHook,只能Hook exe部分
// 参数1:要Hook的Dll名字
// 参数2:要Hook的函数名字
// 返回值:   bool 成功的返回true,失败的话返回false
//************************************

bool OnIATHook(char  * szDllName,char * szFunName,DWORD NewFunAddress,DWORD *OldFunAddress)
{
	OutputDebugStringA("开始进行IAThook");
	// 1找到exe的加载基址
	PBYTE pBuf = (PBYTE)GetModuleHandle(NULL);
	//2 找到导入表
	PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pBuf;
	PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)(pDos->e_lfanew + pBuf);
	PIMAGE_DATA_DIRECTORY pImportDir = 
		(pNt->OptionalHeader.DataDirectory + 1);
	PIMAGE_IMPORT_DESCRIPTOR pImport =
		(PIMAGE_IMPORT_DESCRIPTOR)(pImportDir->VirtualAddress + pBuf);
	//3 遍历导入表,找到对应的dll
	while (pImport->Name != NULL)
	{
		//dll的名字
		char * szImportDllName = (char*)(pImport->Name + pBuf);
		OutputDebugStringA(szImportDllName);
		if (_stricmp(szImportDllName, szDllName) == 0)//不管大小写比较
		{	
			OutputDebugStringA("开始寻找函数名");
			//找到这个dll了
			//4 在对应dll的导入名称表中,找到我们要Hook的函数,得到位置
			//  先检测一下是单桥结构的导入表还是双桥结构的导入表
			//  本方法不适用于单桥结构的IATHook。
			if (pImport->OriginalFirstThunk == 0)
			{
				return false;
			}
			PIMAGE_THUNK_DATA pInt = (PIMAGE_THUNK_DATA)
				(pImport->OriginalFirstThunk + pBuf);
			PDWORD pIat = 
				(PDWORD)(pImport->FirstThunk + pBuf);
			int nLoc = 0;
			while (pInt->u1.Function!=NULL)
			{
				
				if ((pInt->u1.Ordinal & 0x80000000) != 1)
				{
					OutputDebugStringA("hehe");
					PIMAGE_IMPORT_BY_NAME pName =
						(PIMAGE_IMPORT_BY_NAME)(pInt->u1.AddressOfData + pBuf);
					//5 在对应dll的导入地址表中,进行Hook
					OutputDebugStringA("输出名称之前");
					OutputDebugStringA(pName->Name);
					if (_stricmp(pName->Name, szFunName) == 0)
					{
						DWORD OldProtect = 0;
						//*OldFunAddress = pIat[nLoc];
						OutputDebugStringA("开始修改");
					VirtualProtect(&pIat[nLoc], 4, PAGE_READWRITE, &OldProtect);
						pIat[nLoc] = NewFunAddress;
						VirtualProtect(&pIat[nLoc], 4, OldProtect, &OldProtect);
						OutputDebugStringA("修改完毕");
						return true;
					}
				}
				nLoc++;
				pInt++;
			}
			break;
		}
		pImport++;
	}
	return false;
}


//HMODULE g_hModule = 0;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		OutputDebugStringA("Hook成功");
		//g_hModule = hModule;
		OnIATHook(
			"user32.dll",
			"MessageBoxW",
			(DWORD)MyMessageBox, 
			(DWORD*)&g_MessageBox
			);
		break;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值