【问题标题】:WriteProcessMemory ERROR_PARTIAL_COPY 299WriteProcessMemory ERROR_PARTIAL_COPY 299
【发布时间】:2011-04-17 11:38:22
【问题描述】:

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

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

有人知道怎么解决吗?

编辑:已解决 - 没有将缓冲区作为引用传递,而是作为值传递

【问题讨论】:

  • 感谢解决方案有效,我偶然发现了同样的问题。

标签: windows winapi memory


【解决方案1】:

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);
}

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 2023-04-06
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多