Int 2e 与 Sysenter区别
参考:张银奎《软件调试》第八章
Int 2e:
Windows将2e号向量专门用作系统调用,在启动早起初始化中断描述表时便注册好了适合的服务例程。因此当NtDll中的NtReadFile发出int 2e指令后,cpu便会通过idt表找到KisystemService函数。因为KiSystemService函数是位于内核空间的,所以cpu在把执行权交给KiSystemService函数前,会做好从用户态换到内核态的各种工作,包括:
1:权限检查 即检查源位置和目标位置所在的代码段权限,核实是否可以转移。
2:准备内核态使用的栈,为了保证内核安全,所有线程在内核态执行时都必须使用位于内核的内核栈(kernel stack),内核栈的大小一般为8KB或者12KB.
KiSystemService会根据服务ID从系统服务分发表(System Service Dispatch Table)中查找到需要的服务函数地址和参数描述,然后将参数从用户态复制到该线程的内核栈中,最后KiSystemService调用内核中真正的NtReadFile()函数,执行读文件操作,操作结束后会返回到KiSystemService(),KISystemService()会将操作结果复制回线程用户态栈,最后通过IRET指令将执行权交回给NtDll.dll中的NtReadFile()函数,继续执行INT 2E后面的那条指令。
快速系统调用(Sysenter)
准备工作:
1,在GDT中建立4个段描述符,分别用来描述供SYSENTER指令进入内核模式时使用的代码段(CS)和栈段(SS),以及分别用来描述供SYSENTER指令进入内核模式时使用的代码段(CS)和栈(SS).这四个描述符在GDT表中的排列应该严格按照以上顺序,这样只要指定一个段描述符的位置便能计算出其他的。
2,设置专门用于系统调用的MSR寄存器。
3,将一小段名为SystemCallStub的代码复制到SharedUserData内存区,该内存区会被映射到每个Win32进程的进程空间中。这样当应用程序每次进入系统调用时,NtDll中的残根(stub)函数便调用这段SystemCallStub代码。SystemCallStub中的内容会因系统硬件的不同而不同。
逆向调用(Ring0 -> Ring3)
首先内核代码使用内核函数KiCallUserMode发起调用。接下来的执行过程与从系统调用返回(KiServiceExit)时类似,不过进入用户态时执行的是NtDll中的KiUserCallbackDispatcher。而后KiUserCallbackDispatcher会调用内核希望调用的内核态函数。当用户态的工作完成后,执行返回动作的函数会执行INT 2B指令,也就是触发一个0x2B异常。这个异常的处理函数是内核态的KiCallbackReturn函数。于是,通过INT 2B异常,CPU便又跳回到内核态继续执行了。
lkd>!idt 2b
Dumping IDT:
2b:8053d070 nt!KiCallbackReturn
Int 2e 与 Sysenter区别的更多相关文章
- java int与integer的区别
int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...
- [转载]java int与integer的区别
声明: 本篇文章属于转载文章,来源:
- 【转】java int与integer的区别
java int与integer的区别 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1 ...
- php下intval()和(int)转换有哪些区别
想知道使用intval()和(int)转换有什么区别? 或者说两者有什么不同,包括功能.定义方面的.或者和使用频率.效率等. 复制代码代码如下: <?php echo "<br ...
- const int *p与int *const p的区别(转:csdn,suer0101)
本文只是一篇学习笔记,是看了<彻底搞定C指针>中的相关篇幅后的一点总结,仅此而已! 一.先搞清const int *p与int const *p的区别 它们的区别就是:没有区别!! 无论谁 ...
- Java教程——int与Integer的区别
首先说一下int和Integer的区别: int 是基本数据类型,Integer是int的包装类.注意:后者的类型是"类".例如使用泛型,List<Integer> n ...
- java int和Integer的区别
今天偶然和同学讨论到int和Integer的区别是,发现自己对这个问题了解的并不是很清楚,而且有些概念还是错的,所以在这对int和Integer的区别做一个总结. int与integer的区别从大的方 ...
- int与integer的区别(基本数据类型与引用数据类型)
一.先说说int与integer的区别 int 是基本数据类型,默认值为0,不需要进行实例化 integer 是引用数据类型,是int的封装类型,默认值为null,创建该类型需要进行实例化. 基本数据 ...
- java面试题之int和Integer的区别
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
随机推荐
- 结对开发_石家庄地铁查询web系统
结对开发:队友田昕可 大二上学期做过只有两号线的地铁查询系统,但是只能在控制台操作.这一次将线路加到了六条,并且要求web实现,下面简述一下设计思路和具体代码实现: 1.数据库建表 于我们自己习惯而言 ...
- Day2基本数据类型 字节 和类型转换
Java基础语法 注释 1.单行注释:// 加内容 2.多行注释:/* 多行注释 */ 3.文档注释: /** * * */ 有趣的注释 标识符 关键字 基本数据类型 八大基本数据类型 //整数in ...
- Leetcode8. 字符串转换整数 (atoi)
> 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,输出整数
在我的先前一篇关于语音报警系统制作的文章中,阐述了如何通过标签组来获得@name@的详细内容,以通过这种方式来进行详细的设备故障播报.经过一段时间的试运行,发现使用标签组的方式会产生较大的耦合,(即当 ...
- jquey 定位到有某个类
$active = $('.g-pop-box .box-option a[class="on"]')
- Elasticsearch(9300、9200)未授权访问
下载地址https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.zip 检测 http://localhost ...
- tp3常量
__MODULE__ __CONTROLLER__
- dio框架访问云函数参数传递问题(以腾讯云中的云函数为例子)第一部
dd云函数其实比较普及,这里以腾讯云的云函数为例,传递参数完成简单的账号注册. 一.第一步先注册腾讯云账号,这里不过多阐述,接着点击 控制台 进入开发者界面.(注意提前进行实名认证) 二.开发者界面如 ...
- azure bash: az: command not found
https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=dnf