有时候要研究游戏封包或者需要对其进行修改,则最好的方法是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的输出函数。