以下参考自水滴教程及https://blog.csdn.net/weixin_42052102/article/details/83118255
System Services Descriptor Table
System Services Descriptor Table,即系统服务描述符表,内核中实际存在两个系统服务描述符表,一个时KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。
使用windbg查看上述两个结构
SSDT:
typedef struct _ServiceDescriptorEntry {
unsigned int *ServiceTableBase; //SSDT基址
unsigned int *ServiceCounterTableBase; //SSDT中服务被调用次数的计数器
unsigned int NumberOfServices; //SSDT服务个数
unsigned char *ParamTableBase; //SSPT基址
}SSDT, *PSSDT;
SSDTshadow
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
SYSTEM_SERVICE_TABLE ntoskrnl; // ntoskrnl.exe ( native api )
SYSTEM_SERVICE_TABLE win32k; // win32k.sys (gdi/user support)
SYSTEM_SERVICE_TABLE Table3; // not used
SYSTEM_SERVICE_TABLE Table4; // not used
}SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE,**PPSYSTEM_DESCRIPTOR_TABLE;
可以看出SSDTshadow不仅指出ntoskrnl.exe,也指除了win32k.sys;
使用windbg查看SSDTshadow如下,可以看到SSDTshadow有4项,但最后2项均为0,只有前两项,分别指向ntoskrnl.exe的SystemServiceTable和Win32k.sys的SystemServiceTable
SystemServiceTable
SystemServiceTable,即系统服务表,在XP系统下有两个 SystemServiceTable,分别是Ntoskrl.exe(常用的系统服务)和Win32k.sys(与图形显示及用户界面相关的系统服务)的 SystemServiceTable, SystemServiceTable结构如下:
typedef struct _KSYSTEM_SERVICE_TABLE
{
PULONG ServiceTableBase; //这个指向系统服务函数地址表
PULONG ServiceCounterTableBase; //系统这个服务表调用了几次
ULONG NumberOfService; //服务函数的个数
PULONG ParamTableBase; //参数表
}KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;
ServiceTableBase: 指向系统服务函数地址表,该表存储了Ntoskrl.exe与Win32k.sys函数
ServiceCounterTableBase: 计数
NumberOfService: 指出 ServiceTableBase中函数的个数,利用系统调用号调用函数时,需要将系统调用号后12位代表的index与该项作比较,超过则越界
ParamTableBase: 每一项一个字节,指出ServiceTableBase中对应的函数的参数个数,以B为单位