搜尋

遊戲修改器

返回清單
切換到指定樓層
通知這文章過時或找檔案 發表主題

[電玩遊戲] 《Hytale/NativeAOT》通用 C++ 封裝庫 v1.0 免費下載 逆向開發與模組製作神器

[複製連結]
1
夢時代 ( Lv.50 智天使 ) 發表於 昨天 22:46 | 只看該作者 回覆獎勵 |升序瀏覽 |閱讀模式

《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` 指針,你只需要傳入參數即可。

  1. bool Object::Equals(Object* obj) const
  2. {
  3. // OBJECT_VTABLE_EQUALS 是虛表索引,'this' 會被默認傳遞
  4. return this->CallVirtual<bool>(OBJECT_VTABLE_EQUALS, obj);
  5. }
複製代碼


2. 垃圾回收控制 (GC Region)


在進行高強度的內存操作或 Hook 時,如果剛好遇到 .NET 的 GC (垃圾回收) 觸發,很容易導致遊戲崩潰。這個庫提供了 `StartNoGCRegion` 功能,允許你暫時禁止 GC。

代碼說明: 透過分配緩衝區來暫停 GC,確保代碼執行期間的安全性。注意這通常需要在 `ExecutionEngine::CreateThread` 創建的線程中運行,而非普通的 Win32 線程。

  1. // 請求 10MB 的無 GC 區域
  2. GC::StartNoGCRegionStatus startStatus = GC::StartNoGCRegion(10 * 1024 * 1024, true);

  3. if (startStatus == GC::StartNoGCRegionStatus::Succeeded)
  4. {
  5. // 在這裡執行你的核心邏輯 (Magic happens here)

  6. ```
  7. // 結束後記得恢復 GC
  8. GC::EndNoGCRegionStatus endStatus = GC::EndNoGCRegion();

  9. ```

  10. }
  11. else
  12. {
  13. LOGERROR("Failed to GC::StartNoGCRegion: %d", startStatus);
  14. }
複製代碼


3. 類型反射 (Reflection Dump)


想要知道遊戲中有哪些類別、成員變數或方法?這個庫封裝了 `GetMembers`,讓你可以像在 C# 中一樣遍歷成員。


  1. RuntimeType* type = ...; // 獲取類型指標
  2. std::wstring typeFullName = type->GetFullName()->WStr();

  3. // 獲取所有公開、私有、靜態與實例成員
  4. Array<MemberInfo*>* members = type->GetMembers(BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Static | BindingFlags::Instance | BindingFlags::DeclaredOnly);

  5. LOGINFO("Type '%ls' contains %d members", typeFullName.c_str(), members->GetLength());

  6. for (MemberInfo* member : members)
  7. {
  8. // 這裡可以進一步 Dump 成員資訊
  9. this->DumpMember(member->As<NativeFormatMethodCommon>());
  10. }
複製代碼


實戰教學:如何調用與 Hook



在 NativeAOT 環境下進行 Hook,最常見的問題是參數類型的識別。由於所有類型在底層都繼承自 `Object`,我們可以利用封裝好的 `ToString()` 方法來識別傳入的參數。

Hook 範例


以下是一個針對特定函數 (地址偏移量 `0x144620`) 的 Hook 範例:

操作邏輯:

1. 定義原始函數的指針類型。
2. 在 Hook 函數中,將參數 `a1` 和 `a2` 轉換為字串並打印到日誌,方便除錯。
3. 最後調用原始函數,確保遊戲邏輯不中斷。

  1. // 定義函數原型:在 .NET 中所有類型都繼承自 object
  2. typedef __int64(__fastcall* sub_7FF77D144620)(Object* a1, String* a2, uint64_t* a3);

  3. sub_7FF77D144620 Original_144620 = nullptr;

  4. static __int64 __fastcall hksub_7FF77D144620(Object* a1, String* a2, uint64_t* a3)
  5. {
  6. // 使用 ToString() 識別參數內容
  7. ThreadedLogger::Push(a1->ToString()->Str());
  8. ThreadedLogger::Push(a2->Str());

  9. ```
  10. return Original_144620(a1, a2, a3);

  11. ```

  12. }
複製代碼


關鍵特徵碼 (Patterns) 與初始化



這個庫本身只是一個框架,要讓它工作,你必須在 DLL 入口點 (Entry Point) 初始化相關的 API 變量。作者提供了目前版本的 Hytale 及其運行時 (Runtime) 的特徵碼。

注意: 遊戲更新後這些特徵碼可能會失效,請學會使用 CE 或 IDA 重新搜尋。

特徵碼掃描初始化


你不需要初始化所有功能,只需初始化你會用到的部分。以下是初始化的核心代碼:


  1. // 在你的 DLL Main 或初始化線程中調用
  2. PATTERN_SCAN(NativeAOT::API::GCToEEInterface_CreateThread, Patterns::GCToEEInterface_CreateThread, gameBase);
  3. PATTERN_SCAN(NativeAOT::API::Object_ToString, Patterns::Object_ToString, gameBase);
  4. PATTERN_SCAN(NativeAOT::API::Object_GetType, Patterns::Object_GetType, gameBase);
  5. // ... (其他 API 初始化)

  6. // 初始化偏移量
  7. 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:使用這個會導致封號嗎?
這屬於內存修改與注入行為,在多人線上模式下使用極高機率會被反作弊系統偵測並封鎖。請僅在單機模式或開發環境下使用。







大家正在看啥


收藏收藏 分享文章到FB上分享
回覆 使用道具 檢舉
複製專屬你的推廣連結:發至FB與各論壇宣傳:累積點數換GP商品 & 藍鑽
每五點閱率就可以兌換藍鑽積分或遊戲點卡 夢遊推廣文章換GP商品

你需要登入後才可以回覆 登入 | 加入會員

本版積分規則

Copyright (C) 2010-2020 夢遊電玩論壇

廣告合作:請直接聯繫我們,並附上您預刊登位置的預算。  

快速回覆 返回頂端 返回清單