C++ IP包问题

来源:百度知道 编辑:UC知道 时间:2024/05/10 08:24:56
程序发送出去的数据包中有本机的IP头,我怎么才能把这个IP头改成别的IP?这个需要涉及到些什么,我想这个不是WINSCOKET编程可以办到的吧!

用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
//-----------------