开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1911|回复: 5
收起左侧

[图文资料] 解决bp 请求定位游戏call的困难-----游戏线程发包

[复制链接]
发表于 2020-5-31 17:45:30 | 显示全部楼层 |阅读模式   湖南省长沙市


解决bp 请求定位游戏call的困难-----游戏线程发包

扯淡原理:

又是一个风和日丽的早晨,又对一款游戏产生了念想,又是熟悉的传统手艺——断点发包函数定位功能Call。



图片1.png

奇怪的是无论怎么Ctrl+F9 都返回不到功能call, 点击OD快捷栏 K 按钮 查看堆栈调用关系,才惊讶的发现 无论做什么动作断下,调用关系都是一样的,也就是说游戏中任何动作都是走的一样的函数一样的代码?



图片2.png

图片3.png

当然不可能的,不同的动作不同的功能,怎么会是同样的代码产生的呢!在断点发包函数的时候,遇到这种现象 只能说明厂商对发送请求进行了特殊的处理。就像小说里面的鬼打墙,让我们一直在同样的代码里面打转转。

不过这种手段远没有鬼打墙那么邪乎,它只不过是把发送请求的责任交给了一个子线程——俗称线程发包。



图片4.png

理论如图:



图片5.png

上图就是线程发包最简单明了的情况了,厂商把游戏的功能代码和发包代码放在了不同的线程里面。通过一个一个不变的地址或者结构互相联系。


子线程发包,这个线程里面恐怕是一个死循环,一直在查看全局变量里面是否有游戏主线程写入的请求内容,如果有那就发送出去。


现在的情景就一目了然了,既然是死循环 那么循环里面每次运行的代码必然是一样的,所调用的函数也必然是一样的,那么每次的堆栈也是一样的。这就解释了为什么我们会看到一模一样的堆栈调用关系了。



图片6.png

哪怎么才能正常的断点发包,找功能call呢?很简单,以前游戏主线程会直接告诉服务器,游戏角色干了什么事情,现在只不过是把角色干的事情写入到全局变量里面。 只需要在写入的地方下断点,我们照样能够找到游戏的功能函数。


要在写入处下断,首先就得找到它的位置,它在哪? 也不困难,在全局变量上下一个内存写入断点,自然就会断在写入处。


好的,哪全局变量它又在哪?


解决一个问题总是会引出另一个问题,好在无论什么问题都有解决之道等待着我们去发现、去摸索。



图片7.png

现在我们知道,全局变量存储的是请求内容,而且子线程会调用发包函数把 请求内容发送出去,而我们已经知晓了发包函数,无非就是WSASend send sendTo,而请求内容会作为参数传入函数中,只要我们在OD中对这个参数溯其来源,自然可以找到那个不变的地址或者结构。


真是欣慰终于没有套娃了,现在我们终于跳出了这个该死的循环,可以继续快乐了。



图片8.png

上手实战:


光说不练假把式,利用自己搭建的SF游戏幻想神域2 做个实战练习。

这个游戏使用WSASend发包,直接在头部下断点,Ctrl+F9返回上一层。

然后我们在调用WSASend的call指令上下断点,以此在OD堆栈窗口查看它的参数。



图片9.png

其实都没必要我们自己下断点分析了,由于是常用的系统函数,所以OD直接帮我们分析并标注出来了。WSASend 第二个参数pBuffers 是一个结构体地址,这个结构体第一个成员是包长,第二个成员就是包内容的地址。


在往上面回溯之前,我们还有一些准备工作。再次在WSASend 下断点,依次Ctrl+F9 把线程发包里面调用的函数全部标记一下,如图。



图片10.png

很简单,就这样依次 1. 2. 3. 4. 5.... 这样标注下去。


接下来开始回溯包地址的来源,没什么太多好说的 逆向的基本功 唯一要注意的是 pBuffers来源于一个局部变量,在汇编中常常以[esp+XX]的形式出现,但是esp 栈顶指针是受到很多指令影响而变化的,所以 这里要追的是 [esp+0x28] 但是往上面一些 这个局部变量可不是 [esp+0x28]了,所以要细心的注意影响栈顶指针esp 的指令,从而推算出我们要追的局部变量是[esp+什么]。


一段无趣的回溯过程之后....



图片11.png

来到了这里,发现如果是角色动作引起的发包,edi 是一个固定值 那么 edi+2888 也是不变的,还记得上面说了什么吗?不变的地址!


来激动的心颤抖的手,在edi+2888 这个内存上下一个写入断点。断在了....这。



图片12.png

哦!~老天,我们从鬼打墙墙里面出来了么?
别高兴得太早,我们在上面下断点 Ctrl+F9 试试.....



图片13.png

来到了这?还记得之前说的准备工作吗? 这不是我们的标记吗? 也就是说这是线程发包调用的函数,我们还在镜子的世界里!!憎らしい!!

其实也很正常,我自己也常常这样。先把某个全局变量 或者 函数返回值,先复制一份放在函数里面的局部变量里,方便操作。

好嘛!失败是成功之母,至少这次也算是前进了一步,继续接着回溯。
就在写入断点断到的位置不远,又发现不变化的地址了...嘿嘿嘿..这个应该..



图片14.png

激动的心颤抖的手,在edx 这个内存上下一个写入断,断下如图.



图片15.png

下断Ctrl+F9。



图片16.png

(请忽略我之前的注释)


是陌生的代码!没有我们的标记!我们一起成功的走出了鬼打墙!!!
不愧~是我~



图片17.png

评分

参与人数 1好评 +1 精币 +5 收起 理由
冰点 + 1 + 5 感谢分享,很给力!~

查看全部评分


 楼主| 发表于 2020-7-19 21:38:28 | 显示全部楼层   广西壮族自治区桂林市
帖中工具、游戏、完整源码geihub链接 https://github.com/Li-lab-dev/-
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-2 11:54:30 | 显示全部楼层   湖南省长沙市
sanduosoft 发表于 2020-6-1 00:39
见鬼了,这么牛逼的帖子没人顶~~~

哈哈哈,谢谢支持
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-2 11:53:58 | 显示全部楼层   湖南省长沙市
htpidk 发表于 2020-5-31 23:54
你是搬的看雪上的?刚看见一个一模一样的帖子

同一群人而已
回复 支持 反对

使用道具 举报

结帖率:100% (6/6)

签到天数: 20 天

发表于 2020-6-1 00:39:20 | 显示全部楼层   河南省郑州市
见鬼了,这么牛逼的帖子没人顶~~~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 18 天

发表于 2020-5-31 23:54:04 | 显示全部楼层   广东省深圳市
你是搬的看雪上的?刚看见一个一模一样的帖子
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表