53.网络游戏逆向分析与漏洞攻防-基础数据分析筛选-逆向分析寻找消息数据解压缩过程

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

如果看不懂、不知道现在做的什么,那就跟着做完看效果

现在的代码都是依据数据包来写的,如果看不懂代码,就说明没看懂数据包

内容参考于: 易道云信息技术研究院VIP课

上一个内容:52.面对庞大的数据如何找到节奏

在上一个内容里的分析,看到了带47开头的数据包被压缩了,所以对于47开头的数据包来说现在并不是明文数据,现在做的是逆向游戏客户端找它的解压缩过程,

思路:

首先之前拦截数据包的地方,是游戏接收的地方,游戏接收之后数据包是压缩的,所以游戏也用不了,它肯定会把数据包丢给一个函数,然后在这个函数里面对数据包解压,然后使用数据包,然后它可能还会把数据包丢到一个线程或者队列里面,然后接收的位置就不管了,然后在别的地方经过一段时间依次的处理,这时处理的时候由于数据包没有解压,游戏依然是无法直接使用,所以这个时候游戏也要进行解压操作。

然后由于它的数据包很多,所以在接收的代码里,让它弹一个框,如下图,在 OnRecving 函数里添加0x28数据包判断,为什么是判断0x28要看上一个内容,0x28开头的数据包里有人物基本信息

然后打开x96dbg

选择附加

然后附加到游戏

然后按 ctrl+g 键,输入跳转的位置 10618480

然后就来到下图红框位置,下图红框位置是我们HOOK(拦截)游戏接收数据的位置

然后使用今晚打老虎角色进入游戏

 

然后游戏接收到0x28数据包,这时弹框的确定不要点,后面会说什么时候点

这时在x96dbg里打断点,在下图红框位置打断点,下图红框位置是 10618480函数开头,所以在下图红框位置打断点

下完断点之后回到游戏点击确定

点击完确定x96dbg就能准确的点下来了

通过内容窗口查看也是正确的,如下图,是0x28数据包

然后开始分析,现在只分析游戏如何解压的,为什么要分析这里,看11.接管游戏接收网络数据包的操作,看完 11.接管游戏接收网络数据包的操作 之后,就可以知道,通过之前的分析得出这里是游戏接收数据包存在明文数据的地方

首先下图红框位置的eax是上一层计算出来的指针(从连接对象里算出来的指针)

然后edi+0x24,也就是eax+0x24,也就是从连接对象里算出来的指针的值+0x24

得到了一个像是长度

然后ebx+0x1

然后又一个像是长度的东西

然后继续往下走,看到下图红框位置,现在的edi是从连接对象里计算出来的对象,然后现在从计算出来的对象里偏移0x10位置得到了0x40000,这个0x40000像是一个内存大小也就是一个缓冲区

然后长度与缓存区比较

然后继续往下,下图两个不知道是什么,接下来这种不知道是什么的东西就不写了(都加上太长了影响观看)

一路f8,然后就来到了下图位置,从栈里得到了数据包

下图中第一个红框不知道计算的什么,初步判断是往队列里放东西,第二个红框可能是求下一个队列位置

然后得到了一块内存空间

然后调用了一个函数,函数的参数如下图,ebp是是一个长度,eax如下图是数据包内容,edx是上图里的内存空间

然后在下图位置按F7,进入函数里

然后一路f8,就看到下图位置了,函数里并没有循环,所以它不是解密的函数,如果解密的话必定会有循环

然后函数执行完,发现原本eax存放的是数据包,现在eax的值是从上方计算的出的队列的地址,并且把数据包复制到队列的内存空间里,如下图

然后发现到后面就没什么东西了,就结束了ret了,也就是说接收数据这一条线就结束了,就走完了

下一步,要不就是另起一个线程去处理,下图红框里的数据,要不就是这里返回之后,后面再去处理下图红框里的数据,游戏里把网络设置成非阻塞的模式,就是没接收到数据返回,接收到数据也返回,所以游戏它就不会卡主,它接收数据的过程就是把数据复制到一个队列里

然后接下来设置一个访问内存的断点,看谁读取了这个内容断点,如下图

然后按f9,让游戏跑起来运行,然后就来到了下图位置,然后把位置记录下来 0x1061157E

然后ecx-27之后比较与9的关系

然后0x30-0x27=0x9

然后ja指令的意思

也就是说,eax大于9就跳转,这个意思应该是它的数据包头的范围是0x0 到 0x30

下图红框位置,是一个跳转表,具体的作用现在不知道,如果以后必须用到了,在分析它,这里先不管

接下来看下图红框的函数

按F7进入函数

然后ecx是数据包+1位置,如下图也就是47位置,这里把47取了出来

下图红框位置的汇编,把47这个数字通过and指令、sub指令、sbb指令、and指令、add指令一路计算最终判断结果是不是等于3,如果大于3就跳转

