前言
這篇是用 DnSpy 反編譯 Mono Build 的 Unity App
還有用 Il2CppDumper 反編譯 IL2CPP Build
DnSpy 反編譯 Mono Build
一樣用我高一的物理作業當例子
用 DnSpy 打開 Assembly-CSharp.dll
(File > Open)
<app目錄>\<app名稱>_Data\Managed\Assembly-CSharp.dll
打開後可以在 Assembly Explorer 看到 ball 這個 Script
反編譯的結果是這樣的:
using System; using UnityEngine; // Token: 0x02000002 RID: 2 public class ball : MonoBehaviour { // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250 private void Start() { Object.Instantiate<GameObject>(this.self); } // Token: 0x06000002 RID: 2 RVA: 0x00002060 File Offset: 0x00000260 private void FixedUpdate() { this.timer += Time.deltaTime; if (this.timer >= 0.4f && !this.Grounded) { this.timer = 0f; Object.Instantiate<GameObject>(this.self, base.transform.position, base.transform.rotation); } } // Token: 0x06000003 RID: 3 RVA: 0x000020C1 File Offset: 0x000002C1 private void OnCollisionEnter(Collision collision) { this.Grounded = true; } // Token: 0x04000001 RID: 1 public GameObject self; // Token: 0x04000002 RID: 2 private float timer; // Token: 0x04000003 RID: 3 private bool Grounded; }
不能說很像,只能說一模一樣
試玩一下這個 App,按下 Drop 後會放掉球
假設我覺得這個軌跡不夠密集,該怎麼 Patch 呢?
很簡單,對著你想修改的部分按右鍵就好了
原本是每 0.4 秒產生一次,現在我改成每 0.1 秒產生一次
Compile 可能會報錯,照著錯誤訊息修改一下就可以了
成功 Compile 之後可以看到我們做的修改
修改完成後記得要存檔(ctrl + shift + s)
存檔完就可以去看看效果
接下來就可以發揮你的想像力了,例如我想修改球的大小
那結果就會是這樣的
IL2CPP
前面說到如果是 Mono Build 可以直接用 DnSpy,但遊戲廠商也不傻,基本上都會用上 IL2CPP
有的還會加殼,不過那應該可以再寫一篇了
總之想要逆向 IL2CPP 可以用 Il2CppDumper + IDA
- Il2CppDumper
執行 Il2CppDumper.exe
依序選擇 GameAssembly.dll
和 global-metadata.dat
<app目錄>\GameAssembly.dll
<app目錄>\<app名稱>_Data\il2cpp_data\Metadata\global-metadata.dat
- DnSpy
Assembly-CSharp.dll
Il2CppDumper\DummyDll\
可以看到函數名稱和變數等,接下來還需要反編譯出內部邏輯
- IDA
GameAssembly.dll
<app目錄>\GameAssembly.dll
接下來要用到 ida_with_struct_py3.py
這個腳本
在 IDA 裡按 Alt + F7 或是 File > Script File 選擇腳本
再來是 script.json
最後是 il2cpp.h
- 成功ㄌ
後記
沒想到 Il2CppDumper 跟 AssetStudio 的作者是同個人