欢迎光临散文网 会员登陆 & 注册

dnSpy逆向一款不知名黄油的经验(二)

2020-06-07 13:26 作者:Anicca丶Y  | 我要投稿


紧接上篇文章中介绍的存档解密过程,这次将讲述封呪姫这款游戏的资源解密过程.

在解资源解密前,通常需要确定哪些文件是游戏的主要资源文件,对于一款黄油来说资源通常包含:游戏文本,游戏贴图,CG,音频以及一些游戏内部的物品,技能,属性等.对于unity开发的游戏来说资源文件通常都打包在.assets的文件中.当然也有些作者会自己打包.

查看封呪姫这款游戏的目录,并通过文件以及文件的大小能够大致判断出资源文件所在的目录,对于游戏来说资源占的容量绝对是最大的,这没的争议,代码啥的终究只是文本能有多大.

游戏目录

在目录中src文件夹就是游戏的主要资源文件所存放的位置,

随便截了两张src文件夹中文件的信息,什么.dx文件 .dml文件 都是没见过的文件格式,一般来说这些都是作者自己搞得.用UE随便打开一个文件看看:

be1.dx

对于unity资源,先不管别的直接上AssetStudio,看看资源能不能打开,结果不出意外是打不开的.

在用AssetStudio,无解的情况下,最终还是要回归到代码层面,毕竟游戏的一切终归是由代码构筑的,总不可能资源自己会跑会跳.

老套路dnSpy启动,这次是要定位资源的解密代码.如果作者不耍什么小动作,搜索一些关于资源的关键词应该能够找到.经过一番搜索和对比之后,大致定位到了GSys这个类中LoadByte这个方法.

具体是为什么做出这个判断,一是经验,二是感觉,三是瞎猜,四是它太像了.

其实主要是通过dnSpy的分析得来的.

在看到LoadByte这个方法的时候,为了能够找到是什么方法调用了它,就可以用右键"分析"这个功能,此时方法就会进入到分析器中

在展开后,[被使用]标签就是这个方法被调用的位置.

通过图中的展开,可以看出LoadByte被LoadString调用,LoadString又被三个(Load×××)方法调用这三个方法所传入的参数都是文件名的字符串,显然是要对文件下手

于是点开LoadByte这个方法:

代码看上去挺多了,其实主要还是一大堆乱码搞得,看过上次文章应该能够对这个代码有似曾相识的感觉,前面的代码就不解释了.

直接看到:int encMode = GSys.GetEncMode(sFilename);

这里定义了一个 encMode的变量,字面理解是加密模式(当然加密模式是啥,一开始我也不知道是啥,不看看GetEncMode这个方法的具体操作了什么是很难猜的).不过这里可以先不考虑GetEncMode这个方法到底给encMode这个变量赋值什么,毕竟它就是个int,再复杂也就是个数字.

往下看到这个if判断,可以看出就是判断这个encMode是否为0,

再看if的内容,内容里也很简单,一个定义了一个num2(之前忽略了)补充内容

###这里num2有两种情况:

###1:全长        2:长度为100

###总结起来是encMode = 0,数据没有经过加密,不需要解密过程直接跳过

###encMode != 1, 整个数组都经过加密(src文件夹中.dxt  .dml  .dsv文件的加密模式)

###encMode =1, 数组的前100个元素经过加密(src文件夹中.dx文件加密模式)

###总结一下就是不同资源文件的加密模式存在略微差别,并且游戏兼容解密后资源的直接读取,所以解密后的文件改一下后缀直接放在src文件夹就能被游戏读取。其中.dxt  .dml  .dsv  .dx解密后改为.txt  .xml  .csv  .tx当然也可以随便改后缀只要不与原始的4种后缀一样就行(名字保持一样只改后缀)。

,然后就是for循环

看过上期的人应该知道这个for循环是啥吧,就是本篇文章所要寻找的解密代码

array[i] = (byte)((int)array[i] ^ i * num);

这条代码就是加密的关键,解析一下就是,array这个数组的每一个元素和(i*num)进行异或后赋值回去,num这么变量是前面代码中赋过值的,

看上去一大串其实就是int num = 28;别问我怎么来的,算出来的

简化再把num用28替换掉:

array[i] = (byte)((int)array[i] ^ i * 28);

清晰明了了,接下来就是自己写一下python代码实现这个功能了.

但是要注意的是这过程中都是字符进行运算的,如果没有注意的byte类型大小的话直接算会溢出的.

前面还提到过加密模式的问题,其实这个加密模式就是个幌子,与其说是加密模式,不如说就是个判断资源有没有加密,没加密就不同跑下面的解密代码了.

接下来上一下解密成果,就拿技能的文件展示一下.

这里注意的是文本是经过简体汉化的.日文原版也是一样的.

还有一点注意的是一些CG的资源包解密之后,是unity官方的包,需要用AssetBundleExtractor继续解包才行,不过这之后的解包直接用工具干就行了,没什么技术含量就略去一万字了.

接下来我介绍游戏"解码"的两个方法(解码太危险尽量不上图了)

  1. 代码层面的"解码"介绍

  2. 资源层面的"解码"介绍

后续可能还会有一些代码魔改的介绍................

dnSpy逆向一款不知名黄油的经验(二)的评论 (共 条)

分享到微博请遵守国家法律