然后再下图红框位置从数据包中得到了一个数字 0x03EF,十进制是 1007

然后把03EF这个数字返回出去了,这应该是数据包压缩之后的长度

然后执行ret,回到上一层

然后与FFFF作比较,FFFF十进制是65535,如大于FFFF就不跳转,不跳转可以看到有一段内容 decompress size error,中文意思是解压大小错误

然后继续f8,就来到下图位置,先继续往下翻

这里要用鼠标双击进入看,不要断点进入了,需要先大体看一看,因为现在经过这么长的分析脑子很混乱了,所以先不用断点,通过静态分析的方式大体看一眼,然后它接下来它肯定会在某个位置解压数据了,然后这时的栈里有数据包,然后它的参数是一个也就是ecx,ecx是一个地址

然后现在ecx地址的内容

然后现在需要知道的东西已经够了,然后鼠标双击函数进入函数,进入函数之后,主要关注汇编的跳转指令j开头的指令,看看它是否存在循环,循环的特征就是跳转指令会往上跳转,然后如下图,进来之后,一共有两个跳转指令,并且它们都是往下跳转,不满足循环特征

然后它还调用了,如下图两个函数,这里还是用鼠标双击进入,大体看一眼

首先进入,下图红框里的函数

这个函数里存在循环的特征,如下图

然后往下翻,可以看到,它有很多跳转,也就是说明存在多个循环,这样的情况就符合加密解密、压缩解压的逻辑特征

所以0x106011E0函数,可以大胆猜测它是用来解压数据的函数

然后现在猜测,解压完的数据会放到ecx里,下图是未执行 0x106011E0函数时

然后按F8,可以看到ecx有了数据

然后之前的目录,现在也可以正常显示,并不是一段正常显示一段不正常显示,到这就得到了,解压之后的数据包

然后顺手再往后看看,下图红框位置有一个je的跳转,也就是相等就跳转,ebp的值是之前得到的,eax是0x106011E0函数的返回值,这个意思是看看解压之后的数据是否与服务端传来的长度一致,如不一致就报错,下图中也可以看到 decompress failed,中文意思是解压失败

然后继续往下看,上方有一个跳转表 0x10611904,上方没有截 0x10611904 它里面的内容,但是我是访问了一下,但是当时并不知道它是什么东西,所以没有截图,现在可以知道了,当解压完,它会执行到0x1061160B位置,这也就是说 0x10611904 控制了如果数据不需要解压它就跳转到0x10611616位置,不执行上方分析的解压函数,它可以知道什么数据压缩了那些数据没有压缩

然后下图红框位置,它有10字节,数据都是0或1,也就是代表了,数据是否压缩

由于上方0x10611594位置的代码截图不详细,但是经过上方两个图,感觉它们很重要,所以下方补充截图

如下图,eax的值现在是1

所以从0x1061190C里取出的数据是00

也就是从0x10611904位置取出一个值,然后jmp(跳转)到这个值,也就是jmp到0x106115A2这个位置,跳转到0x106115A2位置之后会执行解压操作

然后现在的数据包是开头0x28,所以0x28是1,然后0x29肯定是2,依次类推27 28 29 2A 2B 2C 2D 2E 2F 30,如下图,其中2B和2D是不压缩的

然后往下翻可以看到游戏它处理数据包的方式,一个很明显的 switch 结构

总结:

从0x1061157E位置计算得出当前的数据包是否要解压,然后从0x1061159B位置的0x10611904跳转表,如果要解压就通过0x10611904跳转表跳转到解压函数位置,如果不解压就跳转到其它位置,目前也只分析了跳转解压的,其它的没有分析

然后0x106115E4位置调用了0x106011E0函数对数据包做解压操作

然后如果要屏蔽这种数据,就要让它返回一个false,然后hook要下在下图红框位置,下图红框位置决定了是否解压成功,eax是解压之后的长度,ebp是服务端发送来的长度,带入当前的场景也就是在0x28开头的数据包里的长度,然后由于游戏把数据包丢到了一个队列里,这可能导致在这个位置hook没办法做模拟数据,模拟数据这个操作看后续的代码,这里不详细写了,没法写清楚,看代码理解起来最简单,看不懂代码可以看代码里的文字说明,会写的很详细,然后现在只要知道有这么回事就行

然后解压失败就让它跳转到,下图红框位置,为什么要下图红框位置?

如果不在下图位置又不想写代码,就要跳转到下图红框位置,跳转到下图红框位置之后,它会执行一个虚函数进行报错,这个函数里可能会有信息收集的操作,人家本来就没错,我们只是屏蔽数据包,这样的情况下游戏收集信息肯定就能检测出游戏被人搞了,所以跳转到上图红框位置最合理

上方只是分析,只是找到了解压之后的数据包,在什么位置可以得到,然后这个解压之后的数据包具体怎样用以后续的代码为准,现在只是初步定义hook点返回值


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值