0

我试图让 calc.exe 显示一个消息框,但是一旦我执行我的程序,calc.exe 总是崩溃。所以我尝试将代码注入到我自己的进程中,以便查看调试消息。这样做会给我一个异常“访问冲突......无法执行......”指向pData->msg。然后我发现pThreadpData得到相同的地址。这怎么可能?我实际上设置和lpAddress不得到相同的起始地址。VirtualAllocExpPagepPage + 128

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

// Commit memory for thread procedure
void *pThread = VirtualAllocEx(hProcess, pPage, 128, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

// Commit memory for thread data
void *pData = VirtualAllocEx(hProcess, (void*)((long long)pPage + 128), 128, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

// WriteProcessMemory, do stuff

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

1 回答 1

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);
于 2015-11-22T12:07:59.240 回答