首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC6 內聯彙編枚舉 DLL 模塊:PEB/LDR 偏移量隨系統版本變化,不具備通用性

     編輯:程式設計綜合問答

代碼通過 `fs:[0x30]` 讀 PEB,遍歷 `InLoadOrderModuleList` 獲取模塊基址與名稱。在 VC6 + Windows XP/2000 可能跑通,但 **Vista+ 結構體偏移已變**,且 64 位下完全失效。

為什麼不通用?

  • `_PEB`、`_LDR_DATA_TABLE_ENTRY` 結構體為**未文檔化內部結構**,微軟保留隨時修改權利。
  • 偏移量 `0x0C` (Ldr)、`0x14` (InLoadOrderModuleList.Flink)、`0x10` (BaseAddress)、`0x20` (FullDllName) 僅在特定版本有效。
  • 啟用 ASLR/DEP 後,模塊加載順序、地址隨機化,邏輯更不可靠。

正規替代方案

1. Toolhelp32 API(推薦,XP 至 Win11 通用)

#include 
void ListModules(DWORD pid) {
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, pid);
    MODULEENTRY32 me = { sizeof(me) };
    if (Module32First(hSnap, &me)) {
        do {
            printf("Base: 0x%p  Name: %s\n", me.modBaseAddr, me.szModule);
        } while (Module32Next(hSnap, &me));
    }
    CloseHandle(hSnap);
}

2. PSAPI `EnumProcessModulesEx`(支援 32/64 位混合)

#include 
HMODULE hMods[1024]; DWORD cbNeeded;
if (EnumProcessModulesEx(hProcess, hMods, sizeof(hMods), &cbNeeded, LIST_MODULES_ALL)) {
    for (int i=0; i

3. WMI `Win32_Module`(腳本/遠程友好)

wmic process where "ProcessId=1234" get ExecutablePath
// 或 PowerShell
Get-Process -Id 1234 | Select-Object -ExpandProperty Modules

結論:放棄內聯彙編硬編碼偏移,改用官方文檔化 API,代碼穩健、可維護、跨版本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved