SmmMem 快速閱讀精華
- 🚀 無需載入驅動程式:透過 SMM(系統管理模式)在 Ring -2 權限下直接讀寫 Windows 記憶體
- 🔑 ACPI WMI 門鈴機制:使用者模式應用程式透過 ACPI WMI 方法觸發 SMI,與 SMM 溝通
- 💪 完整 API 支援:提供行程查找、虛擬/實體記憶體讀寫、模組匯出整理等功能
- ⚠️ 高風險操作:需要燒錄自訂 UEFI 韌體,錯誤操作可能導致主機板磚壞
SmmMem 是什麼?
SmmMem 是一款無需載入驅動程式的 Windows 記憶體存取工具,讓一般使用者模式應用程式能夠在 Ring -2 權限下讀寫、整理 Windows 記憶體。這項技術透過 SMM(System Management Mode,系統管理模式)處理器模式運作,完全不需要安裝任何核心驅動程式。
傳統的記憶體修改工具(如 Cheat Engine 搭配驅動)需要在 Ring 0 核心層運作,而 SmmMem 則是將所有記憶體操作邏輯——包括分頁表查詢、虛擬位址轉實體位址(VA→PA)、行程查找、模組查找、匯出整理以及讀寫操作——全部交給在 Ring -2 執行的 SMM 處理常式處理。
核心概念與架構
SmmMem 專案包含兩個韌體元件:
| 元件名稱 | 功能說明 | | Dxe.efi | 分配共享信箱、設定 ACPI WMI 門鈴、發布信箱設定給 SMM,並嘗試透過 EFI_SMM_COMMUNICATION_PROTOCOL 進行早期設定 | | Smm.efi | 擷取信箱設定、註冊 SMI 處理常式、處理來自使用者模式 API 的記憶體請求,實際執行所有記憶體操作 |
當 Windows 啟動後,使用者模式的客戶端程式可以透過 ACPI WMI 方法發送請求。ACPI 方法會將請求複製到共享信箱,觸發軟體 SMI 呼叫,然後由 SMM 處理常式在 -2 層級處理該命令。
👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app
使用者模式 API 說明
安裝好韌體端之後,在 Windows 中使用 SmmMem 非常簡單。你不需要載入驅動、啟用測試簽章,或與任何核心元件互動。應用程式只需要包含 API 標頭檔、連結客戶端程式庫,然後呼叫標準 C 函式即可。
#include "Api.h"
int main(void) {
PROCESS_INFO Process = {0};
char Buffer[16] = {0};
Init();
FindProcessByName("notepad.exe", &Process);
ReadVirt(Process.Pid, Process.ImageBase, Buffer, sizeof(Buffer));
Close();
return 0;
}
目前 API 提供以下核心功能:
- 初始化/結束:Init()、Close()、Ping()
- 行程查找:FindProcessByPid()、FindProcessByName()
- 位址轉換:TranslateVirt()(虛擬位址轉實體位址)
- 虛擬記憶體存取:ReadVirt()、WriteVirt()
- 實體記憶體存取:ReadPhys()、WritePhys()
- 模組與匯出:FindModule()、FindKernelModule()、FindExport()
- 記憶體傾印:Dump()
一旦韌體安裝完成,你的使用者模式程式碼完全不需要操心 SMI、ACPI、內部 WMI 結構、信箱結構或分頁表——只需呼叫 API,SMM 就會處理所有工作。
ACPI WMI 門鈴溝通機制
溝通通道是這個專案最關鍵的部分。最直覺的解法是使用核心驅動:驅動程式將請求寫入共享信箱,直接觸發軟體 SMI。這確實可行,但如果使用者模式仍然需要核心驅動才能與 SMM 溝通,那這個專案的一大賣點就消失了。
因此,作者用 ACPI WMI 取代了核心驅動。
開機時,DXE 會安裝一個小型 SSDT,建立 ACPI WMI 裝置。Windows 透過標準 WMI 介面提供對此裝置的存取,因此一般使用者模式行程可以開啟它並呼叫方法。客戶端載入 Advapi32.dll,使用 WmiOpenBlock 開啟 WMI 區塊,並使用 WmiExecuteMetdodW 呼叫 ACPI WMI 方法。
內部來說,ACPI 方法執行三個動作:
- 將使用者模式請求緩衝區複製到共享信箱
- 將 SMI 值寫入 SMI 命令埠
- 將 SMM 回應緩衝區返回給使用者模式
這就是為什麼作者稱之為「門鈴」——SMM 程式碼並非在背景持續執行,也不會持續監控記憶體等待新命令。SMM 只有在處理器因 SMI 而進入 SMM 時才會被觸發。因此,單純將請求寫入記憶體是不夠的,必須有人「按下門鈴」。
安裝教學與編譯步驟
⚠️ 重要風險警告
燒錄修改過的韌體可能導致主機板磚壞,意味著主機板可能無法開機,甚至無法進入 BIOS。在嘗試之前,請確保你有可靠的復原方法,例如 BIOS Flashback、外部燒錄器,或其他復原途徑。
編譯韌體元件
- 開啟 x64 Visual Studio 開發人員命令提示字元
- 執行 src\build.cmd 編譯專案
- 編譯完成後會產生 Dxe.efi 和 Smm.efi 兩個檔案
UEFI 韌體燒錄
- 將 Dxe.efi 和 Smm.efi 加入你的韌體中並燒錄到主機板
- 最簡單的方法是直接替換現有的 DXE 和 SMM 模組(例如使用 UEFI Tools)
- 開機後觀察序列埠輸出,確認韌體初始化、信箱設定、ACPI WMI 設定和 SMI 處理常式註冊訊息
- 你需要將 COM 埠讀取器連接到主機板的序列標頭
使用者端程式編譯
- 在 Windows 中建立你的使用者模式應用程式
- 在專案中包含 Api.h
- 連結 Client.c 檔案
- 重要:編譯 Client.c 時必須定義 API_ONLY,以排除內建的測試 main 函式
MSVC 編譯範例:
cl /nologo /W4 /O2 /DAPI_ONLY app.c Client.c
使用前呼叫 Init(),使用完畢呼叫 Close()。溝通通過 ACPI WMI 進行,不需要核心驅動。
API 使用注意:韌體端必須先安裝完成,因為使用者模式 API 只透過 ACPI WMI 門鈴發送請求。實際的讀取、寫入、轉換、行程查找、模組查找和匯出整理工作都由 SMM 元件處理。
支援平臺與系統需求
| 項目 | 需求規格 | | 韌體平臺 | x64 UEFI 韌體,支援 AMI Aptio V 風格 PI SMM | | 作業系統 | Windows 10 或 Windows 11 | | 溝通機制 | ACPI WMI 命令,用於從使用者模式觸發 SMM 記憶體請求 | | 測試平臺 | ASUS TUF X870(AMD 平臺)、MSI Z790 EDGE(Intel 平臺) |
疑難排解與除錯
如果專案無法正常運作,請協助作者找出原因:
- 下載除錯版本的韌體
- 使用 DbgRead 擷取記錄檔
- 提供你的主機板名稱和使用的修補方法
檔案下載點
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用
相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
常見問題Q&A
Q:SmmMem 跟傳統核心驅動有什麼不同?
A:傳統驅動在 Ring 0 運作,而 SmmMem 透過 SMM 在 Ring -2 運作。最大的優勢是使用者端完全不需要載入任何驅動程式,規避了驅動簽章和防作弊驅動偵測的問題。
Q:什麼是 Ring -2?為什麼比 Ring 0 更高權限?
A:Ring -2 指的是 SMM(系統管理模式),這是 x86 處理器的一種特殊執行模式,比 Ring 0 核心模式擁有更高的權限和隔離性。SMM 通常用於處理系統層級功能如電源管理、溫度監控等。
Q:燒錄韌體有什麼風險?
A:錯誤的韌體燒錄可能導致主機板無法開機(俗稱「磚壞」)。強烈建議在操作前確認主機板支援 BIOS Flashback 或有外部燒錄器等復原手段。
Q:SmmMem 可以繞過哪些防作弊系統?
A:SmmMem 的設計重點是提供無驅動的記憶體存取能力。由於不涉及傳統驅動載入,可能規避依賴驅動偵測的防機制,但具體效果取決於各遊戲的防作弊實作。
Q:哪些主機板支援 SmmMem?
A:需要 x64 UEFI 韌體並支援 AMI Aptio V 風格 PI SMM。目前已測試 ASUS TUF X870(AMD)和 MSI Z790 EDGE(Intel),但其他符合規格的主機板理論上也可使用。
Q:如何確認韌體是否正確安裝?
A:開機時透過序列埠讀取器觀察輸出,應該能看到韌體初始化、信箱設定、ACPI WMI 設定和 SMI 處理常式註冊的訊息。
Q:編譯時出現重複定義錯誤怎麼辦?
A:編譯 Client.c 時務必定義 API_ONLY 巨集,這會排除檔案內建的測試 main 函式,避免與你的應用程式主函式衝突。
|