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

VirtualAllocEx无法按指定地址分配内存问题求助

指定地址调用VirtualAllocEx分配内存失败的排查与解决

问题描述

我通过VirtualAllocEx函数尝试在目标进程(如Microsoft Paint)的指定虚拟地址0x3117d00000分配内存(同时执行保留和提交操作),但台式机上函数返回的地址为0x17D00000,并非预设的指定地址。已通过Process Hacker 2确认该地址处于空闲可用状态,且相同代码在同版本Windows 11的笔记本上可正常运行,怀疑是杀毒软件干预导致。

运行代码

#include <stdio.h>
#include <windows.h>
#include <stdint.h>

int main(void) {

    typedef intptr_t pid_t;

    pid_t process_PID = 6492; // 目标进程mspaint.exe的PID
    char *desired_address = (char *) 0x3117d00000; // 计划分配的空闲内存地址

    size_t alloc_size = 250000;


    HANDLE hProcess = OpenProcess(  PROCESS_ALL_ACCESS,
                                    FALSE, process_PID  );

    LPVOID pAddress = VirtualAllocEx (  hProcess, desired_address, alloc_size,
                                        (MEM_RESERVE | MEM_COMMIT),
                                        PAGE_EXECUTE_READWRITE  );

    printf("Allocating memory at 0x%p\n", pAddress);

    CloseHandle(hProcess);

    return 0;

}

排查与解决方法

1. 检查目标进程的位数匹配

0x3117d00000是64位地址空间的地址(超过4GB),如果目标mspaint.exe是32位进程,系统会自动将分配地址调整到32位地址空间内,导致返回低地址。

  • 通过Process Hacker查看进程位数:右键目标进程→属性→兼容性,确认是否为32位程序。
  • 解决:更换为64位版本的目标进程,或选择32位地址范围内的空闲地址进行分配。

2. 验证杀毒软件/EDR拦截

带有PAGE_EXECUTE_READWRITE权限的指定地址内存分配,常被杀毒软件、EDR工具视为可疑行为(关联shellcode注入),可能被拦截修改。

  • 临时关闭台式机上的杀毒软件/EDR,重新运行代码验证是否恢复正常。
  • 若确认是拦截,可将测试程序加入杀毒软件白名单,或调整防护规则。

3. 排查权限与错误码

代码中使用PROCESS_ALL_ACCESS可能因权限不足导致异常行为,建议添加错误码排查:

  • 修改代码,在VirtualAllocEx调用后添加以下代码:
DWORD err = GetLastError();
printf("VirtualAllocEx error code: %lu\n", err);
  • 若返回ERROR_ACCESS_DENIED,可将OpenProcess的权限参数改为必要权限组合(如PROCESS_VM_OPERATION | PROCESS_VM_WRITE),避免请求过高权限。

4. 检查ASLR特殊限制

部分系统的ASLR增强策略可能强制调整指定地址的分配,可临时关闭目标进程的ASLR用于测试(不推荐生产环境):

  • 通过Process Hacker右键目标进程→属性→安全,取消勾选“地址空间布局随机化”,重启进程后重新测试。

内容的提问来源于stack exchange,提问作者maticos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:58:12