这是一些标准的代码片段,我们在其中安装钩子,并在我们感兴趣的函数的开头重写一些字节。我的问题是:为什么我们需要重新保护一段重写的记忆?我们就不能让它拥有PAGE_EXECUTE_READWRITE权限吗?我们在这里假设我们需要不断地恢复原始字节并再次重新挂接。
if (VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable
{
ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data
DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5); //((to)-(from)-5)
memcpy(&jmp[1], &offset, 4); // write address into jmp
memcpy(Hook::hookData, jmp, 6); // save hook data
WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp
VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect
}发布于 2012-11-20 04:40:47
一旦门开了,任何人都可以进来。如果你从一个内存范围中移除了写保护,那么任何代码都可以更新那个内存--不仅仅是你的代码。内存没有办法知道你的(合法)代码是更新它的代码,而不是一些可能的恶意软件,甚至只是加载到进程空间中的纯buggy。重新保护它有助于防止不是您的代码更新您想要更改的内存位置。
https://stackoverflow.com/questions/13461771
复制相似问题