Rust-based Unity resolver for Android,JNI_OnLoad 自動注入、Dobby Hook、模組化開發
《RustdroidModding》快速閱讀精華
- 🚀 這是一款用 Rust 語言撰寫的 Android IL2CPP/Unity 整理器,專門給想開發遊戲外掛或修改器的進階玩家使用
- 🔧 核心功能:透過 JNI_OnLoad 自動注入、用 Dobby 進行函數 Hook、執行期整理 IL2CPP 符號
- 💡 適合對象:有 Rust 基礎、想自己打造 Android 遊戲記憶體修改工具或自動化腳本的開發者
- ⚠️ 高風險操作:涉及記憶體修改與執行期掛勾,使用不當可能導致遊戲閃退或帳號停權
前言:為什麼需要 RustdroidModding?
如果你曾經想過「怎麼在 Android 遊戲裡寫自己的修改器」,卻發現傳統工具像 GameGuardian 或 Cheat Engine 不夠靈活,那 RustdroidModding 就是為你準備的進階方案。
這個框架用 Rust 語言打造,專門處理 Unity IL2CPP 遊戲的記憶體整理與函數掛勾。白話說,它能讓你在遊戲執行時「攔截」原本的功能,換成你自己的邏輯——比如無限金幣、透視、加速等等。
核心功能與技術架構
RustdroidModding 採用模組化設計,主要檔案分成五個區塊:
| 模組檔案 | 功能說明 | | lib.rs | 主程式進入點,負責 JNI_OnLoad 與模組初始化 | | il2cpp.rs | IL2CPP 符號整理,透過 dlsym 動態查找函數位址 | | unity.rs | Unity 引擎相關型別與輔助函數封裝 | | detour.rs | Dobby Hook 介接,負責函數攔截與跳轉 | | logging.rs | android_logger 初始化,可自訂 log tag |
執行流程整理
- 遊戲載入 .so 檔案 → 觸發 JNI_OnLoad
- 初始化日誌系統,開始記錄除錯資訊
- 呼叫 try_load(),用 dlsym 查找 il2cpp_init 位址
- 成功找到後,用 Dobby 掛勾(Hook)該函數
- Hook 觸發時 → 呼叫原始函數 → 再呼叫 on_loaded()
- 開發者在 on_loaded() 裡寫入自己的修改邏輯
⚠️ 重要提醒:使用風險與限制
這類工具屬於底層記憶體操作,使用前請務必瞭解:
- 雙重保險機制失效風險:如果 il2cpp_init 無法掛勾,且備援的 il2cpp_class_from_il2cpp_type 也掛勾失敗,on_loaded() 會「盲開」——也就是說,遊戲可能根本還沒準備好,你的修改邏輯就會執行,導致閃退或不可預期的錯誤
- 線上遊戲封鎖風險:任何記憶體修改行為都可能被反作弊系統偵測,建議僅於離線模式或私人伺服器測試
- 必須保留原始呼叫:除非你真的想阻擋該功能,否則 Hook 內一定要呼叫 ORIGINAL,否則遊戲核心功能會壞掉
開發環境建置需求
想編譯這個專案,你的開發環境需要準備:
- Rust 工具鏈:已安裝 rustc 與 cargo
- aarch64-linux-android target:透過 rustup 新增
- Android NDK:下載並設定環境變數,或在 .cargo/config.toml 指定 linker 路徑
- CARGO_NDK_* 環境變數:確保編譯時能找到正確的 Android linker
編譯與建置教學
編譯指令
確保環境就緒後,在專案目錄執行:
cargo build --target aarch64-linux-android --release
編譯完成後,會在 target/aarch64-linux-android/release/ 產出 .so 檔案。
載入方式與使用範例
方法一:直接放入 APK
將編譯好的 .so 檔案放進反編譯後 APK 的 lib 資料夾對應架構目錄中。
方法二:搭配 Mod Loader
使用支援載入外部 .so 的 Mod 框架來注入。
方法三:Smali 手動注入(進階)
修改 smali 檔案,路徑:smali/com/unity3d/player/UnityPlayerActivity.smali
在 onCreate 方法的 locals 2 區塊下方加入:
const-string v0, "RustdroidModding"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
Hook 範例程式碼
lib.rs 內有範例可以參考,以下為 on_loaded() 中的典型寫法:
let cls = Class::find("Namespace", "ClassName")?;
match cls.hook("MetdodName", your_hook_fn as *mut u8) {
Some(tramp) => unsafe { ORIGINAL = Some(std::mem::transmute(tramp)) },
None => log::error!("hook failed"),
}
檔案下載點
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用
相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
常見問題Q&A
Q:這個工具跟 GameGuardian 有什麼不同?
A:GameGuardian 是現成的記憶體搜尋工具,而 RustdroidModding 是給開發者用的框架——你需要自己寫程式碼來定義要修改什麼、怎麼改。
Q:不會 Rust 可以用嗎?
A:不行,這個專案完全以 Rust 撰寫,需要具備 Rust 基礎語法與 Cargo 工具鏈使用經驗。
Q:為什麼 Hook 後遊戲會閃退?
A:最常見原因是 il2cpp_init 還沒準備好就執行了修改邏輯,或是你忘了在 Hook 內呼叫 ORIGINAL。建議檢查 logcat 日誌確認實際錯誤。
Q:這能用在所有 Unity 遊戲嗎?
A:只要是 IL2CPP 架構的 Unity 遊戲理論上都支援,但 Mono 架構的遊戲需要額外處理。另外,有強化反作弊的遊戲(如某些競技類)可能會攔截這類操作。
Q:編譯時找不到 linker 怎麼辦?
A:確認 Android NDK 已正確安裝,並且在 .cargo/config.toml 或環境變數中指定了正確的 CARGO_NDK_* 路徑。
《RustdroidModding》重點回顧
- RustdroidModding 是針對 Android IL2CPP 遊戲的 Rust 開發框架,核心價值在於「自動化符號整理 + 函數掛勾」
- 開發者只需專注寫 on_loaded() 內的邏輯,底層 Hook 機制已經封裝完成
- 務必注意「盲開」風險與線上遊戲封鎖風險,建議離線環境測試
|