代碼通過 `fs:[0x30]` 讀 PEB,遍歷 `InLoadOrderModuleList` 獲取模塊基址與名稱。在 VC6 + Windows XP/2000 可能跑通,但 **Vista+ 結構體偏移已變**,且 64 位下完全失效。
#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);
}
#include
HMODULE hMods[1024]; DWORD cbNeeded;
if (EnumProcessModulesEx(hProcess, hMods, sizeof(hMods), &cbNeeded, LIST_MODULES_ALL)) {
for (int i=0; i
wmic process where "ProcessId=1234" get ExecutablePath
// 或 PowerShell
Get-Process -Id 1234 | Select-Object -ExpandProperty Modules
結論:放棄內聯彙編硬編碼偏移,改用官方文檔化 API,代碼穩健、可維護、跨版本。