不能用c++编写ssdt hook驱动,因其依赖的new/delete、异常、rtti、stl容器及thiscall调用约定均不被内核支持,且ssdt仅接受__stdcall函数指针;必须使用纯c配合内联汇编实现,并关闭cr0写保护。

不能直接在普通 C++ 用户态程序里做 SSDT Hook——那属于内核层行为,必须写驱动,用 C/内联汇编,且需禁用 PatchGuard(Win10+ 64 位系统默认启用)。C++ 在驱动开发中基本不可用,new、std::string、异常、RTTI 全部不支持,连 printf 都没有。
为什么不能用 C++ 编写 SSDT Hook 驱动
Windows 内核驱动运行在 Ring0,不加载 C++ 运行时(CRT),所有依赖 C++ 语言特性的代码都会编译失败或蓝屏:
-
new/delete会调用未导出的__rt_alloc等函数,链接时报错LNK2001: unresolved external symbol - 类成员函数默认带
thiscall调用约定,而 SSDT 表只接受__stdcall函数指针;裸函数(naked)又不能带参数,否则栈被破坏 -
std::vector、std::map等容器内部使用异常和动态分配,内核不允许 - 所有 C++ 异常处理结构(
__try/__except以外)在内核中无意义,throw直接导致 IRQL_NOT_LESS_OR_EQUAL
SSDT Hook 必须用 C + 内联汇编实现
真正可行的 SSDT Hook 驱动只能用纯 C 编写,并配合内联汇编处理关键跳转。例如替换 NtOpenProcess 的地址时,必须保证:
- 自定义钩子函数声明为
NTSTATUS NTAPI MyNtOpenProcess(...),与原函数签名完全一致 - 使用
MmGetSystemRoutineAddress获取原始地址,而非硬编码偏移(不同 Windows 版本偏移不同) - 修改 SSDT 表前必须关闭写保护:
__writecr0(__readcr0() & ~0x10000);完事后立即恢复:__writecr0(__readcr0() | 0x10000) - ShadowSSDT(GUI 相关调用如
NtUserFindWindow)需单独处理,其基址在KeServiceDescriptorTableShadow中
示例片段(非完整驱动):
NTSTATUS NTAPI MyNtOpenProcess(
PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientId)
{
// 过滤逻辑:拒绝打开特定 PID
if (ClientId && ClientId->UniqueProcess == (HANDLE)0x1234) {
return STATUS_ACCESS_DENIED;
}
// 跳回原始函数(需提前保存 g_OldNtOpenProcess)
return ((pfnNtOpenProcess)g_OldNtOpenProcess)(
ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
}
Win10/Win11 64 位下 SSDT Hook 已基本失效
从 Windows 8.1 开始,微软通过 PatchGuard 严格监控 SSDT 表完整性;Win10 1607+ 后,KeServiceDescriptorTable 地址本身被隐藏,且每次系统更新都可能改变表结构或校验逻辑:
- 直接修改 SSDT 会触发 BSOD(错误码
CRITICAL_STRUCTURE_CORRUPTION) -
MmGetSystemRoutineAddress在某些版本返回 NULL,因函数被标记为 “non-exported” 或 moved tontoskrnl.exe的私有节 - 游戏反作弊(如 Easy Anti-Cheat、BattlEye)主动扫描 SSDT 修改痕迹,发现即封禁进程
- 替代方案已成主流:ETW 事件订阅、Minifilter 文件监控、ObRegisterCallbacks 进程/线程/句柄回调
真正在生产环境做系统调用过滤,别碰 SSDT——它脆弱、易崩、难调试,且现代 Windows 已把它列为“禁止触碰区”。能用 ObRegisterCallbacks 拦截进程打开就别碰 SSDT,能用 ETW 订阅 Process/Start 事件就别写驱动。SSDT Hook 现在只适合学习内核机制或旧系统(XP/Win7 32 位)逆向分析。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











