【发布时间】:2019-08-07 00:59:03
【问题描述】:
我正在尝试编写一个伪内核驱动程序(它使用 CVE 2018-8120 来获得内核权限,因此从技术上讲它不是驱动程序)并且我希望在进入 ring0 时尽可能安全。我正在编写一个函数来从用户区读取和写入 MSR,在转换到 ring0 之前,我试图保证可以写入给我的函数的 void 指针,我决定这样做的理想方法是让它如果还没有,则可写。
问题是我知道如何做到这一点的唯一方法是使用VirtualProtect() 和NtAllocateVirtualMemory,但VirtualProtect() 有时会失败并返回错误。我想知道这些访问权限的确切存储位置(在 ram 中?在某些特殊的 CPU 寄存器中?)如何获取它们的地址以及如何直接修改它们?
【问题讨论】:
-
您不能直接修改它们,也不应该这样做。如果
VirtualProtect()失败,它这样做是有原因的,你无法绕过它。您正在尝试解决 XY 问题的 Y 部分。正确的解决方案是处理 X,即首先解决您做错的任何事情,而不是试图解决您正在创建的问题。 -
@KenWhite 这是不真实的,否则操作系统将无法做到这一点。
-
嗯,没有。操作系统可以为所欲为。它负责。它也可以控制其他代码可以做什么。
-
@KenWhite 这就是我刚才所说的......我认为你没有理解我的评论。
标签: windows memory x86-64 paging