快速閱讀精華
- 🚀 手動映射技術:跳過 Windows 系統載入器,直接在目標記憶體重建 DLL 的 PE 結構,真正做到無痕跡載入
- 🛡️ 反作弊迴避:傳統 LoadLibrary 會在 PEB 的 LDR 鏈表留下記錄,Manual Map 完全規避此檢測點
- ⚡ 39-byte 極簡 Shellcode:使用精簡的 x64 組語 Stub 直接呼叫 DllMain,無需額外執行緒管理
- 🎮 Marvel Rivals 適配:專為《漫威終極對決》外掛開發設計,支援手動重定位與匯入表整理
目錄
前言介紹
開發《漫威終極對決》外掛或修改器時,最讓人頭痛的往往不是功能實作,而是如何繞過反作弊系統的 DLL 注入檢測。傳統的 LoadLibrary 注入雖然簡單,但會在目標程序的 PEB(Process Environment Block)中留下明確的模組記錄,現代 AC(Anti-Cheat)系統幾秒內就能掃描並標記。
底下我們要介紹的這款 Manual Map Injector,採用進階的手動映射技術,直接在目標記憶體空間重建 DLL 的 PE 結構,完全繞過 Windows 的系統載入器。這意味著 PEB 中不會出現你的 DLL 紀錄,達到真正的隱形注入。
【重要提醒】
- 本工具僅供遊戲開發測試與學術研究使用,請勿用於線上多人遊戲作弊
- 使用此類注入工具可能違反遊戲服務條款,導致帳號永久停權
- 執行前請確保已關閉防毒軟體即時監控,避免誤報刪除
Manual Map 技術整理
所謂的 Manual Mapping(手動映射),指的是不依靠 Windows 的 LoadLibrary API,而是由注入器自己完成原本作業系統載入器的工作。這個過程包含幾個關鍵步驟:
- PE 結構重建:讀取目標 DLL 的 DOS/NT Headers,計算需要的記憶體大小
- 遠端記憶體分配:使用 VirtualAllocEx 在目標程序中配置足夠的記憶體空間(PAGE_EXECUTE_READWRITE)
- 區段複製:將 DLL 的各個 Section(.text, .data, .rdata 等)依 VirtualAddress 寫入對應位置
- 重定位處理:如果載入基底與 Preferred Base 不同,需修正 IMAGE_REL_BASED_DIR64 類型的重定位表
- 匯入表整理:手動載入依賴的系統 DLL(kernel32, ntdll 等),並用 GetProcAddress 整理函數位址填入 IAT
- 執行入口點:建立執行緒呼叫 DllMain,傳入 DLL_PROCESS_ATTACH
與 LoadLibrary 的關鍵差異
為什麼要費這麼大功夫手動映射?底下是與傳統 LoadLibraryW 注入的詳細對比:
| 檢測項目 | LoadLibrary 注入 | Manual Map 注入 | | PEB LDR 鏈表 | 會新增 LDR_DATA_TABLE_ENTRY,AC 可掃描列舉 | 無 LDR 記錄,模組隱形 | | 記憶體分頁屬性 | 依 Section 設定(.text RX, .data RW) | 初始為 RWX,可手動細分 | | TLS 回呼 | 系統自動處理 LdrpHandleTlsData | 需手動實作,否則 __declspec(tdread) 失效 | | 例外處理表 | 系統註冊 SEH 表 | 未註冊,C++ 例外拋出會崩潰 | | GetModuleHandle | 可正常取得 HINSTANCE | 回傳 NULL,需自行快取 DllMain 參數 |
【小知識】 許多現代反作弊系統(如 Marvel Rivals 使用的方案)會定期掃描 PEB 的 InLoadOrderModuleList 來比對硬碟上的模組雜湊。Manual Map 因為完全不經過系統載入器,所以能完美規避這類檢測。
注入器使用教學
這款注入器採用命令列介面,使用方式非常簡潔:
- 首先確認《漫威終極對決》已經在執行中
- 將注入器執行檔(svc_host.exe)與目標 DLL 放在同一目錄
- 開啟命令提示字元,輸入以下指令:
svc_host.exe <目標程序名稱> <DLL檔案名稱> - 範例:
svc_host.exe MarvelRivals.exe core.dll - 注入成功後會顯示遠端記憶體基底位址與執行緒退出碼
【注意事項】
- 目標 DLL 必須是 x64 架構,與遊戲程序一致
- 注入器需要管理員權限執行才能開啟目標程序的控制代碼
- 如果顯示 "liveness timeout",表示 DLL 的 Worker Thread 未正確建立互斥體(Mutex)
核心程式碼解說
這個注入器的核心在於 StageImage 函式,它負責在本地重建整個 PE 映像,然後一次性寫入目標程序。底下是關鍵技術環節:
- 重定位處理:只處理 IMAGE_REL_BASED_DIR64 類型,這對 x64 程序已足夠。如果載入位址與 Preferred Base 不同,會計算 Delta 並修正記憶體位址。
- 匯入表整理技巧:這是此注入器最聰明的設計。它在注入器程序中呼叫 LoadLibrary 和 GetProcAddress,然後將取得的函數位址直接寫入目標 DLL 的 IAT(Import Address Table)。
這之所以能運作,是因為 Windows 的 KnownDlls 機制:kernel32、ntdll 等系統 DLL 在每個程序中都映射到相同的實體記憶體頁面,且每個開機週期的基址(ASLR)是固定的。因此注入器中取得的 kernel32!CreateFileW 位址,在目標程序中也是有效的。
- 39-byte Shellcode:這段極簡組語負責設定 x64 呼叫慣例(RCX=HINSTANCE, EDX=1=DLL_PROCESS_ATTACH, R8=0),分配 Shadow Space(sub rsp, 0x28),然後跳轉到 DllMain 入口點。完成後恢復堆疊並返回。
檔案下載點
底下提供本次介紹的 Manual Map Injector 編譯版本下載。此工具僅供遊戲修改研究與本地測試使用,請勿用於線上對戰影響他人遊戲體驗。
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用
相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
常見問題Q&A
Q:為什麼注入後 GetModuleHandle 會回傳 NULL?
- 這是 Manual Map 的正常行為。因為我們跳過了系統載入器,沒有在 PEB 的 LDR 鏈表中註冊模組,所以系統函式無法查詢到此 DLL。解決方法是在 DllMain 中將第一個參數(HINSTANCE)儲存到全域變數供後續使用。
Q:使用這個注入器會被 Marvel Rivals 的反作弊系統偵測到嗎?
- 此注入器採用的 Manual Map 技術確實能規避基於 PEB 掃描的傳統檢測,但現代反作弊系統(如 Marvel Rivals 使用的方案)還會監控記憶體完整性、執行緒建立行為、以及異常的記憶體權限(RWX)。此工具僅提供基礎的無 LDR 注入,建議搭配額外的記憶體保護繞過技術使用。
Q:為什麼我的 DLL 使用了 __declspec(tdread) 變數後會當機?
- Manual Map 不會呼叫 LdrpHandleTlsData,因此不會為執行緒本地儲存(TLS)分配插槽。使用 __declspec(tdread) 修飾的變數會讀取到垃圾位址導致崩潰。建議改用普通的全域變數,或者手動實作 TLS 回呼機制。
Q:這個注入器支援 32 位元程序嗎?
- 此範例程式碼專為 x64 架構設計,使用了 x64 特定的重定位類型(IMAGE_REL_BASED_DIR64)以及 x64 呼叫慣例的 Shellcode。若要注入 32 位元程序,需要修改重定位處理邏輯(改為 HIGHLOW)以及重新編寫 32 位元的 Shellcode(使用 push 參數而非暫存器)。
Q:為什麼注入後遊戲還是偵測到了異常?
- 除了 PEB 掃描,現代反作弊還會檢查:(1) 記憶體權限異常(如整個映像檔為 RWX);(2) 未簽署的記憶體區塊執行;(3) 遠端執行緒建立的時機與行為模式。此基礎注入器僅解決了 PEB 可見性問題,建議進一步實作記憶體權限細分(.text RX, .data RW)以及 APC 注入或 Thread Hijacking 等進階技術來降低被偵測機率。
|