《NativeAOT》逆向開發工具 快速閱讀精華
- 🛠️ 核心功能:
- 提供 Object、String、Array 等基礎 .NET 類型的 C++ 封裝。
- 內建運行時助手 (RuntimeHelper) 與 GC 控制功能。
- 支援虛擬方法調用 (Virtual Method Calls) 與反射 (Reflection)。
- ⚡ 適用對象:
- 針對 Hytale 或其他使用 NativeAOT 技術編譯的遊戲。
- C++ 逆向工程師、模組開發者 (Modder)。
- 需要處理內存、Hook 與垃圾回收機制的開發者。
- 📦 包含內容:
- 完整的 Source Code 封裝庫。
- Hytale 專用的特徵碼 (Patterns) 與偏移量 (Offsets)。
前言:為什麼需要這個封裝庫?
對於熱愛鑽研遊戲底層的玩家與開發者來說,NativeAOT (Ahead-of-Time 編譯) 技術一直是一道坎。不同於傳統的 .NET 程式,NativeAOT 將 C# 直接編譯為原生碼,這使得原本容易使用的反射 (Reflection) 和類型系統變得難以直接從外部存取。
今天我們要分享一套由開發者製作的 通用 C++ 封裝庫 (Wrapper Lib)。這套工具主要針對 NativeAOT 應用程式(例如目前備受矚目的沙盒遊戲《Hytale》),它將原本複雜的 .NET 內部類型(如 Object, String, generic Array 等)進行了標準化封裝,讓你可以在 C++ 環境中更輕鬆地進行模組開發、內存修改或功能 Hook。
這不僅僅是一個針對 Hytale 的工具,更是一個通用的 NativeAOT 逆向解決方案,能為你在處理虛擬方法表 (vtable) 和垃圾回收 (GC) 時節省大量的時間。
👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app

