打开逆向工具,看到一个 64 位地址,你能立刻说出它落在哪一级页表、对应哪个物理页吗?如果还要动手改 PTE 的 no_execute 位,你清楚改完之后 CPU 会怎么走、系统会不会蓝屏吗?这门课解决的正是这种"地址看着眼熟、结构说不清楚"的缺口。

先确认你缺的是哪一块

很多人对分页的认知停留在 32 位时代:CR3 指向页目录,两级查表,4KB 一页。切到 x64 之后,这套直觉会失效——页表多出 PML4T 和 PDPT 两层,一共四级,地址被切成 9+9+9+9+12 的五段。如果你属于下面几种情况,这门课值得花时间:

  • 能背出"PML4T→PDPT→PDT→PT"的层级名字,但拿到一个具体线性地址算不出它的 PTE 在哪;
  • 知道 x64 有大页,但说不清 2MB 大页和 1GB 大页分别在页表第几级被截断;
  • 写过驱动或做过游戏安全,能照抄代码改 PTE 属性,却没想过为什么改完目标进程不崩;
  • 调试蓝屏时看到页错误相关代码,只能靠搜索,不能从页表状态反推原因。

缺哪一块补哪一块。如果上面一条都不沾,这门课的密度对你来说可能偏低。

课程真正要讲清的三件事

第一件:64 位线性地址怎么拆

课程会把一个 64 位地址逐段拆开,对应到 PML4T 索引、PDPT 索引、PDT 索引、PT 索引和页内偏移。这里不是画个图就完事,而是要你能对着 WinDbg 里的 !pte 输出反推回去,知道每个 9 位字段落在哪张表的第几项。地址合法性判定(比如 48 位有效位的符号扩展)也会一并说清,否则你连"这个地址到底有没有页表"都判断不了。

第二件:页表项的位从哪来、怎么用

PTE 和 PDE 不是只有物理页号。Present、Read/Write、User/Supervisor、NX(no_execute)这些标志位,每一个都对应 CPU 在寻址时的一个判断分支。课程会结合大页、中页、小页的区分来讲:同一级表项,PS 位置 1 和置 0 走的是完全不同的解释路径,这是很多人算错地址的根源。

第三件:为什么要动 no_execute 位

把 NX 位设上或抹掉,本质是在改内存的"可执行"语义。课程结合游戏安全场景讲这件事:检测手段会检查关键内存区域的执行属性,而页表拆分和属性设置在系统看来是正常的页表操作。你需要理解的是这个动作在内核层面发生了什么,而不是记住一个可以复制的调用序列。

看完应该能回答的问题

  • 给一个具体的 64 位线性地址,你能算出它的 PML4T 索引和 PTE 的虚拟地址吗?
  • 1GB 大页和 2MB 大页分别在 PDPT 还是 PDT 层确定?页内偏移各是多少位?
  • 把某个页的 NX 位置 1 之后,如果 CPU 仍然尝试取指,会触发什么异常?异常号是多少?
  • 为什么直接改目标进程的页表项,目标进程不会立刻崩溃,但改错层级就会?
  • CR3 切换时,哪些页表项会被缓存进 TLB,什么时候需要手动失效?

这五个问题答不上来,说明对应的章节需要回看,而不是快进。

配套练习怎么做才有用

光看页表结构容易产生"我懂了"的错觉。建议边学边做三件事:一是在调试器里随便取一个内核地址,手动算出四级索引并和 !pte 的结果对照;二是写一小段代码只读地遍历某进程的页表,把每一级的有效项打印出来;三是在虚拟机里做属性修改实验,故意改错一层,观察蓝屏代码的差异。参考资料里《x86x64体系探索及编程》讲的是体系本身,课程讲的是在 Windows 上怎么落地,两边对着看,遇到对不上的地方就是你要停下来查的点。

最后提醒一句:页表操作直接作用在内核数据结构上,练习请在虚拟机或专用环境里做。带着具体问题来看,比从头到尾听一遍收获大得多。

Windows内核-X64页表拆分

课程详情

课程详情

课程名称:Windows内核-X64页表拆分

课程简介:本课程深入探讨64位下线性地址的分页模式,以及如何通过设置PTE和PDE的no_execute属性来达到躲避游戏检测等问题。

适合人群

  • 对游戏安全感兴趣的人群

学习收获

  • 理解64位下线性地址的分页模式
  • 掌握设置PTE和PDE的no_execute属性的方法
  • 学会如何躲避游戏检测

课程亮点

  • 详细讲解PML4T、PDPT、PDT和PT等页表结构
  • 介绍大页、中页和小页的概念及设置
  • 结合实际案例,深入剖析游戏安全相关问题

参考资料:《x86x64体系探索及编程》

课程目录

01 01.X64分页.mp4
02 02.X64页表拆分.mp4
03 03.MmIsAddressValid函数算法一.mp4
04 04.MmIsAddressValid函数法二.mp4
05 05.代码实现拆分.mp4
06 06.PTE,PDE设置执行属性.mp4
07 07.申请内存.mp4
08 08.释放内存.mp4