参考:张银奎《软件调试》第八章

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区别的更多相关文章

  1. java int与integer的区别

    int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...

  2. [转载]java int与integer的区别

    声明: 本篇文章属于转载文章,来源:

  3. 【转】java int与integer的区别

    java int与integer的区别 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1 ...

  4. php下intval()和(int)转换有哪些区别

    想知道使用intval()和(int)转换有什么区别? 或者说两者有什么不同,包括功能.定义方面的.或者和使用频率.效率等. 复制代码代码如下: <?php  echo "<br ...

  5. const int *p与int *const p的区别(转:csdn,suer0101)

    本文只是一篇学习笔记,是看了<彻底搞定C指针>中的相关篇幅后的一点总结,仅此而已! 一.先搞清const int *p与int const *p的区别 它们的区别就是:没有区别!! 无论谁 ...

  6. Java教程——int与Integer的区别

    首先说一下int和Integer的区别: int 是基本数据类型,Integer是int的包装类.注意:后者的类型是"类".例如使用泛型,List<Integer> n ...

  7. java int和Integer的区别

    今天偶然和同学讨论到int和Integer的区别是,发现自己对这个问题了解的并不是很清楚,而且有些概念还是错的,所以在这对int和Integer的区别做一个总结. int与integer的区别从大的方 ...

  8. int与integer的区别(基本数据类型与引用数据类型)

    一.先说说int与integer的区别 int 是基本数据类型,默认值为0,不需要进行实例化 integer 是引用数据类型,是int的封装类型,默认值为null,创建该类型需要进行实例化. 基本数据 ...

  9. java面试题之int和Integer的区别

    int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...

随机推荐

  1. 结对开发_石家庄地铁查询web系统_psp表

    结对开发_石家庄地铁查询_博客地址:https://www.cnblogs.com/flw0322/p/10680172.html PSP0: PSP0 Personal Software Proce ...

  2. linux系统安装+windows系统安装

    linux 1.格式化U盘 打开管理员命令提示符 diskpart list disk select disk 2 clean create partition primary format fs=f ...

  3. P7003 [NEERC2013]Hack Protection

    P7003 [NEERC2013]Hack Protection 题意 给定一个序列 \(a\) ,求有多少个区间满足区间内的数的异或和等于与的和的值. 思路 首先我们求一个异或前缀和 \(s\),对 ...

  4. Cesium局部区域精细瓦片数据下载技巧

    当Cesium加载局部的目标地区(如中国某个市)的0-18层或更高层数据时,当缩小到zoom较小时可能地球有部分区域(如南半球或左半球)无瓦片覆盖. 为使得整个地球有瓦片覆盖,可利用以下技巧下载瓦片: ...

  5. python3中文件/IO编程

    python3的文件操作可谓是我见过所有语言中最舒服的,那我们来一起看一下py3中的文件操作. 1:文件的打开方式有以下几种: 注:以上图表参考菜鸟教程 2:定位读写文件  f = open(&quo ...

  6. jvm源码解读--07 创建 fixup_mirrors

    通过前面的分析,创建的insttanceKlass 都没放入了java_lang_Class::fixup_mirror_list()这里类的数组里面了,所有的instance列举如下 ------- ...

  7. IBM SPSS Statistics 26.0 Mac Windows Linux安装破解教程

    IBM SPSS Statistics 26.0是IBM公司推出的一款用于统计学分析运算.数据挖掘.预测分析和决策支持任务的软件产品及相关服务的程序. 下载 windows/mac/linux IBM ...

  8. SpringCloud升级之路2020.0.x版-5.所有项目的parent与spring-framework-common说明

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 源代码文件:htt ...

  9. JAVA集合类概览

    带着问题来阅读 1.Java有哪些集合 2.不同集合的应用场景分别是哪些 3.哪些实现类是线程安全的 4.为什么Java集合不能存放基本类型 5.集合的fail-fast和fail-safe是什么 J ...

  10. pytest框架fixture的使用

    fixture可以当做参数传入 定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要以test开头,跟用例区分开.fixtu ...