如何保护虚拟系统空间不受访问



在Microsoft文档上,我读到:

在64位Windows中,虚拟地址空间的理论量为2^64字节(16 EB(,但实际只使用了16 EB范围的一小部分。从0x000'00000000到0x7FF'FFFFFFFF的8 TB范围用于用户空间,从0xFFFF0800'000000000到0xFFFFFFFF'FFFFF的248 TB范围的一部分用于系统空间。

由于我有64位指针,我可能会构造一个指向某个0xFFFFxxxxxxxxxxxx地址的指针。

网站继续:

在用户模式下运行的代码可以访问用户空间,但不能访问系统空间。

如果我能够猜测系统虚拟地址空间中的有效地址,什么机制阻止我在那里写入?

我知道内存保护,但这似乎并不能区分用户内存和系统内存。

根据@RbMm的注释,此信息存储在PTE(页面表条目(中。似乎有一点定义了是否从用户模式授予访问权限。

OSR网上的一篇文章证实了这一点,文章称

位名称:用户访问

结构本身似乎不是微软符号的一部分

0:000> dt ntdll!_page*
ntdll!_PAGED_LOOKASIDE_LIST
ntdll!_PAGEFAULT_HISTORY
0:000> dt ntdll!page*
0:000> dt ntdll!*pte*
00007fff324fe910  ntdll!RtlpTestHookInitialize

PTE由CPU(特别是MMU、内存管理单元(密切支持。这就是为什么我们在OSDev找到更多信息的原因,它说

U,"用户/主管"位,根据权限级别控制对页面的访问。如果该位被设置,则所有人都可以访问该页面;但是,如果该位未设置,则只有管理员可以访问它。

在一些泄露的SDK文件中,该位似乎是

unsigned __int64 Owner : 1;

由于PTE由CPU支持,我们应该在Linux中找到类似的东西。瞧,我看到了这个SO答案,它也有一点:

#define _PAGE_USER 0x004

它与OSDev的信息完全匹配。

相关内容

  • 没有找到相关文章

最新更新