《Minecraft》外部JVM記憶體讀取 快速閱讀精華
🎯 核心概念 :透過外部程序讀取 java.exe 記憶體,整理 JVM HotSpot 結構,無需注入遊戲 程序即可取得玩家座標、世界實體等資料 🔧 技術架構 :Attach 到 java.exe → 定位 jvm.dll → 整理 Klass/Field 結構 → 建立 Minecraft SDK → ImGui + DX11 繪製覆蓋層 ⚠️ 重要提醒 :程式碼僅供學術參考,部分偏移值為特定版本專屬,直接使用可能導致遊戲崩潰或帳號限制 📦 內容物 :Process/RPM 包裝器、HotSpot 字典掃描、類別欄位查找、Entity ESP / Items ESP 範例模組
本文章目錄
外部JVM注入技術簡介
這是一個針對 Minecraft Java 版的外部記憶體讀取範例專案 ,展示如何在不注入遊戲程序的情況下,透過讀取 java.exe 的記憶體空間來取得遊戲內部資料。
傳統的遊戲修改通常需要將 DLL 注入到目標程序中,但這個專案採用外部附加(External Attach) 的方式,僅透過 Windows API 的 ReadProcessMemory 來整理 JVM 的 HotSpot 結構,從而降低被反作弊系統偵測的風險。
👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app
重要提醒與風險聲明
學術參考性質 :此原始碼並非完整的商業級產品,部分程式碼較為雜亂,偏移值(Offsets)與混淆名稱對應表(Mappings)僅適用於特定 Minecraft 版本,直接使用可能導致遊戲崩潰。使用風險 :雖然外部讀取比內部注入更難被偵測,但 Hypixel 等伺服器仍可能透過行為分析或記憶體完整性檢查發現異常,導致帳號遭到限制。法律聲明 :本技術僅供遊戲修改學習與單機模式使用,在多人連線伺服器中使用可能違反服務條款,請自行評估法律風險。
HotSpot結構整理原理
Minecraft Java 版運行在 Java Virtual Machine(JVM)上,而 HotSpot 是 Oracle/OpenJDK 的預設虛擬機實作。要從外部讀取遊戲資料,關鍵在於整理 JVM 內部的 Klass 結構 。
整個流程分為以下幾個步驟:
附加到進程 :透過 OpenProcess 取得 java.exe 的 HANDLE,具備 PROCESS_VM_READ 權限。定位 JVM.dll :掃描進程模組列表,找到 jvm.dll 的基址,這是 HotSpot 的主要實作檔案。整理全局符號 :在 jvm.dll 的記憶體空間中搜尋特定的全局變數(如 Universe::_collectedHeap、SystemDictionary::dictionary),這些指標指向 JVM 的核心資料結構。掃描類別字典 :透過 SystemDictionary 走訪所有已載入的 Klass(Java 類別在 JVM 中的內部表示),比對類別名稱的符號(Symbol)來定位目標類別,如 net.minecraft.client.Minecraft。整理欄位偏移 :找到目標 Klass 後,讀取其 FieldInfo 結構,取得各欄位(如 player、world、renderManager)在物件記憶體中的偏移量,後續即可透過這些偏移讀取實際資料。
這種方式不需要注入任何 DLL 到 JVM 中,純粹透過 Windows API 讀取記憶體,因此對遊戲程序來說是「隱形」的。
SDK功能與ESP模組說明
專案內部已經針對 Minecraft 的常用物件建立了包裝器(Wrapper),將複雜的記憶體讀取封裝成簡單的 C++ 類別:
類別名稱 對應遊戲物件 主要功能 CMinecraft net.minecraft.client.Minecraft 取得遊戲實例、玩家物件、世界資訊、視角矩陣 CPlayer net.minecraft.client.entity.EntityPlayerSP 玩家座標、生命值、手持物品、視線方向 CWorld net.minecraft.client.multiplayer.WorldClient 世界中的實體列表、方塊資訊 CEntity net.minecraft.entity.Entity 通用實體資訊(怪物、動物、物品實體) CRenderManager net.minecraft.client.renderer.EntityRenderer 視角矩陣、投影參數,用於世界座標轉螢幕座標
基於這些包裝器,範例中提供了兩個基礎模組:
Player ESP(玩家透視) :讀取世界中的所有玩家實體,將其位置轉換為螢幕座標,並在 ImGui 覆蓋層上繪製方框與血量條。這個範例展示瞭如何處理實體迭代與世界轉螢幕的數學運算。Items ESP(物品透視) :針對地面上的物品實體(EntityItem)進行追蹤,繪製物品名稱與距離。這個範例側重於如何識別特定實體類型並讀取其 NBT 資料(如物品堆疊資訊)。
原始碼下載與編譯說明
這個專案主要作為技術參考,程式碼風格與結構並非最佳化,且硬編碼的偏移量需要根據你的 Minecraft 版本進行調整。
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用 相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
編譯前請確認以下環境:
Visual Studio 2019 或更新版本,具備 C++17 支援 Windows SDK 10.0.19041.0 或更新版本 DirectX 11 SDK(已包含於 Windows SDK) ImGui 原始碼(需放置於專案目錄的 ImGui/ 資料夾中)
編譯步驟:
解壓縮下載的 Gift2 檔案 使用 Visual Studio 開啟 .sln 方案檔 確認平臺設定為 x64 Release(因 Minecraft 通常為 64 位元) 建置方案(Build Solution) 將產生的 DLL/EXE 放置於獨立資料夾,並確保 ImGui 的字型檔案(如有使用)位於正確路徑
使用前設定:
在執行程序前,你需要編輯 Source/Offsets.h(或類似標頭檔),根據當前 Minecraft 版本更新以下數值:
klass_Minecraft :Minecraft 類別在 JVM 中的內部名稱雜湊或符號指標(版本不同,混淆名稱會變化)field_tdePlayer :tdePlayer 欄位在 Minecraft 類別中的偏移量field_tdeWorld :tdeWorld 欄位偏移量klass_Entity :Entity 基礎類別資訊
這些偏移量可以透過分析 Minecraft 的 obfuscation map(混淆對照表)或使用記憶體掃描工具(如 Cheat Engine )在遊戲運行時手動找出。
常見問題Q&A
Q:這個程式會被 Minecraft 的反作弊系統偵測到嗎?
理論上,由於這是外部讀取(External) 而非 DLL 注入(Internal),並且沒有修改遊戲記憶體的內容,僅僅是讀取資料,因此對於傳統的簽名掃描或記憶體完整性檢查來說,確實比內部注入更難以偵測。然而,Hypixel 等伺服器可能會透過行為分析 (如觀察你的操作反應時間是否過於完美)來判斷是否使用輔助工具。此外,如果防護軟體掃描到你在讀取 java.exe 的記憶體,仍可能標記為可疑行為。
Q:這個範例支援哪個版本的 Minecraft?
原始碼中的偏移量和混淆名稱對應表(Mappings)是針對特定版本硬編碼的(根據作者描述,這是舊專案)。如果你想用在較新的版本(如 1.20+),你必須手動更新 Source/Offsets.h 中的數值,或者重新分析新版本的 jvm.dll 與 Minecraft 的類別結構。這需要具備 Java 位元組碼與 JVM 記憶體佈局的進階知識。
Q:為什麼選擇外部讀取而不是傳統的 DLL 注入?
外部讀取(External)與內部注入(Internal)各有優劣。外部讀取的主要優勢在於穩定性與安全性 :由於程式碼運行在獨立的進程中,即使你的程式崩潰也不會導致遊戲閃退;同時,因為沒有在遊戲地址空間中執行可疑代碼,對於 Ring3 層級的反作弊掃描有較強的抵抗性。然而,缺點是讀取速度較慢(需要透過 Windows API 跨進程讀取),且無法直接調用遊戲內的函數或修改記憶體(只能讀取),因此無法實現如「無敵模式」或「瞬移」等需要修改伺服器校驗資料的功能。
Q:編譯時出現「無法找到 ImGui.h」或 DirectX 相關錯誤怎麼辦?
這通常是因為專案設定中的「Include Directories」沒有正確指向你的 ImGui 與 DirectX SDK 路徑。解決步驟如下:
確認你已從 ImGui GitHub 下載原始碼,並將整個資料夾放置於專案目錄下(例如與 .sln 同層的 ImGui/ 資料夾)。 在 Visual Studio 中,對專案點擊右鍵 → Properties → Configuration Properties → C/C++ → General → Additional Include Directories,加入 `$(SolutionDir)ImGui;`(路徑依你的實際擺放位置調整)。 對於 DirectX 錯誤,確認你的 Windows SDK 版本在專案設定中是已安裝的版本(Project Properties → General → Windows SDK Version)。 如果缺少 d3d11.lib 連結錯誤,檢查 Linker → Input → Additional Dependencies 是否包含 d3d11.lib 與 d3dcompiler.lib。
Q:如何找到新版本的偏移量(Offsets)?
更新偏移量需要結合 Cheat Engine 與 Java 位元組碼分析工具。簡易流程如下:
使用 CE 附加到 java.exe,搜尋已知數值(如你的玩家座標 X),找到記憶體位址。 分析該位址附近的記憶體佈局,找到指向 Entity 或 World 物件的指標。 使用 Recaf 或 JD-GUI 反編譯 Minecraft 的 .jar 檔案,查看目標類別的欄位名稱與型別。 在 Source/Offsets.h 中更新對應的類別名稱雜湊值與欄位偏移量。
這需要一定的 C++ 與 Java 底層知識,不建議程式設計初學者嘗試修改。