内核知识第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表了.
内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.的更多相关文章
- linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量 ...
- 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理
内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表. 我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表 我们知道,GDT表中.存储的是存储段信息. 保存了 ...
- 内核知识第六讲,内核编写规范,以及获取GDT表
内核知识第六讲,内核编写规范,以及获取GDT表 一丶内核驱动编写规范 我们都知道,在ring3下,如果我们的程序出错了.那么就崩溃了.但是在ring0下,只要我们的程序崩溃了.那么直接就蓝屏了. 那么 ...
- jquery ajax提交表单数据的两种方式
http://www.kwstu.com/ArticleView/kwstu_201331316441313 貌似AJAX越来越火了,作为一个WEB程序开发者要是不会这个感觉就要落伍,甚至有可能在求职 ...
- yum和编译两种方式升级or降级Centos内核
http://blog.51cto.com/renzhiyuan/1882599 今天探讨用yum和编译两种方式升级或者降级内核版本: 升级:比如玩kvm,docker等虚拟化,centos内核则升级 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]
[操作系统知识储备,进程相关概念,开启进程的两种方式.进程Queue介绍] 操作系统知识回顾 为什么要有操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作 ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- strus2中获取表单数据 两种方式 属性驱动 和模型驱动
strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值 * 如果一个属性在对象栈,在页面 ...
随机推荐
- Jmeter+Ant+Jenkins接口自动化测试(二)_测试方案设计及jmeter脚本开发
前言 根据之前部署好的测试环境,进行接口自动化测试的方案设计及Jmeter脚本开发.测试方案设计过程中采用了数据分离和对象分离等思路,因此直接通过特定的测试用例文档来驱动整个自动化接口测试的执行,相关 ...
- application19事件 20多少步骤 具体20多少只有微软知道!!!
- Python3 实现数据读写分离设计
前言 首先读写分离可以保证数据库的稳定,简单的说就是当网站访问量大时,读写都在一个库,很有可能会出现脏数据的情况,如果采取阻塞似操作,那么用户体验就会变得更差. 而且目前大多数网站的读写是失衡的,以淘 ...
- js跳转页面的几种方式
第一种: window.location.href="http://www.baidu.com"; 第二种: window.history.back(-1); 第三种: windo ...
- 《MYSQL》----字符串的复杂函数,检索的七-天-排-重
接到了一个新的需求,拿到需求的时候瞬间有点头大,因为实在是有些棘手. 我们这个系统本身是个接口系统,总接口数大概在200个左右.外部会有很多用户在 不同的时间拿着不同参数去调我们的这些接口,用户的调集 ...
- 微信小程序生成带参数的二维码 小程序二维码
我是用php写的 先按照要求生成accesstoken $tokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=clien ...
- 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...
- Android开发——使用高级的RecyclerView实现侧滑菜单删除功能(SwipeRecyclerView)
使用之前,先简单介绍一下这个SwipeRecyclerView,这是严大(严振杰)基于RecyclerView的进行修改和封装的高级RecyclerView,其可以实现像QQ聊天界面的侧滑删除菜单,和 ...
- Java框架之Spring(五)
本文主要介绍Spring中, 1 Spring JDBC 2 使用注解方式管理事务的传播行为 3 采用XML 方式配置事务 4 SH 整合 5 SSH 整合 一.Spring JDBC 1) 导包 , ...
- virtuoso数据库的安装方法
数据库virtuoso有两种安装配置方式 第一种就是直接在系统中默认安装,拷贝virtuoso的安装文件,直接默认安装. 第二种是配置安装方式 参考地址:http://vos.openlinksw.c ...