本帖最后由 安卓梦雪 于 2020-9-14 18:01 编辑
存档注入原理(存档注入包分析)
通过本教程的学习可以达到以下目标:
- 了解存档注入的分类
- 清楚存档注入的原理
- 使用存档注入破解游
一、前言
最近学会了存档注入并通过分析存档注入包清楚了存档注入的原理以及分类。存档注入,字面意思就是将修改后的存档注入到游戏中以达到跳过内购支付过程、大量金币、免激活等目的。
二、存档注入的分类
按照注入的方式可分为手动注入和自动注入。
- 手动注入,通过在游戏中变动金币的方式找到存档点(存档文件)将它修改后保存覆盖原存档。
- 自动注入,游戏运行时通过代码将预先准备好的存档压缩包解压到当前游戏的存档目录下,覆盖原存档。
手动注入的优缺点:
- 优点,不需要修改游戏安装包,可在游戏运行时达到存档注入的目的。
- 缺点,需要ROOT权限,因为游戏的存档目录大部分都在/data/data/packageName/shared_prefs/下。
自动注入的优缺点:
- 优点,不需要ROOT权限、注入一次,永久使用。
- 缺点,需要修改游戏安装包,可能还会涉及到游戏的签名效验等
三、存档注入的原理
下面我们通过分析存档注入包的方式清楚存档注入的原理。
先来看一下存档注入包的结构:
存档注入包内有四个文件,分别是classes.dex(自动注入代码)、SavesRestoring.smali(这个也是自动注入代码)、WuXie(修改过的存档包)、调用码(调用自动注入的代码)。上面我们看到有两个自动注入代码,其实我们可以删掉一个,为了方便起见直接删掉SavesRestoring.smali文件。
存档注入包分析
1.WuXie
这是某个游戏修改过的存档包。可以不用管,待会实战存档注入的时候可以自己压缩一个。
2.调用码.txt
这个文件里只有一行smali代码:
invoke-static/range {p0 .. p0}, Lcom/savegame/SavesRestoring;->DoSmth(Landroid/content/Context;)V
用于调用classes.dex文件里com/savegame/SavesRestoring类里的静态DoSmth()方法。
3.classes.dex
Dex编辑器++打开,可以看到有一个SavesRestoring类,这就是整个注入的核心,我们进去看看这个类做了什么。
将SavesRestoring类转为Java得到如下界面:
由于调用码是调用DoSmath()方法的原因,所以我们直接跳转到DoSmth()方法:
可以看到DoSmath()方法内调用了wPdauIdcaW()和SmartDataRestoreForYou()两个方法。
我们先跳转到wPdauIdcaW()方法看看,如下图所示:
这个方法只是弹出了一个Toast,没鸟用,直接看SmartDataRestoreForYou()方法,如下图所示:
这个方法首先通过c.getSharedPreferences("savegame", 0)得到了SharedPreferences对象并调用getBoolean()方法得到notfirst的值,判断如果这个值为false就执行代码块内的代码,如果为true则不做处理。我们继续往下看,如果notfirst的值为false则通过putBoolean()方法将这个值设为true(表示这个游戏已经存档注入过了,下次启动时不需要重新注入),然后通过list()方法将assets目录下的文件全部列出来,下面有3个判断,分别判断assets目录下的文件名是否是"WuXie"、"extobb.save"、"extdata.save",如果assets目录下有名为以上3个的其中1个时,则直接将这个文件解压到当前游戏的存档目录下覆盖原存档。
** tips:以上3个文件可自定义,在压缩存档时名称一致即可。
四、实战存档注入破解游戏
使用Dex编辑器++的方式打开安装包内所有dex文件,如下图所示:
找到游戏的入口类(UnityPlayerActivity):
进入后找到onCreate()方法(这个方法是Activity的入口方法,每个Activity启动时都会先执行这个方法):
在onCreate()方法里的setContentView()方法下粘贴调用码,如下图所示:
一路返回保存并签名,然后安装运行看看效果,如下图所示:
可以看到游戏的金币也变成5201314了,现在就可以把游戏分享给朋友了!!!
五、总结
- 存档注入一般只适用于单机游戏(不需要联网)
- 存档注入实际上就是把游戏数据目录下的配置文件的值修改为自己想要的值
- 手动注入只适用于自己测试,自动注入可以分享给朋友
安卓梦雪原创教程
|