如果你写过驱动,却只会用 SSDT Hook 或者硬编码偏移去拦 API,那这门课要补的就是另一块:Windows 自己留给你的回调口子。它不要求你去做逆向对抗,而是用系统公开的机制拿到进程创建、线程启动、模块加载、注册表读写这些事件的通知。适合已经能编译出一个能加载的驱动、但说不清 PsSetCreateProcessNotifyRoutine 和 ObRegisterCallbacks 区别的人。

先确认自己缺的是哪一块

回调不是单一 API,而是一组用途不同的注册接口,缺口通常出在三个地方:

  • 分不清「通知」和「拦截」。进程、线程创建回调只能事后知道,而对象回调可以在操作发生前决定放行还是拒绝,选错接口就写不出想要的效果。
  • 不知道回调在哪个进程上下文、哪个 IRQL 上执行。很多人在回调里调用会阻塞的函数,蓝屏之后仍不知道原因,这属于执行环境没搞清楚。
  • 注销时机处理不当。驱动卸载前没有反注册,回调函数指针变成野指针,系统在下次事件触发时直接崩溃。

这门课围绕的就是这几类具体问题,而不是泛泛讲内核编程。

课程会碰到的具体机制

进程与线程方向,重点是创建回调的注册、回调参数里父进程与镜像路径怎么读、如何在其中做进程过滤。模块加载方向,关注驱动与 DLL 加载时的通知,以及怎么结合路径判断拿到你关心的模块。注册表方向,涉及注册表回调的注册方式、回调中能获取的键路径与操作类型,以及哪些操作会被触发。对象回调这块,会讲到句柄打开时的权限校验逻辑,这也是很多人真正想用来做保护的地方。每个机制都对应「注册—回调中处理—注销」这条完整链路,缺任何一环,代码在真实环境里都跑不稳。

配套要动手的东西

只看不写没用。建议边看边做这几件事:写一个最小驱动,注册进程创建回调,把新进程的 PID 和镜像路径打到调试输出里,用 DbgView 确认能看到;再注册一个线程回调,观察同一进程下线程创建的通知频率;然后注册表回调,用 regedit 改一个键,看回调是否被触发、操作类型是什么。每一步都要在卸载时正确反注册,并故意去掉反注册跑一次,亲眼看到卸载后的事件触发会出问题。这些练习比记 API 原型有用得多。

看完应该能回答的问题

  • 进程创建回调能不能阻止进程启动?不能的话,想拦截该用哪个回调?
  • 对象回调里的操作类型和访问掩码分别代表什么,怎么据此判断一次句柄打开该不该放行?
  • 回调函数运行在什么 IRQL,哪些常见内核函数在回调里不能调用?
  • 多个回调同时存在时,返回状态如何影响最终结果,谁先谁后?
  • 驱动卸载时漏掉反注册,为什么会在之后的某次事件里崩溃,而不是立刻崩溃?

如果这些问题你现在答不上来,或者只能答一半,这门课按顺序看下去,缺口能补上。如果已经能准确说出执行环境和注销风险,那可以跳过前面直接看对象回调和注册表部分。

Windows内核-系统回调

课程详情

课程标题:Windows内核-系统回调

本课程主要讲解Windows系统为我们提供的回调机制,旨在帮助学员深入理解如何通过这些机制来监控进程、线程、加载模块以及注册表操作。

适合人群

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

学习收获

  • 掌握Windows系统回调机制的基本原理
  • 学会如何利用回调机制监控进程和线程
  • 了解模块加载和注册表操作中的回调应用

课程亮点

  • 深入浅出,理论与实践相结合
  • 案例丰富,实用性强
  • 专业讲师,答疑解惑

课程目录

01 01.进程回调
02 02.线程回调
03 03.模块加载回调
04 04.注册表回调
05 05.时间变更回调
06 06.让回调失效