C++ `VirtualAllocEx`在指定不同的起始地址时返回相同的地址?
我正试图使calc.exe显示messagebox,但calc.exe总是在我执行程序时崩溃。因此,我尝试将代码注入到自己的进程中,以便查看调试消息。这样做会导致异常“访问冲突在…无法执行…”,指向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
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字节。