C++ `VirtualAllocEx`在指定不同的起始地址时返回相同的地址?

C++ `VirtualAllocEx`在指定不同的起始地址时返回相同的地址?,c++,winapi,virtualalloc,C++,Winapi,Virtualalloc,我正试图使calc.exe显示messagebox,但calc.exe总是在我执行程序时崩溃。因此,我尝试将代码注入到自己的进程中,以便查看调试消息。这样做会导致异常“访问冲突在…无法执行…”,指向pData->msg。然后我发现pThread和pData的地址相同。这怎么可能?实际上,我将VirtualAllocEx的lpAddress设置为pPage,并将pPage+128设置为不获取相同的起始地址 //分配页面 void*pPage=VirtualAllocEx(hProcess,NULL

我正试图使calc.exe显示messagebox,但calc.exe总是在我执行程序时崩溃。因此,我尝试将代码注入到自己的进程中,以便查看调试消息。这样做会导致异常“访问冲突在…无法执行…”,指向
pData->msg
。然后我发现
pThread
pData
的地址相同。这怎么可能?实际上,我将
VirtualAllocEx
lpAddress
设置为
pPage
,并将
pPage+128
设置为不获取相同的起始地址

//分配页面
void*pPage=VirtualAllocEx(hProcess,NULL,256,MEM\u RESERVE,PAGE\u EXECUTE\u READWRITE);
//线程过程的提交内存
void*pThread=VirtualAllocEx(hproces,pPage,128,MEM\u COMMIT,PAGE\u EXECUTE\u READWRITE);
//提交线程数据的内存
void*pData=VirtualAllocEx(hProcess,(void*)((long-long)pPage+128),128,MEM\u COMMIT,PAGE\u EXECUTE\u READWRITE);
//写进程内存,做一些事情
//释放内存
VirtualFreeEx(HProces、pPage、256、MEM_发布版);

VirtualAllocEx使用4096字节的可分割内存页大小分配内存

dwSize[英寸] 区域的大小,以字节为单位。如果lpAddress参数为NULL,则此值将向上舍入到下一页边界。否则,分配的页面将包括包含从lpAddress到lpAddress+dwSize范围内的一个或多个字节的所有页面。这意味着跨过页面边界的2字节范围会导致两个页面都包含在分配的区域中

lpAddress[在中,可选] 为要分配的页面区域指定所需起始地址的指针。 如果要保留内存,函数会将该地址向下舍入到分配粒度的最近倍数

尝试使用Heap函数(HeapAlloc、HeapFree、HeapCreate)

或者你可以这样做:

// Allocate page
void *pPage = VirtualAllocEx(hProcess, NULL, 256, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

// Commit memory for thread data
void *pData = (char*)pPage + 128;

// WriteProcessMemory, do stuff

// Release memory
VirtualFreeEx(hProcess, pPage, 256, MEM_RELEASE);

VirtualAllocEx使用4096字节的可分割内存页大小分配内存

dwSize[英寸] 区域的大小,以字节为单位。如果lpAddress参数为NULL,则此值将向上舍入到下一页边界。否则,分配的页面将包括包含从lpAddress到lpAddress+dwSize范围内的一个或多个字节的所有页面。这意味着跨过页面边界的2字节范围会导致两个页面都包含在分配的区域中

lpAddress[在中,可选] 为要分配的页面区域指定所需起始地址的指针。 如果要保留内存,函数会将该地址向下舍入到分配粒度的最近倍数

尝试使用Heap函数(HeapAlloc、HeapFree、HeapCreate)

或者你可以这样做:

// Allocate page
void *pPage = VirtualAllocEx(hProcess, NULL, 256, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

// Commit memory for thread data
void *pData = (char*)pPage + 128;

// WriteProcessMemory, do stuff

// Release memory
VirtualFreeEx(hProcess, pPage, 256, MEM_RELEASE);

因此,我只需要偏移线程数据的写入地址,而不是内存分配?事实上,您应该知道dwSize==256意味着分配了4096个字节。因此,我只需要偏移线程数据的写入地址,而不是内存分配?事实上,您应该知道dwSize==256意味着分配了4096字节。