安卓U3D逆向從Assembly-CSharp到il2cpp

隨著unity技術的發展及廠商對於腳本源碼的保護,很大一部分U3D應用的scripting

backend已經由mono轉為了il2cpp,本文從unity簡單應用的製作講起,介紹U3D應用腳本的Assembly-CSharp.dll的逆向及il2cpp.so的逆向分析。

目錄如下:

0x1.U3D應用製作 → 輸出兩個apk,分別為mono和il2cpp

0x2.mono後台apk的逆向分析 → Assembly-CSharp.dll 逆向修改

0x3.il2cpp後台apk的逆向分析 → il2cpp.so逆向修改

正文內容:

0x1.U3D應用製作

工具:Unity最新版本 2017.2.1f1

1.1 創建Project

新建一個Unity3D Project,Project name為UnityTest,如下圖

1.2 創建script定義界面元素

創建GameObject和C# Script,均命名為Sample, 同時創建兩個UI Text,分別命名為HP和Attack。打開C# Script,進行界面元素的義,創建三個矩形按鈕分別為HP,ATK和LevelUP,設置點擊HP顯示100,點擊ATK顯示50,點擊LevelUP後HP和ATK的值都翻倍。

代碼如下:

using UnityEngine;using UnityEngine.UI;public class Sample : MonoBehaviour{public Text _hp;public Text _attack;private Rect _healRect = new Rect(10f, 20f, 300f, 100f);private Rect _attackRect = new Rect(10f, 170f, 300f, 100f);private Rect _LevelUpRect = new Rect(10f, 320f, 300f, 100f);public void SetHp(int hp){_hp.text = hp.ToString();}public void SetAttack(int attack){_attack.text = attack.ToString();}public void OnGUI(){int hp_value = 100;int attack_value = 50;if (GUI.Button(_healRect, "HP")){SetHp(hp_value);}if (GUI.Button(_attackRect, "ATK")){SetAttack(attack_value);}if (GUI.Button(_LevelUpRect, "LevelUp")){SetHp(hp_value * 2);SetAttack(attack_value * 2);}}}

代碼和界面完成後,我們設置包名(com.test.test)進行打包,分別輸出mono後台和il2cpp後台的apk。

點擊Player Setting進行後台設置,可點擊Scripting Backend選擇mono或者il2cpp。

得到的apk我們分別命名為Sample-mono.apk和Sample-il2cpp.apk。

安裝測試正常,界面如下:

初始界面

點擊HP和ATK後界面

點擊LevelUp後界面

至此,我們完成了兩種後台的apk的創建,接下來先對mono後台的apk進行逆向分析。

0x2.mono後台apk的逆向分析

工具:Android Killer,DnSpy

思路:將Sample-il2cpp.apk拖拽進Android

Killer進行反編譯,獲取到腳本文件/Assets/bin/Data/Managed/Assembly-CSharp.dll,dll拖進DnSpy進行反編譯分析,修改關鍵method後,保存並重新打包運行。

Android Killer部分不再上圖,Assembly-CSharp.dll拖拽進DnSpy,我們可以很輕易的找到我們需要的關鍵函數,如圖:

根據代碼信息,我們可以確定,num為初始HP,num2為初始ATK,我們在此通過編輯IL指令將他們的值分別改為1000和500,如圖:

確認後C#編碼變更如下:

保存後,重新打包apk安裝測試結果如下:

至此,我們的mono後台apk修改已經完成,接下來我們進行il2cpp後台apk的修改。

0x3.il2cpp後台apk的逆向分析

工具:Android Killer,il2cppDumper,IDA,010Editor

思路:利用il2cppDumper獲取到關鍵函數的offset後,使用IDA找到關鍵函數,分析彙編語言邏輯後,利用010Editor進行16進位文件編輯來實現修改。

Android Killer相關操作再次不做贅述,反編譯後我們得到的Project中,lib目錄如圖:

在此我們只分析armeabi-v7a文件夾下的libil2cpp.so,x86為intel架構,暫不做分析處理。

將il2cpp.so連同assetsinDataManagedMetadata 目錄下的global-metadata.dat 文件一起放進il2cppDumper目錄。

運行il2cppDumper,第一步,選擇il2cpp.so

第二步,選擇global-metadata.dat

進入到il2cppDumper控制台界面

選擇mode後可以得到Dump.cs,包含關鍵函數的偏移信息

打開Dump.cs,找到關鍵函數的偏移信息

用IDA打開libil2cpp.so文件,跳轉到此偏移地址 0x7CE514

定位到關鍵函數後,我們可以看彙編,也可以F5插件看偽代碼,為了便於理解我們這裡F5處理一下

這次我們從LevelUp入手,我們在編寫源碼的時候,是進行了乘以2的處理,為什麼彙編語言中是直接將翻倍後的數值進行傳參呢,因為彙編不會完全跟我們源碼的邏輯相同,但是結果一定是一樣的,LevelUp的彙編代碼如下

切換到對應的地址查看16進位

0xC8即為200,我們使用010Editor將其地址7CE6B4的值修改為FF(十進位為255)

保存後替換lib/armeabi-v7a目錄下的libil2cpp.so文件,打包運行,結果如下

至此,il2cpp後台的apk已修改完畢。

-------附件------

源碼見附件,下載後請先open scence再進行building,scence路徑Assets/Scences/Sample.unity

APK請網盤下載,如下:

鏈接: Sample-mono.apk 密碼: fua5

鏈接: Sample-il2cpp.apk 密碼: qpav

本文由看雪論壇 黯夏子風 原創 轉載請註明來自看雪社區

推薦閱讀:

旅行的青蛙Unity遊戲逆向修改Android&iOS
No Power No Shell --- 非PE攻擊中的套路
堆溢出研究二
CTF取證類題目指南

TAG:Unity遊戲引擎 | 軟體逆向工程 |