关于HOOK WINAPI函数

有时候要研究游戏封包或者需要对其进行修改,则最好的方法是HOOK他的网络API函数,如用于发送封包的send函数和

</pre>用于接受的recv,WSARecv函数等等。<p></p><p></p><p>将HOOK代码写到DLL中,然后通过修改游戏运行程序的输入表去加载这个dll从而达到劫持API的作用!</p><p>修改PE文件的输入表方法:最简单的就是试用PE工具LordPE了,打开程序,选择目录,点击输入表,然后右键增加输入表,输入DLL名称跟导入函数,保存即可</p><p></p><p>HOOK API原理</p><p>首先找到API的地址,然后将其前8个字节保存起来用于以后的恢复此API函数功能,修改前8个字节跳转到我们自己的处理函数上,</p><p>在自己的处理函数上对其进行修改,然后恢复前8个字节,调用API来完成API功能,最后将前8个字节又修改成跳转到自己处理函数的代码,以便下次的hook</p><p></p><p></p><p>代码如下:</p><p></p><pre name="code" class="cpp">#include <Windows.h>
#include <winsock2.h>

#pragma   comment(lib,  "ws2_32.lib")

typedef int (WINAPI *PFnSEND)(SOCKET s,const char FAR* buf,int len,int flags);

//B8 00 00 00 00 即mov eax, 0
//FF 0E 即jmp eax
BYTE btNewBytes[8] = {0x0B8,0x0,0x0,0x00,0x0,0x0FF,0x0E0,0};
BYTE btOldBytes[8];
DWORD pSend,dwSize;

//函数声明
//自己写的函数 __stdcall这个细节要注意
void SetHook();
void UnHook();
int __stdcall MySend(SOCKET s,const char FAR* buf,int len,int flags);


BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
	switch (dwReason)
	{
	case DLL_PROCESS_ATTACH:
		SetHook();
		break;
	case DLL_PROCESS_DETACH:
		UnHook();
		break;
	}
	return true;
}

//自己的处理函数,可以自行添加处理代码,如修改封包,保存封包,添加封包等等
int __stdcall MySend(SOCKET s,const char FAR* buf,int len,int flags)
{
	int iResult = 0;
	WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btOldBytes,8,&dwSize);		
	iResult = ((PFnSEND)pSend)(s,buf,len,flags);
	WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btNewBytes,8,&dwSize);
	return iResult;	
}

//第一次的hook
void SetHook()
{
	pSend = (DWORD)GetProcAddress(GetModuleHandle("ws2_32.dll"),"send");
	if(VirtualProtect((LPVOID)pSend,8,PAGE_EXECUTE_READWRITE,&dwFlag))
	{
		ReadProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btOldBytes,8,&dwSize);
		*(DWORD*)(btNewBytes+1) = (DWORD)MySend;
		WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btNewBytes,8,&dwSize);		
		VirtualProtect((LPVOID)pSend,8,dwFlag,&dwFlag);
	}	

}

//还原
void UnHook()
{
	WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btOldBytes,8,&dwSize);
}

同时应编写dll有输出表

工程项目中添加*.def文件

输入

LIBRARY
EXPORTS
SetHook

增加SetHook函数作为dll的输出函数。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值