一、Windows 系统调用完整执行流程
- 用户态API(如
ReadProcessMemory)调用ntdll.dll里的Native API - Native API 将系统调用号 存入
EAX/RAX,参数入栈/寄存器 - 执行
sysenter/syscall指令,从用户态切到内核态 - 内核找到
MSR寄存器指向的系统调用入口KiSystemCall64 - 校验参数、线程模式、栈,进入系统调用分发
- 查SSDT得到内核函数地址,调用对应内核服务
- 执行完将结果返回
EAX/RAX,通过sysexit/sysret切回用户态 - 逐层返回,完成系统调用
二、四种系统调用Hook实现原理
1. SSDT Hook(系统服务描述表)
- 作用:Hook普通原生系统调用(进程/线程/内存/文件)
- 原理:修改SSDT表中函数地址,指向自己的过滤函数
- 适用:x86时代主流;x64受KVA Shadow/PG保护,极难稳定
2. ShadowSSDT Hook(影子系统服务表)
- 作用:HookWin32k GUI系统调用(窗口、消息、渲染)
- 原理:结构与SSDT类似,专门处理GUI相关系统调用
- 限制:仅GUI线程使用,同样受内核保护
3. ETW Hook(事件追踪)
- 作用:非侵入式监控系统调用,不修改内核代码/表
- 原理:系统调用进入/离开时会触发ETW事件,注册回调捕获
- 优点:稳定、不被PatchGuard杀、兼容性极强
- 缺点:只能监控,无法阻断/修改参数
4. VT Hook(虚拟化Hook)
- 作用:最高权限、底层拦截,可穿透绝大多数防护
- 原理:利用CPU虚拟化,将系统置于VMX非根模式
syscall触发VM-Exit,由VMM拦截处理- 优点:可Hook任意指令/函数,无法被常规手段检测
- 缺点:开发复杂、依赖CPU虚拟化支持
三、内核态 Hook vs 用户态 Hook
用户态 Hook
- 位置:IAT、Inline、内存、DLL注入
- 范围:仅限当前进程
- 权限:低,易被反调试、保护进程拦截
- 实现:简单、稳定、开发快
- 场景:普通逆向、游戏辅助、应用层安全
内核态 Hook
- 位置:SSDT、内核函数、Minifilter、驱动回调
- 范围:全局,所有进程
- 权限:高,可监控/拦截系统级行为
- 风险:易触发PatchGuard/蓝屏,受KVA Shadow保护
- 场景:安全软件、反作弊、DMA配套、系统监控
四、总结
系统调用:用户态→sysenter→内核→查SSDT→执行内核函数→返回。SSDT/ShadowSSDT是修改系统调用表;ETW是无侵入监控;VT是虚拟化底层拦截。用户态只管单进程、简单安全;内核态全局生效、权限高但风险大、受PG/KVA限制。