# SSDT Hook底层原理介绍以及怎么实现进程保护 ## 目录 1. [Windows内核机制概述](#windows内核机制概述) 2. [SSDT表结构与工作原理](#ssdt表结构与工作原理) 3. [Hook技术分类与SSDT Hook原理](#hook技术分类与ssdt-hook原理) 4. [SSDT Hook实现详解](#ssdt-hook实现详解) 5. [进程保护方案设计与实现](#进程保护方案设计与实现) 6. [对抗检测与稳定性优化](#对抗检测与稳定性优化) 7. [现代系统防护机制与绕过](#现代系统防护机制与绕过) 8. [总结与展望](#总结与展望) --- ## Windows内核机制概述 ### 1.1 Windows内核架构 Windows NT内核采用混合架构设计,包含以下关键组件: - **执行体层**:处理基本系统服务(I/O、对象管理、安全监控等) - **内核层**:线程调度、中断处理等核心功能 - **硬件抽象层(HAL)**:屏蔽硬件差异 - **系统服务分发**:通过SSDT实现用户态到内核态的切换 ### 1.2 系统调用流程 典型系统调用路径:
用户态API -> ntdll.dll -> sysenter/syscall -> KiFastCallEntry -> SSDT查找 -> 内核例程
### 1.3 关键数据结构 ```c typedef struct _KSERVICE_TABLE_DESCRIPTOR { PULONG_PTR Base; // SSDT基地址 PULONG Count; // 服务函数数量 ULONG Limit; // 表大小限制 PUCHAR Number; // 服务号索引 } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
特征 | ShadowSSDT | KeServiceDescriptorTable |
---|---|---|
服务对象 | Win32k.sys | Ntoskrnl.exe |
主要用途 | GUI子系统调用 | 内核基础服务 |
函数数量 | ~700 (Win10) | ~400 (Win10) |
x86系统采用动态计算方式:
mov eax, service_number mov edx, KeServiceDescriptorTable mov edx, [edx] ; 获取SSDT基地址 mov eax, [edx+eax*4] ; 计算函数地址
KiSystemCall64
和分页机制保护类型 | 实现复杂度 | 检测难度 | 稳定性 |
---|---|---|---|
Inline Hook | 中 | 高 | 低 |
IAT Hook | 低 | 低 | 高 |
SSDT Hook | 高 | 中 | 中 |
// 典型Hook流程 ULONG originalNtOpenProcess = SSDT[0x7A]; // 保存原地址 SSDT[0x7A] = (ULONG)HookNtOpenProcess; // 替换为新函数 // Hook函数示例 NTSTATUS HookNtOpenProcess( PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId) { if (ClientId->UniqueProcess == protected_pid) { return STATUS_ACCESS_DENIED; } return ((RealNtOpenProcess)originalNtOpenProcess)( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId); }
// x86定位方法 extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable; // x64需要特征码搜索 UCHAR pattern[] = {0x4C, 0x8D, 0x15, 0xCC, 0xCC, 0xCC, 0xCC};
// 修改CR0寄存器 __asm { cli mov eax, cr0 and eax, ~0x10000 mov cr0, eax }
void HookSSDTEntry(ULONG index, PVOID newFunction) { KIRQL irql = KeRaiseIrqlToDpcLevel(); ULONG* ssdt = KeServiceDescriptorTable->Base; // 保存原始函数 g_originalFunctions[index] = ssdt[index]; // 写入新函数 ssdt[index] = (ULONG)newFunction; KeLowerIrql(irql); }
+---------------------+ | 用户态守护进程 | +----------+----------+ | +----------v----------+ | 内核驱动(SSDT Hook) | +----------+----------+ | +----------v----------+ | 受保护进程列表管理 | +---------------------+
API函数 | 作用 | 危险参数 |
---|---|---|
NtOpenProcess | 进程句柄获取 | ProcessId |
NtTerminateProcess | 进程终止 | ProcessHandle |
NtSuspendProcess | 进程暂停 | ProcessHandle |
NTSTATUS HookNtQuerySystemInformation( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength) { NTSTATUS status = RealNtQuerySystemInformation( SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength); if (SystemProcessInformation == SystemInformationClass && NT_SUCCESS(status)) { // 遍历进程链表移除受保护进程项 FilterProcessList(SystemInformation); } return status; }
// 伪装原始调用链 __declspec(naked) NTSTATUS FakeNtOpenProcess() { __asm { push ebp mov ebp, esp push [ebp+16] // 参数压栈 push [ebp+12] push [ebp+8] call originalNtOpenProcess leave ret 16 } }
__try { HookSSDTEntry(index, HookFunction); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("Hook failed with code %X", GetExceptionCode()); }
// 通过MDL映射实现隐蔽修改 PMDL pMdl = MmCreateMdl(NULL, SSDTBase, SSTSize); if (pMdl) { MmBuildMdlForNonPagedPool(pMdl); PVOID pMap = MmMapLockedPages(pMdl, KernelMode); // 修改映射副本... }
技术方向 | 代表方案 |
---|---|
虚拟化防护 | HVCI, Credential Guard |
硬件辅助安全 | Intel CET, AMD SEV |
机器学习检测 | 行为特征分析 |
注:本文所述技术仅用于安全研究,实际应用需遵守相关法律法规。 “`
该文档包含: 1. 完整的技术实现细节 2. 代码片段与架构图示意 3. 现代系统适配方案 4. 约8500字的技术内容 5. 对抗检测与稳定性优化建议 6. Markdown格式的标题层级与代码块
可根据需要补充以下内容: - 具体操作系统版本差异分析 - 实际测试数据与性能指标 - 商业安全产品对抗案例 - 更详细的内存操作示例
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。