内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.
内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.
一丶IDT解析.
我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数地址则是操作系统给的.
因为中断是CPU和操作系统通信的一种方式.
查看IDTR (IDT表)第三项.
IDT首地址给出了,其中表项是7ff
我们每一项是8个字节,所以 7ff/8 = 255 项.也就是IDT表中是0-256
其中重要的是有个int 3
我们对其 u,则可以看int 3的指令的.
当然,我们也可以自己计算.不用通过 !idt 3给.
我们说过,IDT表中存放的是门描述符号,也就是说真正的函数地址我们要自己查分.拆分开和上面一样.
,可以简单看下下面这张表.
其中微软以前用到的是 2E的区域, 也就是说. 2E的表项是微软放函数地址的地方.
二丶查看int 2E 区域. 对其反汇编.
API,是我们的 KiSystemService
我们可以看一下 zw系列的API,其内部调用的就是这个.
而这个函数的作用,就是查表.取0环的函数地址. 上面的push 8就是函数的下表.
1.反汇编KiSystemService
首先通过汇编代码得出. 操作了FS,
1.保存FS
2.取得_KPRCB结构体中的第四项. 也就是CurrentThread.
3.取得_KThread的 CPU运行模式.
核心代码
其中 EDI是我们传入的调用函数的序号.
首先EDI右移8位. 并且and 30h,但是其实.微软这样做,主要是有两个表. 先看第一个表把.
ESI + 0E0的位置.
ESI = 当前的CurretThread, 当ESI + 0E0的时候,则会找到 KThread结构体的SSDT表.
,我们进去内存查看.则可以看到SSDT表. 注意,是当前线程的SSDT表.
其中第一项,是函数地址指针数组表,这里面存储的都是函数的地址, 而11c,则是函数指针数组的大小. 11c = 284项.
2.显示SSDT函数的反汇编.
进去函数指针表中,随便取出函数地址,则是一个函数.那么这个函数则是NT开头的函数.
也就是说,我们的函数调用ZW函数的时候.会调用NT函数.
三丶快速调用
Syseneter指令, 我们从3环调用API的时候,底层会调用这个API指令.
我们知道,ring3调用API的时候,会用INT 2E指令进行切换. 也就是说调用IDT表中的第2E项,也就是我们上面介绍的那个函数.
但是这样现在不用这给了.原因是太慢了.
int 2E调用图:
当切换函数的是否,会保存三环的栈,SS EIP CS 等等.而这些保存和恢复的时候.都会造成大量的内存访问.
int 2E 切换图
但是为了减少内存访问.所以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表了.
坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。
详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
本文来自博客园,作者:iBinary,未经允许禁止转载 转载前可联系本人.对于爬虫人员来说如果发现保留起诉权力.https://www.cnblogs.com/iBinary/p/8345598.html
欢迎大家关注我的微信公众号.不定期的更新文章.更新技术. 关注公众号后请大家养成 不白嫖的习惯.欢迎大家赞赏. 也希望在看完公众号文章之后 不忘 点击 收藏 转发 以及点击在看功能. QQ群: