Bootstrap

26.x86游戏实战-寻找公共call

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:25.x86游戏实战-理解发包流程

首先打开OD并附加到游戏

现在附加的游戏使用的是send函数发送的数据包,上一个内容里有四个函数分别是wspsend、send、sendto、wsasend,怎么就确定游戏使用的是send函数发送的数据包?在wspsend、send、sendto、wsasend这四个函数上使用OD都打上断点,然后在游戏中做一个可以出发发送数据包的操作,看看在哪个函数里断下来,然后就能确定游戏使用的是wspsend、send、sendto、wsasend哪一个了。

然后send、sendto、wsasend这三个都在ws2_32.dll里(ws2_32模块里),怎么就知道send、sendto、wsasend这三个都在ws2_32.dll里了?打开Visual Studio 2022写上它们三任意一个,写完鼠标单击然后按f1就会跳转到函数的说明里,在函数说明的最后面有些它们在什么模块中,下图是sendto函数的说明send、wsasend也是这样看,然后wspsend后面再说

开始找公共call,首先鼠标单击代码区,然后按ctrl+g,然后输入ws2_32.send然后点ok让OD跳转到send函数里

然后OD第一次使用ctrl+g跳转可能会跳转的不对,这是OD的问题

然后再操作一个ctrl+g就会正确了,如下图

然后打断点之后,游戏里什么都不操作它自己就会断下来,这种原因是游戏会有心跳包,心跳包用来确认玩家是否在线(还可以用来检测游戏代码执行时间)

所以要在心跳包之前,手动触发一个发送数据的操作,或者通过如下图的条件断点来过滤心跳包,比如通过数据包的长度来过滤,条件断点的使用后面用到的时候再说,这里先采用在心跳包之前手动触发发送数据的操作

然后打断点快速切到游戏,然后触发发送数据包的操作,下图是使用走路来触发发送数据包的操作

然后断下来之后,如下图把断点取消

然后按ctrl+f9,来到了上一层,然后双击下图红框位置写一个注释说明

然后再按ctrl+f9,然后再写一个注释说明

最终反了10次之后,游戏卡主了,没反应了

然后游戏的线程都是暂停状态了

这里右击选择Resume All Threads把线程启动起来

然后再回到send函数里,然后使用发送聊天数据触发发送数据包的操作,点击下图红框里的C回到代码区

然后回到send函数里,这里由于断点卡主的时间太长导致游戏很卡,重新启动了一次游戏,所以下方的地址与上方的会有所差异,这里有一个东西重启游戏之后可能会发现OD无法调试游戏了,无法调试的现象是只要一触发断点OD会卡死,这时需要重启电脑,如果重启电脑不管用,就把下图红框UDD文件夹里的文件全部删除(不要把UDD文件夹删了,是把UDD文件夹里的东西全删了)然后再重启电脑,这样就可以再调试游戏了

然后在输入框写了一堆很长的文字

然后在send函数上打断点,打了断点要手速快点,不然会被心跳卡主,然后发现它还是会走10次,然后没法ctrl+f9了,然后在第10层往上滑可以看到下图红框的函数DispatchMessageA

然后DispatchMessageA函数是给一个窗口发送消息的,我们不是走路吗?不是发送聊天数据吗?不应该会ctrl+f9到走路或发送聊天数据的函数里吗?怎么最后一次ctrl+f9还给窗口发上消息了?现在可以宣布找公共call失败了

然后再次使用走路断在send函数上

然后点下图红框里的K,就可以看调用栈了,调用栈里的是到当前断点函数的过程,也就是调用栈里显示的是从哪调用到ws2_32.send函数里的,如下图,调用栈里的过程很少,但是一个走路操作应该是很庞大的才对,它为什么很少?少的原因是这个游戏采用的是上一个内容中最后说的封包函数和线程发送数据包函数,这个游戏就采用了封包函数和线程发送数据包函数方式,所以在send函数打断点看到的调用栈很少,下一章会演示这种情况该怎么办

上方是找公共call的过程,接下来写一下send函数的参数

send函数一共有4个参数,主要关注下图红框的两个参数,一个是要发送的数据,一个发送的数据的长度

上图网址:https://learn.microsoft.com/zh-cn/windows/win32/api/winsock2/nf-winsock2-send

如何找send函数或其它函数的说明,上方说通过f1来找,还有一种方式通过百度或必应搜索 send msdn 这个关键字也能找到,但是会搜出一些没用的地址,需要要会辨别,辨别方式如下图,只要有下图红框的结构或字母那就是正确的,如果不是就是假的,下图可能会被屏蔽,如果屏蔽了没法教辨别了,只能通过f1了

让现在知道send函数的参数了,然后现在断点一下看看游戏中给send函数传的什么,再次在聊天框里写一段文字,如下图

然后在ws2_32.send函数上打断点,然后断下来

然后如下图,在内存窗口跳转到数据的地址

然后会发现这个游戏的数据包是明文发送的,没有加密操作,1的unicode编码是0x31,2的unicode编码是0x32。。。想知道编码对应的什么,可以百度unicode编码对应表(现在其实不需要知道那么多)

然后还可以看到数据包里还有一些我们现在不认识的东西,如下图红框,这些东西里可能就会有时间、当前是什么操作等这些信息,这里先不用管,后面会专门搞它们


;