您的位置:首页 > 其它

SSDT 系统描述符表 地址读取

2014-01-10 15:38 169 查看
[b]一. 什么是SSDT[/b]

  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项。

[b]二. 结构[/b]

[b]  [/b]

[b]  KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导出的一个表,这个表是访问SSDT的关键,具体结构是
    typedef struct ServiceDescriptorTable {
      PVOID ServiceTableBase;      // System Service Dispatch Table 的基地址
      PVOID ServiceCounterTable(0);  [/b] //[b] 此域用于操作系统的 checked builds,包含着 SSDT 中每个服务被调用次数的计数器。这个计数器由 INT 2Eh 处理程序 (KiSystemService)更新。
      unsigned int NumberOfServices;   //由 ServiceTableBase 描述的服务的数目
      PVOID ParamTableBase;       //包含每个系统服务参数字节数表的基地址。
    }[/b]

[b]   System Service Dispath Table(SSDT):系统服务分发表,给出了服务函数的地址,每个地址4子节长。
  System Service Parameter Table(SSPT):系统服务参数表,定义了对应函数的参数字节,每个函数对应一个字节。如在0x804AB3BF处的函数需0x18字节的参数。[/b]

[b]   WinDbg查看SSDT结构[/b]

[b]   1. 打开WinDbg, 双击调试模式, 查看 KeServiceDescriptorTable结构[/b]


  

   对比Kernel Detective可以找到服务的当前地址



  继续输入查看索引和当前地址的关系



    

  值得注意的是 因为WinDbg里面 括号([,]) 会被忽略不能像OD里面一样显示当前地址, 所以要加上 poi 因为一个地址8位, 占4个字节, 所以用 n*4 表示偏移, n表示索引, l 1 表示 Length 1 只显示一位
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: