C++ IP包问题
来源:百度知道 编辑:UC知道 时间:2024/05/10 08:24:56
用HOOK做,HOOK API函数,SOCKET函数里面的send和sendto2个函数,前者是TCP协议的发送函数,后者是UDP协议的发送函数,将这2个函数的入口地址,替换成自己的函数入口地址(例如MySend,MySendTo),这样所有你要发送的消息在调用send或者sendto的时候都不进入原来的函数,而去执行你的MySend等替换函数了.在你自己的函数中,你可以做你想要的修改.
VS对战平台和浩方对战平台就是基于此原理,HOOK send函数,将原来的IPX协议包修改成TCP/UDP协议包.发送出去,对方收到数据包之后再还原成IPX协议包,然后由游戏处理.
以下代码转自网络:
#include <Winsock2.h>
#include <stdio.h>
#pragma argsused
//自定义APIHOOK结构
typedef struct
{
FARPROC funcaddr;
BYTE olddata[5];
BYTE newdata[5];
}HOOKSTRUCT;
HHOOK g_hHook;
HINSTANCE g_hinstDll;
HMODULE hModule ;
HANDLE g_hForm; //接收信息窗口句柄
DWORD dwIdOld, dwIdNew;
//------------------------------------------------------------------------
// 由于要截获两个库里面的函数,所以每个函数定义了两个HOOK结构
// 在编程过程中因为没有考虑到这个问题,导致很多包没有截获到,
// 后来想到了冰哥在模仿SOCKCAP的程序中每个函数截了两次才明白
// 一个是wsock32.dll, 一个是ws2_32.dll
//-----------------