安卓梦雪 发表于 2020-9-13 11:38

「梦雪原创」存档注入原理(存档注入包分析)

本帖最后由 安卓梦雪 于 2020-9-14 18:01 编辑

# 存档注入原理(存档注入包分析)

通过本教程的学习可以达到以下目标:
- 了解存档注入的分类
- 清楚存档注入的原理
- 使用存档注入破解游

## 一、前言

最近学会了存档注入并通过分析存档注入包清楚了存档注入的原理以及分类。存档注入,字面意思就是将修改后的存档注入到游戏中以达到跳过内购支付过程、大量金币、免激活等目的。

## 二、存档注入的分类

按照注入的方式可分为手动注入和自动注入。

1. 手动注入,通过在游戏中变动金币的方式找到存档点(存档文件)将它修改后保存覆盖原存档。
2. 自动注入,游戏运行时通过代码将预先准备好的存档压缩包解压到当前游戏的存档目录下,覆盖原存档。

**手动注入的优缺点:**
- 优点,不需要修改游戏安装包,可在游戏运行时达到存档注入的目的。
- 缺点,需要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个文件可自定义,在压缩存档时名称一致即可。

## 四、实战存档注入破解游戏

- 游戏:反恐精英射击
- 来源:4399游戏盒
- 目标:进入游戏赠送大量货币

试玩一把,获得1250个金币,接下来进入游戏的数据目录

在游戏数据目录下高级搜索1250(记得勾选搜索子目录)

搜索到两个文件,我们选择第二个文件:

Totalcash代表金币,所以我们将它的值1250改为5201314,如下图所示:

返回保存,删除bak备份文件,重新进入游戏看看效果:

可以看到金币已经变成5201314了,但这只能在本机上有效果,发给别人是没有效果的,所以下面我们就来结合自动注入来达到发给别人也有效果的目的。退回游戏数据目录下,如下图所示:

将shared_shared_prefs文件夹复制到内存卡任意目录,定位到复制过来的目录下,再次长按shared_shared_prefs文件夹,选择压缩,文件名改为WuXie(这里可以自定义,只要和注入代码里的文件名一致即可)

定位到游戏安装包目录,使用查看的方式打开安装包,将压缩好的存档文件添加进assets目录下,如下图所示:

返回安装包根目录,将存档注入包内的classes3.dex重命名为classes4.dex(因为游戏安装包内已经有classes3.dex了,不能覆盖),如下图所示:

将classes4添加进安装包,如下图所示:

最后打开存档注入包内的调用码并全选复制:
```
invoke-static/range {p0 .. p0}, Lcom/savegame/SavesRestoring;->DoSmth(Landroid/content/Context;)V
```

使用Dex编辑器++的方式打开安装包内所有dex文件,如下图所示:

找到游戏的入口类(UnityPlayerActivity):

进入后找到onCreate()方法(这个方法是Activity的入口方法,每个Activity启动时都会先执行这个方法):

在onCreate()方法里的setContentView()方法下粘贴调用码,如下图所示:

一路返回保存并签名,然后安装运行看看效果,如下图所示:

可以看到游戏的金币也变成5201314了,现在就可以把游戏分享给朋友了!!!

五、总结
- 存档注入一般只适用于单机游戏(不需要联网)
- 存档注入实际上就是把游戏数据目录下的配置文件的值修改为自己想要的值
- 手动注入只适用于自己测试,自动注入可以分享给朋友

安卓梦雪原创教程

Hmily 发表于 2020-9-14 17:41

安卓梦雪 发表于 2020-9-14 17:40
不对呀,我现在又能加载出来了,要不你清除缓存试试看?

你就赶紧改了,你引用的地址,加了防盗链,所以无法显示,你能看到肯定都是直接求看原来的地址或者直接打开图片地址有了缓存而已。

安卓梦雪 发表于 2020-9-14 17:43

Hmily 发表于 2020-9-14 17:41
你就赶紧改了,你引用的地址,加了防盗链,所以无法显示,你能看到肯定都是直接求看原来的地址或者直接打 ...

可是我上传图片他说没合法的文件被上传

Hmily 发表于 2020-9-14 16:10

图片有问题,上传到本地吧。

安卓梦雪 发表于 2020-9-14 17:19

Hmily 发表于 2020-9-14 16:10
图片有问题,上传到本地吧。

可以显示的丫

Hmily 发表于 2020-9-14 17:27

安卓梦雪 发表于 2020-9-14 17:19
可以显示的丫

你清空下浏览器缓存试下。

安卓梦雪 发表于 2020-9-14 17:30

Hmily 发表于 2020-9-14 17:27
你清空下浏览器缓存试下。

好吧,我重新上传一下,另外我刚发的贴麻烦审核一下

安卓梦雪 发表于 2020-9-14 17:40

Hmily 发表于 2020-9-14 17:27
你清空下浏览器缓存试下。

不对呀,我现在又能加载出来了,要不你清除缓存试试看?

冥界3大法王 发表于 2020-9-14 17:45

1图也没有。全挂了。

Hmily 发表于 2020-9-14 17:46

安卓梦雪 发表于 2020-9-14 17:43
可是我上传图片他说没合法的文件被上传

你把图片重新截图试下?怀疑有什么特征码导致被拦截了。
页: [1] 2 3 4
查看完整版本: 「梦雪原创」存档注入原理(存档注入包分析)