WriteProcessMemory ERROR_PARTIAL_COPY 299

0x9*_*x90 5 memory windows winapi

我正在尝试写入另一个进程的内存,我以38h的权限(VM_OPERATION,VM_READ,VM_WRITE)打开它,然后我使用VirtualProtectEx和权限4h(PAGE_READWRITE),但我也尝试了PAGE_EXECUTEREADWRITE - 稍后同样的错误.

然后我调用ReadProcessMemory,并成功读出修复地址的值.但是当我尝试使用WriteProcessMemory写入该地址时,我得到错误代码299 - ERROR_PARTIAL_COPY.

有谁知道如何解决这个问题?

编辑:已解决 - 没有通过缓冲区写入作为参考,但作为一个值

Gui*_*ing 2

WriteProcessMemory给出错误ERROR_PARTIAL_COPY299,因为第三个参数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);
}
Run Code Online (Sandbox Code Playgroud)