一. 什么是SSDT

  SSDT(System Services Descriptor Table),系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

通过修改此表的函数地址可以对常用windows函数及API进行hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块,
SSDT到底是什么呢?打一个比方,SSDT相当于系统内部API的指向标,作用就是告诉系统,需要调用的API在什么地方。
实际上内核中存在两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。
从上述结构中,我们可以看出,KeServieDescriptorTableShadow不但包含了ntoskrnel项,而且还包含了win32k项,而KeServiceDescriptorTable仅仅包含一个ntoskrnel项。
 

二. 结构

  

  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 只显示一位

 

 

posted on 2014-01-10 15:38  萝卜哥  阅读(1112)  评论(0编辑  收藏  举报