《PegaIo64.sys》快速閱讀精華
- 🎯 核心漏洞:驅動程式存在32位元物理位址截斷問題,限制可存取的記憶體範圍
- 🔧 四大原語:提供任意物理記憶體讀寫、I/O埠讀寫,但配置記憶體分配功能已損壞
- ⚠️ 使用限制:僅支援32位元物理位址(0x00000000–0xFFFFFFFF),超過4GB的記憶體無法直接存取
- 💾 檔案資訊:PegaIo64.sys(14.5 KB),已簽章驅動程式,適用於Windows核心級記憶體操作學習
👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app
驅動程式漏洞概述
這篇文章要帶大家深入分析 PegaIo64.sys 這個驅動程式的內部運作機制。這是一個已簽章的Windows驅動程式,主要用於硬體I/O操作,但卻存在著可被利用的核心級漏洞。
對於想要學習 Windows核心驅動漏洞 或是 遊戲記憶體修改技術 的玩家來說,理解這類驅動的運作原理非常重要。雖然這個驅動存在32位元截斷的限制,但它提供的任意物理記憶體讀寫能力,在學術研究和安全測試中仍具有相當高的價值。
⚠️ 重要提醒:使用此類驅動程式需要管理員權限,且可能觸發反作弊系統。請僅在離線環境或虛擬機器中進行測試,切勿在線上多人遊戲中使用,以免帳號遭到封鎖。
IOCTL接口與原語分析
PegaIo64.sys 提供了四個主要的IOCTL接口,其中三個可用於核心級記憶體操作。底下我們逐一分析這些接口的運作方式:
原語1:任意物理記憶體讀寫(IOCTL 0x80102040)
這是這個驅動最核心的功能。透過 IOCTL 0x80102040,使用者可以將任意物理記憶體區域映射到當前進程的使用者空間,直接進行讀寫操作。
運作流程如下:
- 驅動接收包含32位元物理位址的請求
- 使用 MmMapIOSpace 將64KB的物理記憶體映射到核心虛擬位址
- 建立MDL(記憶體描述符列表)描述該映射
- 使用 MmMapLockedPagesSpecifyCache 將核心記憶體映射到使用者模式
- 回傳使用者可存取的虛擬位址
輸入緩衝區結構(最少20位元組):
| 偏移量 | 大小 | 說明 | | +0x00 | 4 bytes | 未使用的DWORD | | +0x04 | 4 bytes | 物理位址(32位元,會被零擴展到64位元) | | +0x08 | 4 bytes | 上層位元(會被清零) | | +0x0C | 8 bytes | 輸出:使用者模式虛擬位址 |
限制條件:
- 僅支援32位元物理位址(0x00000000–0xFFFFFFFF)
- 每次映射固定64KB(0x10000)大小
- 最多同時存在8個映射(由 g_IoMapSlotArray 追蹤)
- 個別映射無法單獨釋放,必須使用 IOCTL 0x8010204C 釋放所有映射
原語2與3:I/O埠讀寫(IOCTL 0x80102054與0x80102058)
這兩個IOCTL提供了直接的I/O埠存取能力:
- IOCTL 0x80102054:從指定I/O埠讀取1位元組(使用 in al, dx 指令)
- IOCTL 0x80102058:向指定I/O埠寫入1位元組(使用 out dx, al 指令)
輸入緩衝區需包含16位元埠號,輸出緩衝區接收讀取的位元組值。這兩個原語結合後,可以存取PCI配置空間(透過CF8h/CFCh埠),進而讀取系統的硬體配置資訊。
原語4:連續物理記憶體分配(IOCTL 0x80102050)——已損壞
這個IOCTL設計用於分配連續的物理記憶體,但存在嚴重bug:ZwOpenSection 被呼叫時傳入了NULL的區段控制代碼指標(實際上是 xor ecx, ecx)。核心嘗試將傳回的控制代碼寫入位址0,導致 PAGE_FAULT_IN_NONPAGED_AREA 錯誤檢查(藍底白字當機)。
請勿使用此IOCTL! 這是已確認的驅動程式bug,在現代Windows系統上會立即導致系統當機。
32位元截斷漏洞心得分享
這個驅動最關鍵的限制在於其32位元物理位址截斷問題。雖然驅動在64位元Windows系統上運行,但它只接受32位元的物理位址輸入。
截斷機制分析
在處理 IOCTL 0x80102040 時,驅動會執行以下組合語言操作:
- 從輸入緩衝區+0x04處讀取32位元DWORD(物理位址低32位)
- 將其零擴展到64位元RAX暫存器
- 使用 and dword ptr [rsp+40h+PhysicalAddress.HighPart], 0 明確將高32位清零
這意味著即使攻擊者提供了64位元的物理位址,驅動也會無條件忽略高32位,只使用低32位進行記憶體映射。
實際影響與繞過方法
這個限制導致驅動無法直接存取超過4GB的物理記憶體區域。在現代系統中,這意味著:
- 無法直接映射PCIe設備的高位記憶體BAR(基址暫存器)
- 無法存取系統記憶體映射I/O(MMIO)的高位區域
- 對於使用大記憶體配置(>4GB)的遊戲,可能無法直接修改特定物理頁面
潛在繞過策略:
雖然驅動本身限制在32位元位址,但攻擊者可以結合其他技術:
- 雙重映射:先使用此驅動映射低位記憶體,修改頁表結構,再透過修改後的頁表存取高位記憶體
- DMA劫持:利用此驅動的I/O埠存取能力,操控PCIe配置空間,啟用其他具有64位元存取能力的DMA設備
- 鏈式攻擊:使用此驅動的任意核心讀寫能力,尋找系統中其他驅動程式或核心結構,劫持其64位元記憶體存取路徑
實際利用教學
底下我們說明如何在實際環境中使用這個驅動程式進行核心級記憶體操作。
前置需求
- Windows 10/11 64位元系統(建議使用虛擬機器進行測試)
- 管理員權限(需要載入驅動程式)
- Cheat Engine或自製程式碼(用於呼叫DeviceIoControl)
- 驅動程式載入工具(如OSR Driver Loader,或自製載入器)
載入驅動程式
由於這是未經Microsoft簽署的測試驅動(雖然有簽章但可能已被撤銷或列入黑名單),你需要:
- 關閉驅動程式強制簽署(DSE, Driver Signature Enforcement)——在測試模式或使用漏洞繞過
- 使用 EVSignTool 或其他工具載入驅動
- 確保驅動服務已啟動,並取得設備控制代碼(\\\\.\\PegaIo64 或類似名稱)
使用IOCTL進行記憶體映射
底下是呼叫 IOCTL 0x80102040 進行物理記憶體映射的C++範例概念:
// 輸入緩衝區結構(20 bytes)
struct PhysicalMemoryRequest {
DWORD Unused; // +0x00
DWORD PhysicalAddress; // +0x04(32位元位址)
DWORD Padding; // +0x08(會被清零)
PVOID UserModeVA; // +0x0C(輸出:使用者虛擬位址)
};
// 開啟設備
HANDLE hDevice = CreateFile(
L"\\\\.\\PegaIo64",
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL
);
// 準備請求(範例:映射物理位址 0x1000)
PhysicalMemoryRequest req = {0};
req.PhysicalAddress = 0x1000; // 注意:只能使用32位元位址!
DWORD returned = 0;
BOOL ok = DeviceIoControl(
hDevice,
0x80102040, // IOCTL_MAP_PHYSICAL_MEMORY
&req, sizeof(req),
&req, sizeof(req),
&returned, NULL
);
if (ok) {
PVOID mappedVA = req.UserModeVA;
// 現在可以直接讀寫 mappedVA 指向的64KB記憶體區域
}
清理與釋放
使用完畢後,必須呼叫 IOCTL 0x8010204C 清理所有映射,否則會造成記憶體洩漏:
DeviceIoControl(
hDevice,
0x8010204C, // IOCTL_CLEANUP_ALL_MAPPINGS
NULL, 0, NULL, 0,
&returned, NULL
);
⚠️ 注意:驅動的 DriverUnload 函數不會自動呼叫清理函數。如果在解除載入驅動前未手動清理,映射的記憶體將會洩漏,可能導致系統不穩定或當機。
檔案下載與注意事項
底下提供PegaIo64.sys驅動程式的下載連結。請務必閱讀使用限制與風險聲明。
下載資訊
- 檔案名稱:PegaIo64.sys
- 檔案大小:14.5 KB
- 檔案類型:Windows 64位元核心驅動程式(.sys)
- 簽章狀態:已簽章(但可能已被列入黑名單或撤銷)
- 適用系統:Windows 10/11 x64
使用限制與聲明
- 僅限教育研究:本驅動程式僅供資訊安全研究、驅動程式漏洞分析教學使用
- 反作弊風險:在具備反作弊系統的遊戲中使用將導致永久封鎖
- 系統穩定性:錯誤使用可能造成藍底白字(BSOD)或系統損毀
- 法律責任:使用者需自行承擔所有法律責任,提供者不負任何責任
下載連結
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用
相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
常見問題Q&A
Q:這個驅動程式可以用來修改遊戲記憶體嗎?
A:理論上可以,但實務上受到32位元位址限制。這個驅動只能存取4GB以下的物理記憶體(32位元位址空間),而現代遊戲通常使用超過4GB的記憶體。此外,主流反作弊系統(如BattlEye、Easy Anti-Cheat)會偵測並封鎖此類驅動程式。
Q:為什麼呼叫某些IOCTL會導致系統當機?
A:驅動程式的 IOCTL 0x80102050(AllocContiguousPhysMem)存在明確的程式bug:它呼叫 ZwOpenSection 時傳入了NULL指標,導致核心嘗試寫入位址0,引發 PAGE_FAULT_IN_NONPAGED_AREA 錯誤檢查。請絕對不要呼叫此IOCTL。
Q:如何解決32位元位址限制?
A:這個限制是硬編碼在驅動程式中的,無法透過設定或參數繞過。解決方案包括:(1) 使用支援64位元物理位址的其他漏洞驅動;(2) 結合頁表操縱技術,先修改頁表條目將高位物理位址映射到低位,再使用此驅動存取;(3) 在32位元系統或啟用PAE但記憶體小於4GB的環境中使用。
Q:驅動程式載入失敗,顯示「驅程式數位簽章錯誤」怎麼辦?
A:這表示驅動程式的簽章可能已被撤銷或列入黑名單。解決方法:(1) 在測試模式下啟動Windows(bcdedit /set testsigning on)並載入未簽章驅動;(2) 使用UEFI Bootkit或Intel Vulnerability(如CVE-2015-0001)繞過DSE(驅動程式強制簽章);(3) 在虛擬機器(如VMware)中關閉DSE進行測試。
Q:為什麼解除載入驅動後系統變得不穩定?
A:這個驅動的 DriverUnload 函數不會自動清理已建立的記憶體映射。如果在解除載入前沒有呼叫 IOCTL 0x8010204C 清理所有映射,這些記憶體區域將會洩漏。後續系統嘗試存取這些區域時,可能引發 DRIVER_IRQL_NOT_LESS_OR_EQUAL 或其他藍底白字錯誤。務必在解除載入前手動清理!
|