首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >钩子:为什么我们需要再次使用VirtualProtect()来恢复权限?

钩子:为什么我们需要再次使用VirtualProtect()来恢复权限?
EN

Stack Overflow用户
提问于 2012-11-20 04:36:41
回答 1查看 8.5K关注 0票数 8

这是一些标准的代码片段,我们在其中安装钩子,并在我们感兴趣的函数的开头重写一些字节。我的问题是:为什么我们需要重新保护一段重写的记忆?我们就不能让它拥有PAGE_EXECUTE_READWRITE权限吗?我们在这里假设我们需要不断地恢复原始字节并再次重新挂接。

代码语言:javascript
运行
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-20 04:40:47

一旦门开了,任何人都可以进来。如果你从一个内存范围中移除了写保护,那么任何代码都可以更新那个内存--不仅仅是你的代码。内存没有办法知道你的(合法)代码是更新它的代码,而不是一些可能的恶意软件,甚至只是加载到进程空间中的纯buggy。重新保护它有助于防止不是您的代码更新您想要更改的内存位置。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13461771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档