什么是SSDT
SSDT全称为System Services Descriptor Table,中文为系统服务描述符表,SSDT表就是把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
SSDT通过修改此表的函数地址可以对常用windows函数进行hook,从而实现对一些核心的系统动作进行过滤、监控的目的。一些HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。
- SSDT结构
typedef struct ServiceDescriptorTable {
PVOID ServiceTableBase; //System Service Dispatch Table 的基地址
PVOID ServiceCounterTable(0);
//包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新。
unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目。
PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表
}
由SSDT索引号获取当前函数地址
符号 | 描述 |
---|---|
dd KeServiceDescriptorTable | 查看起始地址 |
dd poi KeServiceDescriptorTable | 查看当前地址 |
dd poi [KeServiceDescriptorTable] 0*4 l 1 | 显示第0行第1列 |
dd poi [KeServiceDescriptorTable] 0n17*4 l 1 | 显示第17行第1列(0n表示十进制) |
如何获取索引号
指令 | 描述 |
---|---|
u ZwOpenprocess | 查看汇编指令 |
获取起源地址-判断SSDT是否被HOOK
MmGetSystemRoutineAddress