在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的信息完全匹配。