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 只显示一位
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 只显示一位
相关文章推荐
- codeblocks中用第三方库
- C#创建XMl文档的一般过程
- spring bean 不使用注入的方式获取的两种方式
- spring bean 不使用注入的方式获取的两种方式
- vs2010打包程序制作的快捷方式指向错误的位置(指向安装包文件) 导致每次启动都要windows正在配置
- 其他复杂SQL查询
- seo优化:如何写出高质量的文章
- How to modify virtual address space in Windows
- java单例设计模式
- 一个男程序员的结婚要求
- 黑马程序员__java基础面向对象笔记
- xheditor-1.1.14-zh-cn.min.js控件使用
- 使用pyinotify 检测文件夹内容变化
- 『AngularJS』理解$Scope
- 多线程计数,怎么保持计数准确的方法
- 未将对象引用设置到对象的实例--可能出现的问题总结
- Java设计模式学习笔记(一)
- MATLAB 截取有目标物体算法
- MATLAB 截取有目标物体算法
- python not find in register