我想将我的挂钩方法转换为更有效的方式。我当前的代码使用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,它无法正常工作。谁能告诉我在哪里失败了?
答案 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
的返回值。这是一个指针。