WriteProcessMemory to memcpy

WriteProcessMemory to memcpy

本文关键字:memcpy to WriteProcessMemory      更新时间:2023-10-16

我想转换我的钩子方法,以更有效的方式。我当前的代码使用WriteProcessMemory()和GetCurrentProcess(),这是完全无用的。我认为一个简单的内存可以很容易地做同样的事情。下面是我尝试做的:

DWORD dwAddr = (DWORD)GetProcAddress(lpModule, lpFuncName);
BYTE jmp[6] = { 0xe9, 0x00, 0x00, 0x00, 0x00, 0xc3 };
memcpy((LPVOID)dwAddr, &jmp[0], 6);
//WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, jmp, 6, 0);

WriteProcessMemory API工作完美,但与我的自定义内存,它不工作。谁能告诉我我哪里失败了?

WriteProcessMemory()的重点是写入另一个进程的虚拟内存。你不需要它来编辑你自己的进程虚拟内存。

但是,您必须确保您有权修改该特定地址中的数据。即使内存是你的,它也可能是只读的,并且系统内核强制这样做。

使用VirtualProtect()来修改内存空间的权限。

另外,请注意,当您覆盖该地址中的数据时,您正在破坏原始函数代码。

如果你感兴趣的话,我有这个挂钩api的函数。它将PE表中的原始函数指针替换为您的指针,同时返回原始指针,以便稍后使用。不幸的是,它已经过时了,应该只适用于32位。

在这里使用memcpy完全没有问题。但是,您需要使用VirtualProtect将目的地的保护标志更改为PAGE_EXECUTE_READWRITE。写完后恢复原始保护。

如果你的目标是x86/x64,这就是你所需要做的。对于其他架构,您需要调用FlushInstructionCache

存储指向DWORD的指针也是错误的。不要强制转换GetProcAddress的返回值。它是一个指针。