安卓Unity3d游戏的逆向破解
使用到的工具
ApkToolBox
.NET Reflector
Reflexil(.NET程序编辑器)
.NET Reflector
Reflexil(.NET程序编辑器)
怎么判定它是Unity游戏呢
一般的路径格式是这样的assets\bin\Data\Managed
[如果是个Unity游戏却找不到dll文件那么骚年放弃吧。。。]
一般的路径格式是这样的assets\bin\Data\Managed
[如果是个Unity游戏却找不到dll文件那么骚年放弃吧。。。]
一般情况下都是修改上图的这个dll文件
[如果想要搜索的东西不在这个dll文件可借用UltraEdit、EditPlus、Notepad++等常用编辑工具辅助搜索来判断对哪个dll文件进行修改
以Jam City这款游戏为例来作以下分析:
内购破解部分就不讲了,因为下面将要修改的比内购的要来的痛快
用ApkToolBox反编译之后找到dll文件就是上图的那个文件用.NET Reflector打开
用ApkToolBox反编译之后找到dll文件就是上图的那个文件用.NET Reflector打开
[.NET Reflector工具的基本使用方法请自行百度
在手机上试玩了下这个游戏 篮板和抢断的路线根本就不明确嘛。。。
金币-Coin、等级-Level 那么着重修改这两个值吧
按下F3搜索,切换到方法搜索
搜到的内容这么多 改哪个呢 头疼啊!
等等!unity3d提供的有存档类啊!这是一大重要的切入点O(∩_∩)O~
unity3d提供了一个用于本地持久化保存与读取的类——PlayerPrefs。其工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值。
PlayerPrefs类支持3种数据类型的保存和读取,浮点型,整形,和字符串型。
游戏本地存档的主要方式无外乎xml文件和数据库存储两种,我们安装运行该游戏并简单的通过买物品和升级改变金币和等级的数值。
然后通过R.E.管理器进入/data/data/com.batteryacid.jamcity/shared_prefs/
果然我们发现了命名包含playerprefs的xml存档文件
果然我们发现了命名包含playerprefs的xml存档文件
查看该文件,如下图,我们发现了与游戏中数值对应的两个 字符串-整型 键值对条目:
金币Currency和等级CurrentLevel
金币Currency和等级CurrentLevel
我们回到.NET Reflector 切换到类搜索,搜索PlayerPrefs得到下图结果,双击进入位于Assembly-CSharp集中的PlayerPrefsx类
双击进入GetInt(String,Int32)整型方法,Tools ---- reflexil v1.6 开启reflexil工具
然后在第一行“Create new...”新建字符串类型(OpCade代码为ldstr),最后“Insert before select”插入到第一行前
在第二行新建整型(OpCade代码为ldc.i4)
在第三行新建方法(OpCade代码为call),
并在PlayerPrefsx类中选择GetInt(System.String,System.Int32)方法
并在PlayerPrefsx类中选择GetInt(System.String,System.Int32)方法
这样,我们就将Currency强制设置为66666668了
回到dll文件名这里,右键鼠标移到Reflexil v1.6保存dll
回到dll文件名这里,右键鼠标移到Reflexil v1.6保存dll
保存之后,F5刷新一下,如下图,代码中显示的是强制设置为了66666668
同理,我们也将等级CurrentLevel也强制设置为20
保存dll文件用IDE编译出来apk 看看效果
好了,初始金币和等级都修改成功
步骤回顾:
1、反编译apk
2、利用.NET Reflector反编译dll
3、通过Unity3d的PlayerPrefs方法了解其写入读取过程
4、通过查找存档xml文件找到相应控制条件
5、在dll中找到相应位置修改代码段
1、反编译apk
2、利用.NET Reflector反编译dll
3、通过Unity3d的PlayerPrefs方法了解其写入读取过程
4、通过查找存档xml文件找到相应控制条件
5、在dll中找到相应位置修改代码段