这门课的名字听起来很硬:Windows 内核、X64、物理地址映射。它不教你写驱动入门,也不讲内核对象管理那一整套,而是盯着一个具体问题——在 64 位 Windows 上,怎么从虚拟地址走到物理地址,以及这套机制在 Win7 和 Win10 上到底差在哪。

如果你之前只写过三环代码,或者只在 Win7 上抄过一份 CR3 读取的代码,到了 Win10 却发现同样的做法跑不通,那这篇导读就是给你看的。缺什么补什么,先看清楚自己缺的是哪一块。

先确认你缺的是哪一层知识

物理地址映射这件事,拆开看至少有四层:

  • 分页机制本身:X64 的四级页表(PML4 → PDPT → PD → PT),每一级表项的位域含义,尤其是 PFN 和物理地址的换算关系。
  • EPROCESS 与 KPROCESS:进程的 DirectoryTableBase 在哪、怎么从 EPROCESS 定位到进程的 CR3,以及 Win7 和 Win10 上这个偏移的变化。
  • 地址翻译路径:MmIsAddressValid、MmGetPhysicalAddress 这类内核例程内部做了什么,为什么它们不能随便在任意上下文调用。
  • 内存描述符表(MDL):MmGetSystemAddressForMdlSafe 把物理页映射到系统空间的那条路,以及映射后什么时候必须释放。

这四层里,第一层不牢,后面全是背代码;第二层不熟,换个 Windows 版本就翻车;第三层不懂,遇到缺页或 IRQL 问题就只剩猜;第四层不写,物理地址拿到了也用不起来。你可以拿这四条对一下自己,哪条是空的,这门课就重点看哪段。

Win7 和 Win10 的差异不是版本号问题

很多人以为 Win7 X64 能跑的代码,改个偏移就能迁到 Win10。实际卡人的地方通常不在偏移,而在内核自身的保护变化:Win10 之后对 CR3 的读写、对页表内存的访问、以及 PatchGuard 对相关结构的检查都更紧。课程把 Win7 的实现方法作为一个对照基线,再讲 Win10 上哪些做法已经不能照搬、需要换成什么路径,这个对比本身比单看一份 Win10 代码更有用。

如果你只想要一份“能跑”的代码,网上很多;但换台机器、换个补丁号就失效。你需要的是知道每行代码为什么这么写、它依赖了哪个尚未被改动的前提。

配套练习应该怎么用

物理地址映射不是看会的,是调出来的。建议按这个顺序动手:

  • 先在调试器里手动走一遍某进程的四级页表,把最终物理地址算出来,和 MmGetPhysicalAddress 的结果对一下。
  • 再写一段代码从 EPROCESS 拿 DirectoryTableBase,分别在有进程上下文和任意线程上下文下跑,观察结果差异。
  • 然后用 MDL 把一页物理内存映射到系统空间,读写验证后按规则释放,重点体会 IRQL 和释放时机。
  • 最后才去做跨版本兼容,把 Win7 上的实现往 Win10 上移植,记录每一步失败的原因。

跳过前两步直接写映射,遇到蓝屏你连是哪一级表项出的问题都说不清。

看完应该能回答这几个问题

  • 给定一个虚拟地址和进程的 CR3,你能手工算出它的物理地址,并说明每一步在查哪张表吗?
  • MmGetPhysicalAddress 在什么 IRQL 下不可用,为什么?
  • Win10 上直接改页表相关结构和 Win7 相比,多出哪些限制?
  • 用 MDL 映射物理页后,忘记释放会发生什么,和直接映射系统空间有什么区别?
  • 如果目标进程不在当前上下文,拿它的物理地址要注意什么?

这五个问题答不上来,说明对应章节还得回头再看一遍。能答上来,你手上的代码才算真正属于你,而不是复制来的。

Windows内核-X64物理地址映射

课程详情

课程标题:Windows内核-X64物理地址映射

本课程旨在帮助学员深入理解并实现对Win10 X64物理地址映射,适合对游戏安全感兴趣的人群。

适合人群

  • 对游戏安全领域有浓厚兴趣的专业人士
  • 希望深入了解Windows内核技术的开发者
  • 计算机科学与技术相关专业的学生

学习收获

  • 掌握Win7 X64物理地址映射的实现方法
  • 深入理解Win10 X64物理地址映射的原理
  • 提升在游戏安全领域的专业能力

课程亮点

  • 深入浅出,从基础到实践,全面讲解物理地址映射技术
  • 结合实际案例,帮助学员快速掌握核心知识
  • 提供丰富的实践机会,提升学员动手能力

课程目录

01 01.Win7 X64物理地址映射.mp4
02 02.Win10 X64物理地址映射.mp4