内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

           内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

一丶IDT解析.

我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数地址则是操作系统给的.

因为中断是CPU和操作系统通信的一种方式.

查看IDTR  (IDT表)第三项.

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

IDT首地址给出了,其中表项是7ff

我们每一项是8个字节,所以 7ff/8 = 255 项.也就是IDT表中是0-256

其中重要的是有个int 3

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

我们对其 u,则可以看int 3的指令的.

当然,我们也可以自己计算.不用通过  !idt 3给.

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

我们说过,IDT表中存放的是门描述符号,也就是说真正的函数地址我们要自己查分.拆分开和上面一样.

,可以简单看下下面这张表.

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

其中微软以前用到的是 2E的区域, 也就是说. 2E的表项是微软放函数地址的地方.

二丶查看int 2E 区域. 对其反汇编.

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

API,是我们的 KiSystemService

我们可以看一下 zw系列的API,其内部调用的就是这个.

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

而这个函数的作用,就是查表.取0环的函数地址.  上面的push 8就是函数的下表.

1.反汇编KiSystemService

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

首先通过汇编代码得出. 操作了FS,

1.保存FS

2.取得_KPRCB结构体中的第四项. 也就是CurrentThread.

3.取得_KThread的 CPU运行模式.

核心代码

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

其中 EDI是我们传入的调用函数的序号.

首先EDI右移8位. 并且and 30h,但是其实.微软这样做,主要是有两个表. 先看第一个表把.

ESI + 0E0的位置.

ESI =  当前的CurretThread, 当ESI + 0E0的时候,则会找到 KThread结构体的SSDT表.

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

,我们进去内存查看.则可以看到SSDT表. 注意,是当前线程的SSDT表.

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

其中第一项,是函数地址指针数组表,这里面存储的都是函数的地址, 而11c,则是函数指针数组的大小.  11c = 284项.

2.显示SSDT函数的反汇编.

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

进去函数指针表中,随便取出函数地址,则是一个函数.那么这个函数则是NT开头的函数.

也就是说,我们的函数调用ZW函数的时候.会调用NT函数.

三丶快速调用

Syseneter指令, 我们从3环调用API的时候,底层会调用这个API指令.

我们知道,ring3调用API的时候,会用INT 2E指令进行切换. 也就是说调用IDT表中的第2E项,也就是我们上面介绍的那个函数.

但是这样现在不用这给了.原因是太慢了.

int 2E调用图:

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

当切换函数的是否,会保存三环的栈,SS EIP CS 等等.而这些保存和恢复的时候.都会造成大量的内存访问.

int 2E 切换图

内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

但是为了减少内存访问.所以CPU添加了新的指令以及新的寄存器.来保存这些内容.

添加的寄存器:

   MSR 174

  MSR  175

  MSR  176

174MSR寄存器,保存了0环的代码段.  而三环的代码段没有保存,原因是,采用GDT表的相邻结构.所以当切换的时候只需要加10或者-xx即可.

176MSR寄存器则保存了EIP

至于参数,当返回的是时候则会放到EDX和ECX中.

四丶SSDT表,以及Show SSDT表.

什么事ShowSSDT表?

在SSDT表中,API都是没有和UI相关的.但是微软为了支持UI,所以放到showSSDT表中了.

首先SSDT表在XP中,是导出的. 到处的是一个全局变量.

KeServicePescriPtorTable;

我们可以在WinDbg中直接输入. u 或者dd一下都可以查看的.

而SSDT表 -0x30,也就是就是全局的SSDT表.

而全局的SSDT表+0x10就是ShowSSDT表了.

上一篇:iOS开发- 界面传值(1)-通知模式(广播)


下一篇:UIButton的两种block传值方式