WriteProcessMemory到memcpy

时间:2014-08-10 22:27:07

标签: c++ memory-management

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

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工作正常,但使用我的自定义memcpy,它无法正常工作。谁能告诉我在哪里失败了?

2 个答案:

答案 0 :(得分:3)

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

您必须确保您有权修改该特定地址中的数据。即使内存是您的,它也可能是只读的,系统内核会强制执行。

使用VirtualProtect()更改您尝试修改的内存空间的权限。

另外,请注意,当您覆盖该地址中的数据时,您正在破坏原始功能代码。 这不是如何挂钩Windows API。

如果它让你感到惊讶,我有this function that hooks APIs。它会在PE表中替换原来的函数指针,同时返回原始函数指针,以便以后使用。不幸的是它过时了,应该只能用于32位。

答案 1 :(得分:0)

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

如果您要定位x86 / x64,那就是您需要做的全部内容。对于其他架构,您需要致电FlushInstructionCache

存储指向DWORD的指针也是错误的。不要施放GetProcAddress的返回值。这是一个指针。