核心功能解析:GC控制與反射
這套封裝庫最強大的地方在於它處理了最棘手的「垃圾回收」與「類型反射」問題。以下是幾個關鍵的代碼範例與功能說明:
1. 虛擬方法調用 (Virtual Method Calls)
在庫中,開發者封裝了 `CallVirtual` 方法,讓你只需要知道 vtable 的索引 (index) 即可調用對應的函數。
代碼說明: 這是 `Object::Equals` 的實作,它自動傳遞了 `this` 指針,你只需要傳入參數即可。
- bool Object::Equals(Object* obj) const
- {
- // OBJECT_VTABLE_EQUALS 是虛表索引,'this' 會被默認傳遞
- return this->CallVirtual<bool>(OBJECT_VTABLE_EQUALS, obj);
- }
複製代碼
2. 垃圾回收控制 (GC Region)
在進行高強度的內存操作或 Hook 時,如果剛好遇到 .NET 的 GC (垃圾回收) 觸發,很容易導致遊戲崩潰。這個庫提供了 `StartNoGCRegion` 功能,允許你暫時禁止 GC。
代碼說明: 透過分配緩衝區來暫停 GC,確保代碼執行期間的安全性。注意這通常需要在 `ExecutionEngine::CreateThread` 創建的線程中運行,而非普通的 Win32 線程。
- // 請求 10MB 的無 GC 區域
- GC::StartNoGCRegionStatus startStatus = GC::StartNoGCRegion(10 * 1024 * 1024, true);
- if (startStatus == GC::StartNoGCRegionStatus::Succeeded)
- {
- // 在這裡執行你的核心邏輯 (Magic happens here)
- ```
- // 結束後記得恢復 GC
- GC::EndNoGCRegionStatus endStatus = GC::EndNoGCRegion();
- ```
- }
- else
- {
- LOGERROR("Failed to GC::StartNoGCRegion: %d", startStatus);
- }
複製代碼
3. 類型反射 (Reflection Dump)
想要知道遊戲中有哪些類別、成員變數或方法?這個庫封裝了 `GetMembers`,讓你可以像在 C# 中一樣遍歷成員。
- RuntimeType* type = ...; // 獲取類型指標
- std::wstring typeFullName = type->GetFullName()->WStr();
- // 獲取所有公開、私有、靜態與實例成員
- Array<MemberInfo*>* members = type->GetMembers(BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Static | BindingFlags::Instance | BindingFlags::DeclaredOnly);
- LOGINFO("Type '%ls' contains %d members", typeFullName.c_str(), members->GetLength());
- for (MemberInfo* member : members)
- {
- // 這裡可以進一步 Dump 成員資訊
- this->DumpMember(member->As<NativeFormatMethodCommon>());
- }
複製代碼
實戰教學:如何調用與 Hook
在 NativeAOT 環境下進行 Hook,最常見的問題是參數類型的識別。由於所有類型在底層都繼承自 `Object`,我們可以利用封裝好的 `ToString()` 方法來識別傳入的參數。
Hook 範例
以下是一個針對特定函數 (地址偏移量 `0x144620`) 的 Hook 範例:
操作邏輯:
1. 定義原始函數的指針類型。
2. 在 Hook 函數中,將參數 `a1` 和 `a2` 轉換為字串並打印到日誌,方便除錯。
3. 最後調用原始函數,確保遊戲邏輯不中斷。
- // 定義函數原型:在 .NET 中所有類型都繼承自 object
- typedef __int64(__fastcall* sub_7FF77D144620)(Object* a1, String* a2, uint64_t* a3);
- sub_7FF77D144620 Original_144620 = nullptr;
- static __int64 __fastcall hksub_7FF77D144620(Object* a1, String* a2, uint64_t* a3)
- {
- // 使用 ToString() 識別參數內容
- ThreadedLogger::Push(a1->ToString()->Str());
- ThreadedLogger::Push(a2->Str());
- ```
- return Original_144620(a1, a2, a3);
- ```
- }
複製代碼
關鍵特徵碼 (Patterns) 與初始化
這個庫本身只是一個框架,要讓它工作,你必須在 DLL 入口點 (Entry Point) 初始化相關的 API 變量。作者提供了目前版本的 Hytale 及其運行時 (Runtime) 的特徵碼。
注意: 遊戲更新後這些特徵碼可能會失效,請學會使用 CE 或 IDA 重新搜尋。
特徵碼掃描初始化
你不需要初始化所有功能,只需初始化你會用到的部分。以下是初始化的核心代碼:
- // 在你的 DLL Main 或初始化線程中調用
- PATTERN_SCAN(NativeAOT::API::GCToEEInterface_CreateThread, Patterns::GCToEEInterface_CreateThread, gameBase);
- PATTERN_SCAN(NativeAOT::API::Object_ToString, Patterns::Object_ToString, gameBase);
- PATTERN_SCAN(NativeAOT::API::Object_GetType, Patterns::Object_GetType, gameBase);
- // ... (其他 API 初始化)
- // 初始化偏移量
- GET_OFFSET(NativeAOT::VTable::AssemblyName, gameBase, Offsets::S_P_CoreLib_System_Reflection_AssemblyName);
複製代碼
🔽 檔案下載與安裝說明
安裝步驟:
- 下載附件壓縮檔。
- 將 `NativeAOT.h` 與 `NativeAOT.cpp` 加入你的 C++ 專案中。
- 在你的程式碼中引用 `#include "NativeAOT.h"`。
- 參考 Readme 文件進行 API 初始化。
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用
相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
重點回顧
- 這是一個針對 NativeAOT 遊戲 (如 Hytale) 的 C++ 開發框架。
- 必須先進行 Pattern Scan 初始化變量後才能使用。
- 內建強大的 GC 管理與反射功能,是製作內掛的絕佳基底。
常見問題 Q&A
Q:這個庫只能用在 Hytale 嗎?
不完全是。雖然提供的特徵碼 (Patterns) 是針對 Hytale 的,但這個庫的架構 (Wrapper lib) 是通用的。如果你在逆向其他使用 .NET NativeAOT 的應用程式,只需要更新特徵碼即可使用。
Q:為什麼呼叫 StartNoGCRegion 會失敗?
通常是因為你在錯誤的線程中呼叫。請確保你在 `ExecutionEngine::CreateThread` 創建的線程中執行此操作,或者確保當前線程已經附加到 CLR 上。
Q:編譯時出現錯誤怎麼辦?
請確認你已將 `NativeAOT.cpp` 加入編譯單元 (Compilation Units),而不僅僅是引用標頭檔。同時確保你的專案設定支援 C++17 或更高版本。
Q:特徵碼失效了怎麼辦?
遊戲更新後,內存地址和字節碼可能會變動。你需要使用 IDA Pro 或 Cheat Engine,根據舊的特徵碼邏輯去尋找新的地址,並更新 `DEFINE_PATTERN` 中的數值。
Q:使用這個會導致封號嗎?
這屬於內存修改與注入行為,在多人線上模式下使用極高機率會被反作弊系統偵測並封鎖。請僅在單機模式或開發環境下使用。
|