我正在尝试写入另一个进程的内存,我使用权限38h(VM_OPERATION,VM_READ,VM_WRITE)打开它,然后我使用VirtualProtectEx权限4h(PAGE_READWRITE),但我也尝试了PAGE_EXECUTEREADWRITE - 稍后同样的错误。
然后我调用ReadProcessMemory,并成功读出修复地址的值。 但是当我尝试使用WriteProcessMemory写入该地址时,我得到错误代码299 - ERROR_PARTIAL_COPY。
有谁知道如何解决这个问题?
EDIT:已解决 - 没有通过缓冲区写入作为参考但作为值
答案 0 :(得分:0)
WriteProcessMemory给出错误ERROR_PARTIAL_COPY
299,因为第三个参数lpBuffer
必须是一个指针。特别是指向包含要写入目标进程的数据的本地缓冲区的指针。例如,如果缓冲区是一个整数,例如:
int x = 5;
然后,您将使用&x
作为lpBuffer
参数。 &
是“运算符的地址,它返回指向变量的指针。
通常,如果您不为此参数传递指针,则会出现编译器错误。无论如何,ERROR_PARTIAL_COPY表示并非将源缓冲区中的所有字节都写入目标进程。发生这种情况可能有多种原因,特别是如果lpBuffer参数未指向具有正确权限的已提交内存地址时。如果您也弄乱了WriteProcessMemory的第二个参数,同样的事情也会发生
像我在这里一样,也建议使用VirtualProtectEx获得对目标内存页面的写权限:
void PatchEx(HANDLE hProcess, char* dst, char* src, int size)
{
DWORD oldprotect;
VirtualProtectEx(hProcess, dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);
WriteProcessMemory(hProcess, dst, src, size, NULL);
VirtualProtectEx(hProcess, dst, size, oldprotect, &oldprotect);
}