很多人学 Windows 内核,学到最后发现自己卡在同一个地方:能在驱动里打印一句调试信息,能跑通一个最简单的设备对象,但真要做点事——比如读写另一个进程的内存——就不知道从哪下手。这门《Windows内核-读写驱动》针对的就是这个缺口:把「怎么在驱动层把数据从 A 进程搬到 B 进程」这件事讲透。

先确认你到底缺哪一块

这门课不适合完全没碰过内核的人。合理的起点是:你能编译出一个能加载的驱动,知道 DriverEntry、设备对象、IRP 大概是怎么回事,会用 WinDbg 挂双机调试。如果你连驱动怎么被加载起来都没跑通过,先补那部分再回来。

如果你已经过了这个门槛,但下面这些问题答不上来,那这门课就是给你准备的:

  • 驱动里想读游戏进程的血量,第一步该拿什么?
  • 为什么附加进程(KeStackAttachProcess)能读写内存?它什么时候会出问题?
  • 虚拟地址和物理地址之间怎么换算?MDL 映射为什么能把「同一个物理页」映射成另一个可用的虚拟地址?
  • 内核 APC 注入和 APC 读写,差别在哪、各自会在什么上下文里执行?
  • MmCopyVirtualMemory 和自己在驱动里拼读写逻辑,哪个更稳、哪个更容易被检测?

课程实际动的是什么

核心是几种进程内存读写的实现路径,一条一条拆开做。附加进程读写是最直观的一种:把当前线程挂靠到目标进程地址空间,直接按虚拟地址访问,做完再脱离。课上会讲清楚它的适用场景和限制——比如在高 IRQL 下不能这么干。

MDL 映射那条路更接近底层:从目标虚拟地址算出对应的物理地址,再基于物理页建一个新的映射,在一个新的虚拟地址上完成读写。这条路径绕开了直接挂靠,理解它对后面做反调试、反反作弊的思路很有帮助。

内核 APC 读写是第三种,用内核 APC 在目标进程的上下文里执行读写动作。这部分的难点不在 API 调用,而在于理解 APC 什么时候被投递、在什么线程上下文里跑、怎么保证它真的执行了。

还有一个容易被跳过但很关键的点:读完内存之后,数据怎么复制。课程把 ReadProcessMemory 的路径和 MmCopyVirtualMemory 放在一起对照,让你明白驱动层复制的边界在哪。最后落到驱动和 DLL 配合的部分,也就是内核负责读写、用户层负责组织逻辑这条常见分工。

配套练习建议这样安排

光看代码没用,这门课的东西必须自己敲一遍、调一遍。建议每个方法都按三步走:先写一个最小可加载的驱动,只做单地址读写;再扩成对一段内存区域的批量读写;最后换成另一个进程做目标,验证在切换上下文时你的代码还稳不稳。

调试环节别省。至少准备两种验证方式:一种是自己写的测试进程,配合驱动读写做对照;一种是用调试器直接看目标内存有没有变。读写类代码最容易出的问题不是编译不过,而是「看起来跑了但没写进去」,没有对照你根本发现不了。

看完应该能回答的问题

  • 附加进程、MDL 映射、内核 APC 三条路径,各自在什么条件下更合适?
  • MDL 映射那一步,物理地址是怎么算出来的,映射失败通常卡在哪?
  • MmCopyVirtualMemory 相比自己实现读写,省掉了哪些坑?
  • 驱动和 DLL 的分工边界应该划在哪里?

这些问题的答案不是背出来的,是你自己调试过一遍之后自然能说清楚的。这门课的价值也在这里:它不是给你一个能跑就行的代码片段,而是让你明白每条路径为什么成立、什么时候会失效。

Windows内核-读写驱动

课程详情

课程详情

课程标题:Windows内核-读写驱动

适合人群:对游戏逆向,游戏安全感兴趣人群

你将会学到:

  • 实现各种方式读写进程内存
  • 读写内存的几种方式,包括:
    • 附加进程读写:通过进程挂靠读写内存
    • MDL映射读写:通过目标虚拟地址计算出物理地址,然后根据物理地址映射出一个新的虚拟地址,然后对这个新的虚拟地址就行读写操作
    • 内核APC读写:用内核APC对内存进行读写
  • 读到内存之后怎么复制
  • ReadProcessMemory -- MmCopyVirtualMemory
  • 驱动层的部分 DLL

课程目录

01 01.读写驱动说明.mp4
02 02.附加到进程读.mp4
03 03.API读.mp4
04 04.MDL映射读.mp4
05 05.切换CR3读.mp4
06 06.APC读.mp4
07 07.强写内存.mp4
08 08.MDL映射写内存.mp4
09 09.APC写内存.mp4
10 10.整合代码并测试(DNF).mp4