今天得到了一个游戏样本进行分析,过程中遇到了一些困难,出于个人爱好对它进行了详细的分析和破解。游戏大致就是对游戏文件进行加密,对关键类进行动态释放。第一次分析加密逻辑是放到了加密的dex中,所以需要下面解密dex文件然后在进行后续操作。

首先游戏重签名后是进入不了游戏的。所以需要先分析释放dex,去除签名验证,下面开始分析:进入主activity的oncreate方法

通过自己手动加log发现第一行代码调用执行就卡住了。我们进入方法内部看一下

第一个调用的a方法:

结合这两个方法可以看出来,就是获取classes.dex,然后打开assets里面的某个文件,读取写入到classes里面。这里的文件名就是str,下面开始分析这个文件名是什么,回到oncreate中:

这里可以看出对字符串进行了加密。

通过查看m.a方法可以看出对进行解密,这里我们直接把游戏的dex转成jar导入eclipse中。执行一下这个方法。

可以看到返回结果是dx。在游戏的assets中也确实有这个文件。我们打开这个文件看一下

可以看出来是个dex文件,反编译之后:这里就明白了,是oncreate跳转到第一个a方法,然后再执行第二个a方法,第二个就是单纯的释放类。

然后回到第一个跳转的a方法:

这里有一个反射执行方法的操作,按照刚刚方法打打印出这个加密的文字(也就是类名)是什么

这里就和我们刚刚解出来的dex对上了。我们看一下调用的vs方法:

这里可以看出是一个签名验证,我们直接把matchSignature全部赋值都改为true。然后把dx解出来这几个类直接拷贝到工程中,然后注释掉第二个a方法的调用,因为这个是释放类的代码。现在不需要了。

然后重新打包运行,继续解密dex2,去除验证,发现依然进不去游戏。不过这一个方法已经执行下去了,我们继续往下分析。

有了前面的分析,解密这些字符串之后发现,是读取dd.dat文件,然后调用a方法

可以发现这里和刚刚的流程差不多,也是解密dex然后反射调用,不过这里的dd.dat文件不再是一个dex,而是一串混淆后的字符串。这里的classes4也需要从游戏的data/data目录下面拷贝出来,我这里也是直接吧dex拷贝在eclipse中,对这个方法进行了一些改造,然后把dd.dat里面的字符串直接传入调用:

这里执行完就是我们想要的类了(因为这游戏比较鸡贼,执行完之后就把dex delete了,所以我们需要这一步)

和刚刚的类基本上一样,我们也强制“valid”都改为true然后跟刚刚一样,拷贝到项目中,注释掉释放代码,重新启动后终于能进入游戏。

我们目前只分析login,进入后

找到au登录回调,然后log发现卡在了:

首先看a方法

这是一个接口,然后在入口类中有实现这个接口。

这里的四个参数值:

arg10=string2未知

arg11="ABUGTREeEBUGAhRFEA8bExUZF1QPBgJFMQ8FFxMGBkk="

arg12="gcc"

arg13=未知

解出来字符串为:com.kusoman.support.dex.Runtime3

上面的a.b也是一个处理dex的方法,但是arg10是未知的,还需要hook出来这个原始的string是什么,但是不去分析他了,因为我们之前已经得到这个类了。还记得我们拷贝出来的classes4.dex这个dex没有在eclipse中处理前,反编译后正是这个类

图中是我修改赋值后的,这个只有一个类了。里面的代码也是一个签名验证判断。我们也直接全部赋值为true。依旧注释掉释放的代码,把类拷到项目然后再次重打包运行,终于正常进入了游戏。

这个是我玩过的,到这里,这个游戏的全部效验全部过掉了。

我们就从第一个文件下手吧!不过打开后是加密的:

在项目中搜索一下这个文件

果然有,

r.a方法:(读取文本数据)

h.a方法:

这里应该就是对加密的数据进行解密了

这里就是解密方法了,我们同样直接执行一下h.a这个方法:不过要先知道b是什么,因为有两个参数:

通过层层回溯,最后发现还是我们刚刚解密的类的返回值。打印出返回值后,开始执行解密achievement.json文件

格式化之后:

这里对照着游戏里面的成就页面,基本上就可以为所欲为了!

这里要注意,因为我们修改的是解密后的数据,直接覆盖源文件是不行的,因为代码还是会进行解密。需要修改一下代码:

刚刚已经分析到 r.a方法:(读取文本数据) h.a方法:解密数据,所以这里我们修改读取后不执行解密数据的方法了,直接注释掉调用即可。

严重说明

本文的目的只有一个就是学习逆向分析技巧,如果有人利用本文技术进行非法操作带来的后果都是操作者自己承担,和本文以及本文作者没有任何关系,本文涉及到的代码项目可以去编码美丽小密圈自取,长按下方二维码加入小密圈一起学习探讨技术

这里游戏就完成了全部破解,游戏整体的防护措施就是对数据加密解密,动态解密释放dex,然后通过反射来执行释放dex里面的验证方法,验证的地方也挺多的,只是思路比较单一,都是通过签名去进行验证的。只是采用了不同的获取验证方法,所以这里只通过kstools是不能过掉签名验证的。

手机查看文章不方便,可以网页看

《Android应用安全防护和逆向分析》

猛戳下方"阅读原文",开启安全逆向大门!