页面权限存储在硬件上的什么位置,如何直接更改它们?

时间:2019-03-15 22:01:42

标签: windows memory x86-64 paging

我正在尝试编写伪内核驱动程序(它使用CVE 2018-8120来获取内核许可,因此从技术上讲它不是驱动程序),并且我想在输入ring0时尽可能地安全。我正在编写一个用于从用户区读取和写入MSR的函数,并且在过渡到ring0之前,我试图确保赋予函数的void指针可以被写入,因此我决定实现此目标的理想方法是使其如果尚未写入,则为可写状态。

问题是,我知道如何执行此操作的唯一方法是使用VirtualProtect()NtAllocateVirtualMemory,但是VirtualProtect()有时会失败并返回错误。我想确切地知道这些访问权限的存储位置(在ram中?在某些特殊的CPU寄存器中?)如何获取它们的地址以及如何直接对其进行修改?

2 个答案:

答案 0 :(得分:1)

用户模式代码永远不要试图破坏内核数据结构,并且任何正确编写的内核都将阻止它。用户模式代码确保可以写入地址的最佳方法是对其进行写入。如果该页面尚未可写,则页面错误将导致内核这么做。

尽管如此,内核代码/ cannot /依赖这样做的应用程序,原因有二:
1)即使应用程序正确执行了操作,也可能在进入铃声0之前(或之后)再次取消映射该页面。
2)内核应该/永远/不要依赖应用程序代码来做正确的事情。它总是必须保护自己。

答案 1 :(得分:-1)

访问许可信息和页面数据存储在页面目录,页面表,CR0和CR3中。

更多信息可以在这里找到:https://wiki.osdev.org/Paging