ObRegisterCallbacks 在第三方驱动中不可靠,因自 Win10 1607 起仅限微软 WHQL 签名驱动使用,未签名调用会蓝屏;1809+ 默认禁用,且 PatchGuard 会检测绕过行为并触发崩溃。

不能用 ObRegisterCallbacks 在普通 Windows 驱动中可靠保护游戏进程不被打开——它从 Windows 10 1607(RS1)起就被标记为“仅限微软签名驱动”,未通过 WHQL 认证的第三方驱动调用会直接触发系统蓝屏(BUGCODE_USB_DRIVER 或更常见的 ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY 变体),且自 Windows 10 20H1 起,该 API 默认禁用,需手动启用测试签名并绕过 PatchGuard 检查,实操风险极高。
为什么 ObRegisterCallbacks 在第三方驱动里大概率失败
Windows 内核在 ObRegisterCallbacks 入口处硬编码了对驱动签名证书链的校验逻辑:必须包含 Microsoft Code Signing PCA + Microsoft Windows Production PCA,且驱动文件需带有效 WHQL 签名时间戳。未满足时,内核会静默拒绝注册,并在 DbgPrint 中输出 "ObRegisterCallbacks: Invalid signature"(但不会写入事件日志)。即使强制 patch 绕过,PatchGuard 会在 5–15 分钟内检测到内核内存篡改并触发 CRITICAL_STRUCTURE_CORRUPTION。
- Windows 10 1809+ 默认启用
KernelModeCodeIntegrity(KMCI),禁止任何未签名回调注册 -
ObRegisterCallbacks返回STATUS_ACCESS_DENIED是最常见现象,不是权限不足,而是签名校验失败 - 使用
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlCIPolicy" -Name "Enabled" -Value 0无效——这是用户态 CI 策略,不影响内核 ObCallback 校验
替代方案:用 PsSetCreateProcessNotifyRoutineEx + 进程句柄过滤
比硬刚 ObRegisterCallbacks 更可行的是在进程创建阶段拦截,再结合用户态配合关闭可疑句柄。该回调本身不受签名限制,且能拿到完整 PS_CREATE_NOTIFY_INFO 结构,包括父进程、镜像路径、是否为调试器启动等关键字段。
- 注册成功后,可在回调中检查
CreateInfo->ImageFileName是否匹配目标游戏路径(如L"\??\C:\Games\Game.exe") - 若发现调试器(
CreateInfo->ParentProcessId != 0且父进程名为dbgview.exe/x64dbg.exe),调用ZwTerminateProcess强制结束子进程 - 注意:不能在回调中直接调用
ZwOpenProcess打开自身或游戏进程——会引发递归锁死,应改用PsLookupProcessByProcessId获取EPROCESS后操作
用户态配合:用 NtQuerySystemInformation 监控句柄泄露
驱动层无法完全阻止 OpenProcess(PROCESS_ALL_ACCESS) 成功(尤其当调用方已是 SYSTEM 权限),真正可控的是后续行为。建议在用户态启动一个守护进程,每 500ms 调用一次 NtQuerySystemInformation( SystemHandleInformation, ... ),扫描所有句柄表,过滤出指向游戏进程 ID 的句柄,并检查其 GrantedAccess 是否包含 PROCESS_VM_READ 或 PROCESS_VM_WRITE。
- 发现异常句柄后,用
NtDuplicateObject复制句柄到当前进程,再调用NtClose关闭——这比驱动层暴力终止更隐蔽 - 需提前用
ZwSetInformationProcess(..., ProcessProtectionLevel, ...)将游戏进程设为PROTECTION_LEVEL_WINTCB_LIGHT(Win10 1703+),提升句柄访问门槛 - 该方法无法防御已提权到
SeDebugPrivilege的进程,但能拦住大部分外挂注入工具的默认行为
真正难的不是注册回调,而是让整个机制在 Windows 10/11 各版本上稳定存活:PatchGuard 对 EPROCESS 字段修改、SSDT Hook、甚至某些 IRP Hook 都有严格监控;ObRegisterCallbacks 的签名墙只是第一道关卡,后面还有内核 PatchGuard 定时扫描、HVCI(基于虚拟化的安全)拦截、以及 Defender 驱动阻止列表(DDB)的动态封禁。没经过 WHQL 认证就硬上,等于主动给系统递蓝屏触发器。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











