【问题标题】:Hooks: why do we need to VirtualProtect() again to restore permissions?Hooks:为什么我们需要再次使用 VirtualProtect() 来恢复权限?
【发布时间】: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() 回来?

标签: c++ winapi x86 hook


【解决方案1】:

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

【讨论】:

  • 感谢您的回答,大卫。继续与门的比较——如果我知道只有我会穿过它,似乎我可以让它敞开着?不断保护/重新保护内存是否会影响性能?
  • 从安全角度来看,VirtualProtect 管理着一层保护,以防止出现错误/错误代码。是否需要该层取决于您。从性能的角度来看,被调用的函数总是比未被调用的函数花费更多的时间来执行。使用分析来查看您是否真的获得了这样的性能提升,以至于值得考虑不使用保护层。
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多