012 分析技能冷却二叉树

前言

学习完了最常用的数据结构,我们再来分析游戏中其他的功能,尽量将游戏中的所有数据分析完全,为后面的实际应用积累经验。

对于RPG游戏来说,技能数据是必不可少的。这次我们就来找技能相关的数据。

技能冷却二叉树

想要找到技能相关的数据结构,可以有很多突破口,比如技能名称,技能ID,技能冷却时间等等。以技能冷却时间为例,找一下当前的技能数据。

首先找到一个技能冷却时间长的技能,以技能的当前冷却时间为突破口来找技能数据。

在这里插入图片描述

以这个技能为例,释放技能,此时处于冷却状态,冷却时间开始倒计时。 在CE中选择浮点型,未知初始值

在这里插入图片描述

然后一直扫描减少的数值

在这里插入图片描述

最后从多个结果中很容易就能找到唯一一个和当前冷却时间相同的数值。然后对这个地址下硬件访问断点

在这里插入图片描述

断点断下,ecx+0x10是技能的冷却时间。在这个地方下断点,一直F9运行,发现ecx的值是不变的。

接着再次释放技能,ecx的值会在两个数值间变化。

就是说这个位置是所有处于冷却状态下的技能才会访问的代码。那么最后我们会追到数据结构,里面存放的是所有处于冷却状态中的技能。

继续往上追ecx的值

在这里插入图片描述

ecx来源于[edi+0x10],观察edi的值,此时edi依然是两个值变化的

冷却时间=[edi+0x10]+0x10

在这里插入图片描述

edi来源于[eax]。此时eax不再发生变化,尽管这个时候有两个技能处于冷却状态。根据之前的经验,说明这段代码中有循环改变了寄存器的值。

在这里插入图片描述

找到向上的跳转,确定循环头部和尾部。

在这里插入图片描述

下面有第二个循环,头部和第一个循环头部一样。

在这里插入图片描述

第三个循环,头部也和第一个循环头部一样

在这里插入图片描述

第四个循环,头部和第一个循环头部一致。

在这里插入图片描述

继续追edi,无论是第几个循环,edi都来自[ebp-0x8],[ebp-0x8]作为局部变量,肯定中间有一个call会改变它的值

在这里插入图片描述

单步步过这个call,发现[ebp-8]被改变了,这个call传入一个对象指针,然后返回一个新的对象。

跟之前分析过的二叉树几乎完全一样,要么拿到根节点调用call取下一个对象,要么下访问断点找到遍历的代码。

在这里插入图片描述

还是在这个地方对数据下访问断点,断点断下。这个地方的代码和之前一模一样,是一个标准的二叉树遍历。

在这里插入图片描述

冷却时间=[eax+0x10]+0x10

[eax]是二叉树的左子树,[eax+8]是右子树。[eax+0x15]是结束标志位,[eax+C]是技能ID。继续往上可以把整个偏移表达式追出来,这里省略过程。

获取技能名称

找到了技能的冷却时间二叉树,接着来找技能名称的数据结构。由于幻想神域这个游戏是用的繁体字,所以这里需要用到一个转换工具,将Big5编码的繁体字转换为GBK编码的十六进制。

在这里插入图片描述

随意选取一个技能名称,用工具转换为字节集

在这里插入图片描述

然后在CE中搜索字节数组,字节尾部加上00

在这里插入图片描述

扫描出了五个结果,分别对五个值就行修改,即可筛选出唯一一个技能名称。

接着在这个位置下硬件访问断点

在这里插入图片描述

打开技能栏让断点断下,[esi+ecx*4-8]就是当前的技能名称。这里由于所有的字符串经过这里都会断下,并不仅限于技能名称,所以就不太好追。

可以用到一个技巧

在这里插入图片描述

复制esi的值,在栈窗口点击查找,一直按Ctrl+l找到堆栈中第一次出现的位置

在这里插入图片描述

这里esi是上面的返回地址中的第三个参数,反汇编窗口跟随第三个地址继续追第三个参数

在这里插入图片描述

第三个参数是edx

在这里插入图片描述

edx来源于ebx+edx,但是ebx的值为0,所以不用管继续往上追

在这里插入图片描述

edx来源于[eax+4]

在这里插入图片描述

eax来源于[ebp+8],也就是第一个参数。这里返回上一层不能直接下软件断点,否则会得到错误的调用关系,必须在之前的数据下访问断点。

在这里插入图片描述

第一个参数是ecx,这个地方是技能名称的访问代码,其他字符串不会断下。ecx来源于ecx+0x100,又来源于[ebp+0x10],上一层的第三个参数,继续下断返回

在这里插入图片描述

第三个参数是esi,继续往上找esi

在这里插入图片描述

esi来源于eax,eax是上一个函数的返回值。这个call的内部逻辑比较复杂,里面还调用了之前分析过的数组下标加密的代码,就没必要继续往上追了

直接分析参数,eax是技能ID,返回的eax是技能对象,我们可以通过调用这个call来获取技能名称。

实际效果如图:

在这里插入图片描述

总结

分析完了技能冷却二叉树,相当于是复习了一下之前学过的内容,这种类似的数据结构,后面会碰到很多。

对于数据结构的逆向,需要在追踪寄存器的过程中每一步都观察寄存器的变化,然后通过当前的变化分析附近的代码,从而分析出数据结构。

最后,附上Github地址,里面有游戏下载链接和相关工具,需要请自取:
https://github.com/TonyChen56/GameReverseNote

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页