文科工具 天文地理 电脑学习 外语学习 教育管理 其它行业 交通运输 工程建筑 CAD软件 商业贸易 加密工具 系统安全 病毒防治 视频处理 音频处理 3D制作 图像制作 网络电话 QQ专区 手机软件 手机软件 文档管理 杂类工具 转换翻译 图像处理 媒体播放 汉字输入 网络电视 磁盘工具 桌面工具 系统增强 下载工具 网页辅助 浏览辅助 主页浏览
新闻资讯 动漫漫画 视频影音 常用工具 金融理财 生活服务 社交聊天 导航出行 拍照摄影 小说阅读 教育学习 商务办公 主题美化 手机购物 母婴育儿 运动健身 健康医疗
回合网游 即时网游 音乐游戏 儿童教育 恋爱养成 益智休闲 角色扮演 飞行射击 冒险解谜 策略塔防 模拟经营 动作游戏 体育竞技 卡牌游戏 赛车竞速 其他游戏
医疗 图形与设计 商务 参考 社交 图书 音乐 财务 导航 旅游 照片与视频 工具 生活 效率 购物 体育 健康健美 娱乐 教育
逆战未来 无限暖暖 黑神话悟空 鸣潮 金铲铲之战手游 摩尔庄园手游 光遇手游 天谕 使命召唤手游 原神 csgo 剑与远征 天涯明月刀手游 地下城与勇士 英雄联盟手游 魔兽世界正式服 阴阳师 lol云顶之弈 炉石传说 王者荣耀 外服英雄联盟 和平精英

