You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Win32 API获取进程主模块的AllocationBase内存地址

获取进程主模块AllocationBase地址的Windows API方案

要获取目标进程主模块(如noita.exe)的AllocationBase地址,可通过以下Windows API组合实现:

核心API说明

  • EnumProcessModules / EnumProcessModulesEx:枚举目标进程加载的所有模块,主模块会作为返回数组的第一个元素。后者支持指定枚举32/64位模块,适配跨位数进程场景。
  • GetModuleInformation:传入模块句柄,获取包含模块基地址的MODULEINFO结构体,其中lpBaseOfDll字段就是你需要的AllocationBase地址。
  • 若目标进程是当前进程,也可直接用GetModuleHandleW获取主模块句柄,但跨进程场景下枚举模块的方式更可靠。

实现步骤

  1. 确保已通过OpenProcess获取目标进程的有效句柄,需申请PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限。
  2. 调用EnumProcessModules,传入进程句柄、模块句柄数组及数组大小,获取已加载模块的数量。数组首个元素即为主模块的句柄。
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:30:58