c++ - Hook : why do we need to VirtualProtect() again to restore permissions?

标签 c++ winapi x86 hook

这是一些标准的代码片段,我们在其中安装了钩子(Hook),在我们感兴趣的函数的开头重写了一些字节。我的问题是:为什么我们需要重新保护一 block 重写的内存?我们不能只保留 PAGE_EXECUTE_READWRITE 权限吗?我们在这里假设我们需要不断地恢复原始字节并再次重新 Hook 。

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。重新保护它有助于防止非您的代码更新您要更改的内存位置。

关于c++ - Hook : why do we need to VirtualProtect() again to restore permissions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461771/

相关文章:

c++ - 释放指向保留嵌套变量内存地址的结构的指针

c++ - Qt Creator 的 VC++ 编译器

python - 使用Perl、Python或Ruby,如何编写一个程序到 "click"在预定的时间显示在屏幕上?

c - linux下哪个驱动控制x86串口ttyS0

c++ - 在 Mac OS X 上安装第三方库?

c++ - 如何获取进程的进程原始文件名?

c++ - 莱曼算法没有意义

delphi - 如何更改主题DrawThemeTextEx字体颜色?

x86 - 使用 AVX2 计算 8 个 long int 的最小值

assembly - AT&T asm 中的 "outb"是什么意思?