### 使用Direct KiServiceTable Restoration击败内核原生API钩子技术
#### 概述
本文档探讨了如何通过直接恢复KiServiceTable来击败内核原生API钩子技术(Defeating Kernel Native API Hookers by Direct KiServiceTable Restoration)。文档由Tan Chew Keong撰写,他是新加坡信息安全组织SIG2的副总裁,并在IT Security the Gathering会议上分享了这一研究成果。
#### 用户空间API调用与原生API
用户空间的应用程序请求系统服务通常通过调用由各种动态链接库(DLL)导出的API来完成。例如,为了写入打开的文件、管道或设备,应用程序会调用`kernel32.dll`中的`WriteFile`API。`WriteFile`API内部会进一步调用原生API`NtWriteFile`或`ZwWriteFile`,这两个API在`ntdll.dll`中被定义为指向相同的代码段。实际工作在内核空间中完成,因此`NtWriteFile`和`ZwWriteFile`在`ntdll.dll`中仅包含最小量的代码来通过软件中断`INT 0x2E`过渡到内核代码执行。
#### Win2k中的用户空间API调用示例
在Windows 2000(Win2k)中,`NtWriteFile`和`ZwWriteFile`在`ntdll.dll`中的反汇编结果如下:
```
MOVE AX, 0EDh
LEA EDX, DWORDPTR SS:[ESP+4]
INT 2E
RETN 24
```
其中,`0xED`是系统服务编号,用于索引KiServiceTable以定位处理该调用的内核函数。
#### WinXP中的用户空间API调用示例
在Windows XP(WinXP)中,`NtWriteFile`和`ZwWriteFile`在`ntdll.dll`中的反汇编结果如下:
```
MOVE AX, 112h
MOV DX, 7FFE0300h
CALL DWORD PTR DS:[EDX]
RETN 24
```
在地址`7FFE0300h`处有一个指向以下函数的指针:
```
MOV DX, ESP
SYSENTER
```
#### 内核服务调度器(KiSystemService)
`INT 0x2E`的中断服务例程(ISR)是`KiSystemService`。`KiSystemService`会检查输入参数,并调用正确的系统服务基础函数。在Windows NT和后续版本中,`KiSystemService`使用`SYSENTER`指令进行调用,提高了性能并减少了上下文切换的开销。
#### 原生API的重定向路径
恶意软件常常通过重定向原生API的执行路径来实施钩子技术。这种技术可以通过修改`KiServiceTable`来实现,`KiServiceTable`是Windows内核维护的一个表,用于存储指向所有系统服务函数的指针。当一个系统服务被调用时,Windows内核会根据提供的系统服务编号索引这个表,找到对应的函数指针并执行。
#### 定位和恢复KiServiceTable
要击败这些原生API钩子技术,一种有效的方法是直接恢复`KiServiceTable`。这涉及到几个关键步骤:
1. **定位KiServiceTable**:首先需要确定`KiServiceTable`在内存中的位置。这通常可以通过分析内核模式驱动程序或使用调试技巧来实现。
2. **备份原始指针**:一旦找到了`KiServiceTable`,应该备份其中的原始函数指针,以防万一需要恢复。
3. **检测异常指针**:接着,扫描表中的每个条目,查找那些被恶意软件篡改过的指针。
4. **恢复原始指针**:对于每个被篡改的条目,使用备份的原始指针替换掉恶意指针。
#### 结论
通过直接恢复`KiServiceTable`,可以有效地击败内核原生API钩子技术。这种方法不仅适用于对抗特定类型的恶意软件,还能够作为一种通用的安全措施来增强系统的防御能力。此外,这种方法也可以帮助开发更加安全的防病毒工具和其他安全软件,提高它们抵御高级持续性威胁(APT)的能力。