如何在不关闭Patch Guard的64位Windows中Hook WinAPI系统调用?
在不关闭Patch Guard的64位Windows中Hook系统API的可行方法
是的,存在多种合法且不会触发Patch Guard(PG)的方法来Hook WinAPI系统调用,以下是主流实现方案,同时针对你的CreateProcessA拦截需求和全局Hook场景做具体说明:
一、用户模式Hook(无内核驱动,PG完全不干预)
用户模式Hook是最易实现且无需内核权限的方案,PG仅监管内核态的非法修改,对用户态操作无限制。常见的实现方式包括:
- IAT Hook:修改目标进程的导入地址表(IAT),将
CreateProcessA的指向替换为自定义函数。在自定义函数中可检查传入的lpApplicationName、lpCommandLine等参数,判断是否需要阻止调用(直接返回FALSE或自定义错误码),若允许则调用原函数。 - Inline Hook:直接修改目标函数的开头指令,跳转到自定义逻辑。相比IAT Hook,Inline Hook可Hook导出函数(EAT)或未导入的函数,支持更多场景。
- 全局Hook:通过
SetWindowsHookEx或注入DLL到所有进程的方式,实现全局范围内的API监控。比如注入DLL到所有进程后,Hook每个进程的CreateProcessA,即可全局拦截进程创建请求。
工具推荐:微软官方的Detours库,封装了用户模式Hook的实现细节,可快速完成API拦截逻辑。
二、内核态合法回调机制(官方接口,PG允许)
若需要更底层、更全局的监控/拦截,可使用Windows提供的官方内核回调API,这些接口是微软公开的,不会触发PG检测:
- ObRegisterCallbacks:注册对象回调,可在进程、线程、文件等对象创建/打开前拦截请求。针对
CreateProcessA的场景,可在进程对象的预创建回调中,检查进程的启动参数、父进程信息等,通过返回STATUS_ACCESS_DENIED阻止进程创建。 - PsSetCreateProcessNotifyRoutineEx2:注册进程创建/退出的通知回调,可在进程创建前后获取进程信息,虽无法直接阻止创建,但可配合其他机制(比如立即终止违规进程)实现类似效果。
- CmRegisterCallbackEx:用于注册表操作的监控与拦截,适用于Hook注册表相关API的场景。
- FsRtlRegisterFileSystemFilterCallbacks:用于文件系统操作的监控与拦截,适用于Hook文件相关API的场景。
注意:内核态回调需要编写签名的驱动程序,64位Windows要求驱动必须经过微软签名(测试模式除外),需通过Windows硬件开发者计划获取签名权限。
三、Windows Defender的实现逻辑参考
Windows Defender并未使用SSDT Hook,而是结合了多种合法机制:
- 用户模式:通过全局DLL注入,监控进程的API调用(比如
CreateProcessA、OpenProcess等),当检测到针对自身进程的恶意操作(如sc stop WinDefend)时触发警报。 - 内核态:通过
ObRegisterCallbacks注册进程保护回调,阻止外部进程打开或终止Defender的核心进程。 - 策略控制:结合WDAC(Windows Defender Application Control)的规则,限制未授权的进程操作。
四、全局Hook大多数API的注意事项
- 用户模式全局Hook需要处理不同进程的兼容性问题,比如ASLR、DEP、进程位数(32位/64位)差异,以及受保护进程(如系统进程、Defender进程)的注入限制。
- 内核态回调需遵循微软的API规范,避免使用未公开接口,否则可能因系统更新导致失效。
- 所有拦截逻辑需保证性能,避免过度拦截导致系统卡顿。
内容的提问来源于stack exchange,提问作者GEOEGII555
相关产品推荐
相关产品推荐

