我正在使用
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;不过,这在我的笔记本电脑上运行得很好。
我在编译时运行的是 32 位版本的 GCC。编译后,我定义的 64 位指针被部分剪切以适应编译器的 32 位特性。
使用MSYS2提供的UCRT64环境(如下命令)升级到64位GCC版本后,问题得到解决。
pacman -S mingw-w64-ucrt-x86_64-gcc