31.第二阶段x64游戏实战-封包-线程发包
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
上一个内容:30.第二阶段x64游戏实战-认识网络数据包发送流程
代码跳转
ws2_32.send跳转send函数
ws2_32.sendto跳转sendto函数
ws2_32.WSASend跳转WSASend函数
注意跳转是区分大小写的,直接复制上面的就可以,其中ws2_32表示ws2_32模块,ws2_32.send表示ws2_32模块里的send函数
当前游戏用的是send函数发送的网络数据包,如下图在代码窗口按CTRL+G,然后输入 ws2_32.send然后点确定,它就跳转到了send函数里
send函数说明
搜索关键字
![]()
说明
![]()
第一个参数是套接字,套接字是网络连接的桥梁,就是我们的电脑和游戏公司的服务器只要有了套接字就可以互相访问了
第二个参数是发送的数据,也就是发送的网络数据包
第三个参数是发送的数据的长度
第四个参数是标志位,我们用不到,后面涉及到了会写说明(不要钻牛角尖,它不重要,不需要知道)
然后x64软件传参是用寄存器传参
rcx(第一个参数)套接字 rdx(第二个参数)数据包 r8(第三个参数)数据包长度 r9(第四个参数)标志位
这里要注意一件事,就是玩着玩着游戏,突然闪退了,然后不重新登录,过一段时间我们的角色就退出了,还有闪退之后重新登录的时候会提示角色以上线是否退出角色重新登录这种话语,然后多等一会重新登录就不会提示角色以上线这种话语,这个原因是,游戏会每个几秒会给服务器发送一个数据包用来告诉服务器角色还在线,当服务器一段时间收不到这个数据包就会给我角色下线,比如提示超时、网络连接错误等提示,写这么多想表达的是,我们在发送网络包函数上设置断点,会出现我们没有操作游戏(没有操作触发发送数据包的功能,比如打开设置窗口、背包、打开地图窗口)它也会在发送网络数据包的函数上断下来,所以要有一个感觉,就是要确保发送网络数据包的函数是我们触发的,比如发送聊天数据、移动、释放技能等,为了避免找半天找的不对,这个感觉很重要。
开始断点调试,设置断点
然后这个游戏它有一个防御,有一个概念,Windows系统打开多个窗口,它只会有一个活动窗口,活动窗口的意思现在打开了a窗口和b窗口,鼠标左键单击a窗口,活动窗口就是a窗口,鼠标左键单击b窗口,活动窗口就是b窗口,鼠标左键单机窗口时会有一个激活(Windows中叫得到焦点)操作,只要鼠标左键单击了窗口它就会有激活这个动作,没办法关,所有窗口都有,这个游戏当窗口激活时会发送一个网络数据包(这种称为心跳),来扰乱我们,所以接下来就是想办法跳过激活窗口发送的网络数据包。
下面开始,上方写了send函数的介绍,rdx是第二个参数,第二个参数是发送的网络数据包,如下图选择转到内存窗口,r8是第三个参数,第三个参数是数据包的长度0xE
然后它的数据是80555,然后按F9让代码运行起来,然后再次点击游戏窗口触发断点,它还是80555,并且数据包的长度也没有变化一直是0xE,也就是说激活窗口发送的数据包是固定的,是固定的就可以使用条件断点了
鼠标右击选择设置条件断点
然后输入r8!=0xE,设置完之后,激活窗口的数据包就不会断下来的,再自动断下来的就是游戏内部的数据包了,比如心跳
如下图是通过发送聊天数据触发的断点
然后点击调用堆栈,下图是发送聊天数据的调用堆栈
下图是通过走路发送的数据包
它的堆栈,可以发现一个事情,走路的调用堆栈和发送聊天数据的调用堆栈是一模一样的,这就很奇怪两个不同的功能一个是发送聊天数据,一个是走路,调用的函数却一模一样
一模一样的原因是,这个游戏发送数据包操作用最少三个线程支持,如下图加密完的数据包,写到一个内存空间里就完事了,然后发送数据包也就是send函数,它会不断的读取存放数据包的内存空间,里面只要有数据它就发送网络数据包,然后上面的断点是在send函数,所以移动和发送聊天数据调用的函数(调用堆栈)一模一样,这种情况就被称为线程发包
然后怎么追加密数据包的位置?发送网络数据包的内存地址是不变的,所以对这个内存地址设置硬件写入断点,就可以找到加密的位置了,这里注意硬件断点,不能设置条件,所以硬件断点会是激活窗口触发的(这个没事,下一节就会写怎么办)
然后就来到了下图位置
然后如下图,可以看到它写入的是word是2字节,所以这里多半是复制数据的函数(就是把存放数据包的内存里的数据写到发送数据包函数里或者说线程里)
然后删除断点
然后按CTRL+F9,再按F8,可以看到确实是在复制函数里memmove
memmove函数说明,将一个缓冲区移动到另一个缓冲区,这意思就是剪切操作(复制完删除)