游戏封包截取工具是一款非常好用的游戏工具,功能强大,使用方便,有需要的朋友不要错过了,还等什么,快约上你的小伙伴,一起来下载使用!
对游戏数据包进行抓取截图,有序要的朋友可以看看。截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。
首先
我们必须设法把自己的代码放到目标程序的进程空间里去。Windows Hook可以帮我们实现这一点。SetWindowsHookex的声明如下:
HHOOK SetWindowsHookEx(
int idHook, / hook type
HOOKPROC lpfn, / hook procedure
HINSTANCE hMod, / handle to application instance
DWORD dwThreadId / thread identifier
);
具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。
这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。hook Type我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。
之后,我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。这是最关键的部分。这里我想截三个调用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA。
DWORD dwCurrentPID = 0;
HHOOK hOldHook = NULL;
DWORD pSend = 0;
DWORD pRecv = 0;
GETMESSAGE pGetMessage = NULL;
BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };
DWORD dwOldBytes[3][2];
HANDLE hDebug = INVALID_HANDLE_value;
LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
{
DWORD dwSize;
DWORD dwPIDWatched;
HMODULE hLib;
if( dwCurrentPID == 0 )
{
dwCurrentPID = GetcurrentProcessId();
HWND hwndMainHook;
hwndMainHook = ::FindWindow( 0, "MainHook" );
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
if( dwCurrentPID == dwPIDWatched )
{
hLib = LoadLibrary( "ws2_32.dll" );
pSend = (DWORD)GetProcAddress( hLib, "send" );
pRecv = (DWORD)GetProcAddress( hLib, "recv" );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)dwOldBytes[0], sizeof(DWORD)*2, dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_send;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)btNewBytes, sizeof(DWORD)*2, dwSize );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, dwSize );
hLib = LoadLibrary( "user32.dll" );
pGetMessage = (GETMESSAGE)GetProcAddress( hLib, "GetMessageA" );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, dwSize );
hDebug = ::CreateFile( "C:Trace.log", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
if( hOldHook != NULL )
return CallNextHookEx( hOldHook, nCode, wParam, lParam );
return 0;
上面的钩子函数,只有第一次运行时有用,就是把三个函数的首8字节修改一下(实际上只需要7个)。btNewBytes中的指令实际就是
mov eax, 0x400000
jmp eax
这里的0x400000就是新的函数的地址,比如new_recv/new_send/new_GetMessage,此时,偷梁换柱已经完成。再看看我们的函数中都干了些什么。以GetMessageA为例:
BOOL _stdcall new_GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax )
DWORD dwSize;
char szTemp[256];
BOOL r = false;
/Watch here before it's executed.
sprintf( szTemp, "Before GetMessage : HWND 0x%8.8X, msgMin 0x%8.8X, msgMax 0x%8.8x ", hWnd, wMsgFilterMin, wMsgFilterMax );
::WriteFile( hDebug, szTemp, strlen(szTemp), dwSize, 0 );
/Watch over
/ restore it at first
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, dwSize );
/ execute it
r = pGetMessage( lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax );
/ hook it again
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, dwSize );
/Watch here after it's executed
sprintf( szTemp, "Result of GetMessage is %d.", r );
::WriteFile( hDebug, szTemp, strlen( szTemp ), dwSize, 0 );
if( r )
{
sprintf( szTemp, "Msg : HWND 0x%8.8X, MSG 0x%8.8x, wParam 0x%8.8X, lParam 0x%8.8XTime 0x%8.8X, X %d, Y %d",
lpMsg-hwnd, lpMsg-message,
lpMsg-wParam, lpMsg-lParam, lpMsg-time,
lpMsg-pt.x, lpMsg-pt.y );
::WriteFile( hDebug, szTemp, strlen( szTemp ), dwSize, 0 );
}
strcpy( szTemp, "" );
::WriteFile( hDebug, szTemp, strlen( szTemp ), dwSize, 0 );
/Watch over
return r;
先将截获下来的参数,写入到一个log文件中,以便分析。然后恢复原先保留下来的GetMessageA的首8字节,然后执行真正的GetMessageA调用,完毕后再将执行结果也写入log文件,然后将GetMessageA的执行结果返回给调用者。
整个截获的过程就是这样。你可以把其中的写log部分改成你自己想要的操作。这里有个不足的地方是,截获动作是不能够并发进行的,如果目标进程是多线程的,就会有问题。解决办法是,可以在每次new_GetMessage中加入一个CriticalSection的锁和解锁,以使调用变为串行进行,但这个我没有试验过。
网络游戏的封包技术是大多数编程爱好者都比较关注的关注的问题之一,在这一篇里就让我们一起研究一下这一个问题吧。
别看这是封包这一问题,但是涉及的技术范围很广范,实现的方式也很多(比如说APIHOOK,VXD,Winsock2都可以实现),在这里我们不可能每种技术和方法都涉及,所以我在这里以Winsock2技术作详细讲解,就算作抛砖引玉。
由于大多数读者对封包类编程不是很了解,我在这里就简单介绍一下相关知识:
APIHooK:
由于Windows的把内核提供的功能都封装到API里面,所以大家要实现功能就必须通过API,换句话说就是我们要想捕获数据封包,就必须先要得知道并且捕获这个API,从API里面得到封包信息。
VXD:
直接通过控制VXD驱动程序来实现封包信息的捕获,不过VXD只能用于win9X。
winsock2:
winsock是Windows网络编程接口,winsock工作在应用层,它提供与底层传输协议无关的高层数据传输编程接口,winsock2是winsock2.0提供的服务提供者接口,但只能在win2000下用。
好了,我们开始进入winsock2封包式编程吧。
在封包编程里面我准备分两个步骤对大家进行讲解:1、封包的捕获,2、封包的发送。
首先我们要实现的是封包的捕获:
Delphi的封装的winsock是1.0版的,很自然winsock2就用不成。如果要使用winsock2我们要对winsock2在Delphi里面做一个接口,才可以使用winsock2。
1、如何做winsock2的接口?
1)我们要先定义winsock2.0所用得到的类型,在这里我们以WSA_DATA类型做示范,大家可以举一仿三的来实现winsock2其他类型的封装。
我们要知道WSA_DATA类型会被用于WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer;,大家会发现WSData是引用参数,在传入参数时传的是变量的地址,所以我们对WSA_DATA做以下封装:
const
WSADESCRIPTION_LEN = 256;
WSASYS_STATUS_LEN = 128;
type
PWSA_DATA = ^TWSA_DATA;
WSA_DATA = record
wVersion: Word;
wHighVersion: Word;
szDescription: array[0..WSADESCRIPTION_LEN] of Char;
Update Scanner火狐监测跟踪网站更新软件下载v3.2.3 最新版
438KB浏览辅助
下载
小鹤双拼输入法下载v8.1.17.0930 最新版
4.84M汉字输入
下载
Microsoft Office 2013简体中文版下载32&64位 免费完整版
818.00M文档管理
下载
宏达车辆管理系统下载v7.0 最新高级版
6.87M交通运输
下载
saveaspdfandxps.exe转换工具下载v12.0.4158 安装版
607KB转换翻译
下载
智狐云影视vip播放器下载v1.5 免费版
94.86M媒体播放
下载
USBlyzer(usb协议分析软件 )下载v2.2 最新版
4.51M磁盘工具
下载
AE极品粒子插件(Trapcode Particular)下载v2.5 中英双语版
14.00M3D制作
下载
37wan琅琊榜登陆器下载v2.3.0.0 官方最新版
游戏工具 / 145M / 2026-02-28下载
龙珠超宇宙MOD导入工具下载v1.0 绿色版
游戏工具 / 106M / 2026-03-18下载
棋天大圣(象棋游戏)下载5.1 专业绿色版
游戏工具 / 86M / 2026-03-10下载
飞智手柄映射激活工具(安卓手机+安卓模拟器)下载v4.0.0 官方最新版
游戏工具 / 166M / 2026-02-27下载
常德跑胡子单机版下载99版
游戏工具 / 58M / 2026-03-12下载
游戏超人软件电脑版下载v1.6.0 官方版
游戏工具 / 52M / 2026-03-10下载
华硕armoury crate电脑版下载v3.0.9.0 最新版
游戏工具 / 154M / 2026-03-15下载
dnf npc好感度查询器下载v1.0 绿色版
游戏工具 / 58M / 2026-03-18下载