|
发表于 2020-6-9 01:41:52
|
查看: 8234 |
回复: 3
文章目录前言 学习完了最常用的数据结构,我们再来分析游戏中其他的功能,尽量将游戏中的所有数据分析完全,为后面的实际应用积累经验。
对于RPG游戏来说,技能数据是必不可少的。这次我们就来找技能相关的数据。
技能冷却二叉树 想要找到技能相关的数据结构,可以有很多突破口,比如技能名称,技能ID,技能冷却时间等等。以技能冷却时间为例,找一下当前的技能数据。
首先找到一个技能冷却时间长的技能,以技能的当前冷却时间为突破口来找技能数据。
012 分析技能冷却二叉树
以这个技能为例,释放技能,此时处于冷却状态,冷却时间开始倒计时。 在CE中选择浮点型,未知初始值
012 分析技能冷却二叉树
然后一直扫描减少的数值
012 分析技能冷却二叉树
最后从多个结果中很容易就能找到唯一一个和当前冷却时间相同的数值。然后对这个地址下硬件访问断点
012 分析技能冷却二叉树
断点断下,ecx+0x10是技能的冷却时间。在这个地方下断点,一直F9运行,发现ecx的值是不变的。
接着再次释放技能,ecx的值会在两个数值间变化。
就是说这个位置是所有处于冷却状态下的技能才会访问的代码。那么最后我们会追到数据结构,里面存放的是所有处于冷却状态中的技能。
继续往上追ecx的值
012 分析技能冷却二叉树
ecx来源于[edi+0x10],观察edi的值,此时edi依然是两个值变化的
012 分析技能冷却二叉树
edi来源于[eax]。此时eax不再发生变化,尽管这个时候有两个技能处于冷却状态。根据之前的经验,说明这段代码中有循环改变了寄存器的值。
012 分析技能冷却二叉树
找到向上的跳转,确定循环头部和尾部。
012 分析技能冷却二叉树
下面有第二个循环,头部和第一个循环头部一样。
012 分析技能冷却二叉树
第三个循环,头部也和第一个循环头部一样
012 分析技能冷却二叉树
第四个循环,头部和第一个循环头部一致。
012 分析技能冷却二叉树
继续追edi,无论是第几个循环,edi都来自[ebp-0x8],[ebp-0x8]作为局部变量,肯定中间有一个call会改变它的值
012 分析技能冷却二叉树
单步步过这个call,发现[ebp-8]被改变了,这个call传入一个对象指针,然后返回一个新的对象。
跟之前分析过的二叉树几乎完全一样,要么拿到根节点调用call取下一个对象,要么下访问断点找到遍历的代码。
012 分析技能冷却二叉树
还是在这个地方对数据下访问断点,断点断下。这个地方的代码和之前一模一样,是一个标准的二叉树遍历。
012 分析技能冷却二叉树
[eax]是二叉树的左子树,[eax+8]是右子树。[eax+0x15]是结束标志位,[eax+C]是技能ID。继续往上可以把整个偏移表达式追出来,这里省略过程。
获取技能名称 找到了技能的冷却时间二叉树,接着来找技能名称的数据结构。由于幻想神域这个游戏是用的繁体字,所以这里需要用到一个转换工具,将Big5编码的繁体字转换为GBK编码的十六进制。
012 分析技能冷却二叉树
随意选取一个技能名称,用工具转换为字节集
012 分析技能冷却二叉树
然后在CE中搜索字节数组,字节尾部加上00
012 分析技能冷却二叉树
扫描出了五个结果,分别对五个值就行修改,即可筛选出唯一一个技能名称。
接着在这个位置下硬件访问断点
012 分析技能冷却二叉树
打开技能栏让断点断下,[esi+ecx*4-8]就是当前的技能名称。这里由于所有的字符串经过这里都会断下,并不仅限于技能名称,所以就不太好追。
可以用到一个技巧
012 分析技能冷却二叉树
复制esi的值,在栈窗口点击查找,一直按Ctrl+l找到堆栈中第一次出现的位置
012 分析技能冷却二叉树
这里esi是上面的返回地址中的第三个参数,反汇编窗口跟随第三个地址继续追第三个参数
012 分析技能冷却二叉树
第三个参数是edx
012 分析技能冷却二叉树
edx来源于ebx+edx,但是ebx的值为0,所以不用管继续往上追
012 分析技能冷却二叉树
edx来源于[eax+4]
012 分析技能冷却二叉树
eax来源于[ebp+8],也就是第一个参数。这里返回上一层不能直接下软件断点,否则会得到错误的调用关系,必须在之前的数据下访问断点。
012 分析技能冷却二叉树
第一个参数是ecx,这个地方是技能名称的访问代码,其他字符串不会断下。ecx来源于ecx+0x100,又来源于[ebp+0x10],上一层的第三个参数,继续下断返回
012 分析技能冷却二叉树
第三个参数是esi,继续往上找esi
012 分析技能冷却二叉树
esi来源于eax,eax是上一个函数的返回值。这个call的内部逻辑比较复杂,里面还调用了之前分析过的数组下标加密的代码,就没必要继续往上追了
直接分析参数,eax是技能ID,返回的eax是技能对象,我们可以通过调用这个call来获取技能名称。
实际效果如图:
012 分析技能冷却二叉树
总结 分析完了技能冷却二叉树,相当于是复习了一下之前学过的内容,这种类似的数据结构,后面会碰到很多。
对于数据结构的逆向,需要在追踪寄存器的过程中每一步都观察寄存器的变化,然后通过当前的变化分析附近的代码,从而分析出数据结构。
最后,附上Github地址,里面有游戏下载链接和相关工具,需要请自取:
https://github.com/TonyChen56/GameReverseNote
|
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【 投诉建议】板块发帖举报。
|