开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 822|回复: 0
收起左侧

[图文资料] 原创:万能遍历之已接任务

[复制链接]
发表于 2021-1-31 09:42:59 | 显示全部楼层 |阅读模式   吉林省通化市
万能遍历之已接任务

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


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

本版积分规则 致发广告者

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

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

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