如何通过Win32 API获取进程主模块的AllocationBase内存地址
获取进程主模块AllocationBase地址的Windows API方案
要获取目标进程主模块(如noita.exe)的AllocationBase地址,可通过以下Windows API组合实现:
核心API说明
EnumProcessModules/EnumProcessModulesEx:枚举目标进程加载的所有模块,主模块会作为返回数组的第一个元素。后者支持指定枚举32/64位模块,适配跨位数进程场景。GetModuleInformation:传入模块句柄,获取包含模块基地址的MODULEINFO结构体,其中lpBaseOfDll字段就是你需要的AllocationBase地址。- 若目标进程是当前进程,也可直接用
GetModuleHandleW获取主模块句柄,但跨进程场景下枚举模块的方式更可靠。
实现步骤
- 确保已通过
OpenProcess获取目标进程的有效句柄,需申请PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限。 - 调用
EnumProcessModules,传入进程句柄、模块句柄数组及数组大小,获取已加载模块的数量。数组首个元素即为主模块的句柄。 - 调用
GetModuleInformation,传入进程句柄和主模块句柄,提取MODULEINFO中的lpBaseOfDll字段,该值就是主模块的基地址(对应你在Cheat Engine中看到的0x400000)。
代码示例(C++)
#include <windows.h> #include <psapi.h> // 需链接psapi.lib void GetMainModuleBase(DWORD dwProcessId) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId); if (!hProcess) return; HMODULE hMods[1024]; DWORD cbNeeded; if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) { MODULEINFO modInfo; if (GetModuleInformation(hProcess, hMods[0], &modInfo, sizeof(modInfo))) { // 输出主模块基地址 printf("主模块AllocationBase: 0x%p\n", modInfo.lpBaseOfDll); } } CloseHandle(hProcess); }
注意事项
- 跨位数进程枚举时,需使用
EnumProcessModulesEx并指定LIST_MODULES_32BIT或LIST_MODULES_64BIT标志,避免枚举失败。 - 所有API调用需检查返回值,通过
GetLastError排查调用失败原因。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

