【发布时间】:2012-11-07 20:17:20
【问题描述】:
这是一些标准代码,我们在其中安装了钩子,在我们感兴趣的函数的开头重写了一些字节。我的问题是:为什么我们需要重新保护一块重写的内存?我们不能只保留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
}
【问题讨论】:
-
好吧,你不知道。只要你在你所做的事情上永远不会成功。这会让其他人通过你打开的门破解程序变得太有趣了。
-
@HansPassant,但是什么可以阻止其他人做同样的事情,即挂钩到这个,VirtualProtect(),重写我的(或原始的)字节和 VirtualProtect() 回来?