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

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系统

    结对开发:队友田昕可 大二上学期做过只有两号线的地铁查询系统,但是只能在控制台操作.这一次将线路加到了六条,并且要求web实现,下面简述一下设计思路和具体代码实现: 1.数据库建表 于我们自己习惯而言 ...

  2. Day2基本数据类型 字节 和类型转换

    Java基础语法 注释 1.单行注释:// 加内容 2.多行注释:/* 多行注释 */ 3.文档注释: /** * * */ 有趣的注释 标识符 关键字 基本数据类型 八大基本数据类型 //整数​in ...

  3. Leetcode8. 字符串转换整数 (atoi)

    > 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,输出整数![在这里插入图片描述](https://img-blog.csdnimg.cn/4feb56d86fca437a98f1e7f18d ...

  4. Pelles C 五光十色中的一抹经典

    我只是一个程序员,没有多少文化修养,根本不会组织出多么精彩动人的辞藻,所以废话不多说,开整. 前段时间,我开始了自己的毕业设计项目,项目的主题和内容是围绕数码防伪追溯原理制作一个识别装置,而这个装置并 ...

  5. Intouch/ifix语音报警系统制作(2)

    在我的先前一篇关于语音报警系统制作的文章中,阐述了如何通过标签组来获得@name@的详细内容,以通过这种方式来进行详细的设备故障播报.经过一段时间的试运行,发现使用标签组的方式会产生较大的耦合,(即当 ...

  6. jquey 定位到有某个类

    $active = $('.g-pop-box .box-option a[class="on"]')

  7. Elasticsearch(9300、9200)未授权访问

    下载地址https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.zip 检测 http://localhost ...

  8. tp3常量

    __MODULE__ __CONTROLLER__

  9. dio框架访问云函数参数传递问题(以腾讯云中的云函数为例子)第一部

    dd云函数其实比较普及,这里以腾讯云的云函数为例,传递参数完成简单的账号注册. 一.第一步先注册腾讯云账号,这里不过多阐述,接着点击 控制台 进入开发者界面.(注意提前进行实名认证) 二.开发者界面如 ...

  10. azure bash: az: command not found

    https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=dnf