我正在尝试编写伪内核驱动程序(它使用CVE 2018-8120来获取内核许可,因此从技术上讲它不是驱动程序),并且我想在输入ring0时尽可能地安全。我正在编写一个用于从用户区读取和写入MSR的函数,并且在过渡到ring0之前,我试图确保赋予函数的void指针可以被写入,因此我决定实现此目标的理想方法是使其如果尚未写入,则为可写状态。
问题是,我知道如何执行此操作的唯一方法是使用VirtualProtect()
和NtAllocateVirtualMemory
,但是VirtualProtect()
有时会失败并返回错误。我想确切地知道这些访问权限的存储位置(在ram中?在某些特殊的CPU寄存器中?)如何获取它们的地址以及如何直接对其进行修改?
答案 0 :(得分:1)
用户模式代码永远不要试图破坏内核数据结构,并且任何正确编写的内核都将阻止它。用户模式代码确保可以写入地址的最佳方法是对其进行写入。如果该页面尚未可写,则页面错误将导致内核这么做。
尽管如此,内核代码/ cannot /依赖这样做的应用程序,原因有二:
1)即使应用程序正确执行了操作,也可能在进入铃声0之前(或之后)再次取消映射该页面。
2)内核应该/永远/不要依赖应用程序代码来做正确的事情。它总是必须保护自己。
答案 1 :(得分:-1)
访问许可信息和页面数据存储在页面目录,页面表,CR0和CR3中。
更多信息可以在这里找到:https://wiki.osdev.org/Paging。