Windows 進入保護模式後,用戶態程序無法直接訪問物理內存。BIOS 數據區位於物理地址 0xF0000(即段地址 F000:0000),要在 Ring 3 讀取它,必須借助內核對象管理器映射物理內存區段。
經查閱 MSDN,以下三個未公開導出函數可實現物理內存映射:
ZwOpenSection:打開 \Device\PhysicalMemory 區段對象ZwMapViewOfSection:將區段映射到當前進程虛擬地址空間ZwUnmapViewOfSection:解除映射這些函數位於 ntdll.dll,需動態加載獲取地址。
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer; // 指向 L"\\Device\\PhysicalMemory"
} UNICODE_STRING, *PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length; // 0x18
HANDLE RootDirectory; // NULL
PUNICODE_STRING ObjectName; // 指向 UNICODE_STRING
ULONG Attributes; // 0x40 (OBJ_CASE_INSENSITIVE)
PVOID SecurityDescriptor; // NULL
PVOID SecurityQualityOfService; // NULL
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
注意事項
- 需要管理員權限(或
SeLockMemoryPrivilege)。- 物理內存映射屬於高危操作,濫用可能導致系統不穩定。
- 現代 Windows(Vista+)對
\Device\PhysicalMemory訪問限制更嚴格,建議改用 WMI (Win32_BIOS) 或 SMBIOS 表解析。致謝
思路源自對某安裝驗證程序的逆向分析,感謝聯想技術團隊的間接啟發。