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

时间:2015-11-22 11:54:36

标签: c++ winapi virtualalloc

我试图让calc.exe显示一个消息框,但是一旦我执行我的程序,calc.exe就会崩溃。所以我试着将代码注入到我自己的进程中以查看调试消息。这样做会给我一个例外"访问违规...无法执行..."指向pData->msg。然后我发现pThreadpData获得了相同的地址。这怎么可能?实际上,我将lpAddress的{​​{1}}设置为VirtualAllocExpPage,以获得相同的起始地址。

pPage + 128

1 个答案:

答案 0 :(得分:3)

VirtualAllocEx使用可分割内存页大小的部分分配内存,该内存页大小为4096字节。

  

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

     

lpAddress [in,optional]   指针,指定要分配的页面区域的所需起始地址。   如果要保留内存,该函数会将此地址舍入到最接近分配粒度的倍数。

尝试使用堆功能(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);