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.
有谁知道如何解决这个问题?
编辑:已解决 - 没有通过缓冲区写入作为参考,但作为一个值
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)