C++ Hooks:为什么我们需要再次使用VirtualProtect()来恢复权限?

C++ Hooks:为什么我们需要再次使用VirtualProtect()来恢复权限?,c++,winapi,x86,hook,C++,Winapi,X86,Hook,下面是一些标准代码,我们安装了钩子,在我们感兴趣的函数的开头重写了一些字节。我的问题是:为什么我们需要重新保护一段重写过的内存?我们不能只保留PAGE\u EXECUTE\u READWRITE权限吗?我们在这里假设我们需要不断地恢复原始字节并再次重新读取 if (VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable { ReadProcessMemory(G

下面是一些标准代码,我们安装了钩子,在我们感兴趣的函数的开头重写了一些字节。我的问题是:为什么我们需要重新保护一段重写过的内存?我们不能只保留
PAGE\u EXECUTE\u 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
}

门一打开,任何人都可以穿过。如果已从内存范围中删除写保护,则任何代码都可以更新该内存,而不仅仅是您的代码。内存无法知道您的(合法)代码是更新它的代码,而不是一些可能的恶意软件,甚至只是加载到进程空间中的普通错误DLL。重新保护它有助于防止代码不更新要更改的内存位置。

当然,您不需要。只要你做的事情永远不会成功。这会让其他人从你开着的门中破解程序变得太有趣了。@HansPassant,但有什么能阻止其他人这么做呢,也就是挂接这个,VirtualProtect(),重写我(或原始)的字节,然后VirtualProtect()回来?谢谢你的回答,David。С继续与门进行比较——如果我知道只有我才能穿过门,那么我似乎可以让门开着?持续保护/重新保护内存块是否会对性能造成影响?从安全角度来看,
VirtualProtect
管理一层针对坏代码/错误代码的保护。这取决于你是否需要那一层。从性能角度来看,被调用的函数总是比未被调用的函数花费更多的时间来执行。使用分析来查看您是否真的获得了这样的性能提升,是否值得考虑不使用保护层。