-
-
万能遍历之已接任务
-
发表于:
2021-1-31 09:38
4157
-
万能遍历之已接任务
随着游戏行业和游戏模式的发展,游戏数据的设计和编写也越来越规范化,在逆向分析时也不会像某些野路子游戏那样无迹可寻。比如很多大公司开发的游戏,虽然在代码流程,加密解密,封号检测方面各有千秋,但是在整体数据框架上却大同小异。下面我们就以超激斗梦境的已接任务为例,来看看任务数据的分析方法。
对于任务数据来说,我们可以使用的突破口很少。分析怪物我们可以从选怪,打怪,血量,名字坐标,ID等方向入手,但是任务,我们只有任务名字描述,任务需求以及任务标志上入手。任务标志,只有一部分游戏会设置,比如幻想神域。而任务需求,很多游戏有要放在UI中存放,比如天涯明月刀。这样我们首选的入手方式就只剩任务名字和描述了,也就是说我们要扫描字符串。
(由于之前的用的账号已经被停封,所以这里只能提供一些关键代码和分析思路)
首先我们通过CE对任务的名字进行扫描,三种编码方式尝试过后,我们发现该游戏的主要编码是UNICODE。选取扫描到的结果,并对其进行修改(这里要注意的是,我们要通过字节集添加结束标识符00的方式来过滤掉有后缀的字符串,保证扫描的准确性,减少不必要的修改操作)。修改之后,发现其中的一个可以改变游戏内的本地显示。
在xdbg64中对这个地址下访问断点,游戏可以断在以下位置。
在遇到两个寄存器相加时,我们首先要想到的就是这个数据可能是一个结构体数组,其中一个寄存器来源于数组的起始地址,而另一个则是下标乘以结构体的大小。
恰好上面的两条代码验证了这一猜测,这里整理出的公式为r9+rax1D4+44
我们先去分析R9,返回后可以得到R9来来源于一个+64偏移
继续向上分析RCX,又出现了两个寄存器相加的情况add rcx,qword ptr ds:[rdi+68]
而RCX又来源于R874,说明这里又是一个结构体数组,而数组的起始地址则是RDI+68,整理后如下
[[[RDI+68]+n74+64]+m1D4+44 任务名字
这里的n始终为零,怀疑是主线任务的标志,由于账号等级过低无法验证。
继续分析RDI的来源,在返回后的某个CALL里面得到了+200偏移
接着分析RAX,可以很快在上面的CALL里面得到基地址
这样我们就得到了一个完整的公式,如下
[[[[[7FF715811148]+200]+68]+074+64]+m1D4+44
通过对第一个结构体数组的观察和分析,我们得出这只是一个任务库的遍历,并不能对我们当前的已经任务进行判断,所以我们还需要去分析m的来源。
顺着最开始的位置向上追,返回后可以得到来源于两个寄存器相加,之前分析的第二个数组也在附近
这里的R11来源于上面的RDI+78,和下面的RDI+68是同一个RDI,也就是说这里不用继续追了,直接套用基地址+200的公式就可以。
回头来看RSI,发现RSI既有可能来源于上面eax,也有可能来源于下面的+24
如果是来源于eax,则数值为0,这显然是不对,那么就一定来源于下面的RSI+24,而整个的这一片代码是在一个循环里面,说明这其实也是一个结构体数组,而数组下标RSI的数值则每次递增1。
下面就是对整个的数据进行观察和分析了,并最终得出以下公式
[[[[7FF715811148]+200]+68]+n74+64 任务库起始地址
n可能代表任务类型 0为主线任务
[[[[7FF715811148]+200]+68]+n74+6C 任务库任务数量DOWRD
[[[[[7FF715811148]+200]+68]+n74+64]+m1D4+4 任务ID
[[[[[[7FF715811148]+200]+68]+n74+64]+m1D4+44]+0 任务名字UNICODE
[[[[[[7FF715811148]+200]+68]+n74+64]+m1D4+98]+0 需通关副本UNICODE
[[[[[[7FF715811148]+200]+68]+n74+64]+m1D4+118]+0 任务要求UNICODE
[[7FF715811148]+200]+78 当前任务数组起始地址
[[7FF715811148]+200]+80 当前任务数量DWORD
[[[7FF715811148]+200]+78]+n*24+4 任务ID DWORD
这就是已接任务的分析过程,也是现在大部分游戏的一个分析模式,先取任务库,在对传入库中的下标分析,得出已接任务ID。万能遍历大法,就是如此简单。
黑眼探光明,逆向寻真理!欢迎来飞郁网络培训进行交流。
本篇文章仅供交流学习使用,请勿用于商业用途,多谢支持。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)