使用到的工具
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中找到相應位置修改代碼段
