一. 什么是SSDT
SSDT(System Services Descriptor Table),系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
二. 结构
KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导出的一个表,这个表是访问SSDT的关键,具体结构是
typedef struct ServiceDescriptorTable {
PVOID ServiceTableBase; // System
Service Dispatch Table 的基地址
PVOID ServiceCounterTable(0); // 此域用于操作系统的
checked builds,包含着 SSDT 中每个服务被调用次数的计数器。这个计数器由 INT 2Eh 处理程序
(KiSystemService)更新。
unsigned int NumberOfServices; //由
ServiceTableBase 描述的服务的数目
PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址。
}
System Service Dispath Table(SSDT):系统服务分发表,给出了服务函数的地址,每个地址4子节长。
System Service Parameter
Table(SSPT):系统服务参数表,定义了对应函数的参数字节,每个函数对应一个字节。如在0x804AB3BF处的函数需0x18字节的参数。
WinDbg查看SSDT结构
1. 打开WinDbg, 双击调试模式, 查看 KeServiceDescriptorTable结构
对比Kernel Detective可以找到服务的当前地址
继续输入查看索引和当前地址的关系
值得注意的是 因为WinDbg里面 括号([,]) 会被忽略不能像OD里面一样显示当前地址, 所以要加上 poi 因为一个地址8位, 占4个字节, 所以用 n*4 表示偏移, n表示索引, l 1 表示 Length 1 只显示一位