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