VirtualAllocEx 未将内存分配到所需地址

问题描述 投票:0回答:1

我正在使用

VirtualAllocEx
标题中的
windows.h
函数。我正在尝试在某个任意进程中的指定虚拟地址处分配(保留和提交)内存,例如 Microsoft Paint。

由于某种原因,我的台式计算机没有将内存分配到定义的地址。我正在运行的代码如下:

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

int main(void) {

    typedef intptr_t pid_t;

    pid_t process_PID = 6492; // arbitrary PID for mspaint.exe on my computer
    char *desired_address = (char *) 0x3117d00000; // free usable mem, 2048KB in size.

    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;

}

我传递给

VirtualAllocEx
的地址是免费且可用的——我已经使用 Process Hacker 2 确认了这一点。然而,该函数最终在一个地址分配内存,该地址甚至不在 Microsoft Paint 的虚拟内存空间中,如下所示:

C:\Users\mdelr\programming\c_programming>virtual_alloc
Allocating memory at 0x17D00000

可以看到,

0x17D00000
并不是程序中定义的地址,是
0x3117d00000

是否有一些防病毒软件启动并分配了一些安全的内存空间?当我遇到这个错误时,我试图向程序中注入一些 shellcode 以显示消息框。

注意:我的笔记本电脑运行与台式机相同的操作系统,Windows 11;不过,这在我的笔记本电脑上运行得很好。

windows winapi antivirus
1个回答
0
投票

我在编译时运行的是 32 位版本的 GCC。编译后,我定义的 64 位指针被部分剪切以适应编译器的 32 位特性。

使用MSYS2提供的UCRT64环境(如下命令)升级到64位GCC版本后,问题得到解决。

pacman -S mingw-w64-ucrt-x86_64-gcc
© www.soinside.com 2019 - 2024. All rights reserved.