Windows保护模式学习笔记(四)—— 中断门&陷阱门

  • 要点回顾
  • 中断描述符表(IDT)
    • 一、中断门
      • 实验:构造一个中断门
        • 第一步:初步构造参数
        • 第二步:确定 Offset in Segment
        • 第三步:将门描述符写入IDT表
        • 第四步:继续执行第二步的代码
    • 二、陷阱门
      • 实验:构造一个陷阱门
        • 第一步:初步构造参数
        • 第二步~第四步:参考中断门
        • 陷阱门与中断门的区别:

要点回顾

Windows实际上并没有使用调用门,但是使用了中断门

学习调用门是为了更好地理解中断门

注意:老式CPU会使用中断门,新式CPU使用的是快速调用


中断描述符表(IDT)

描述:

IDT即中断描述符表,同GDT一样,IDT也是由一系列描述符组成的,每个描述符占8个字节
但要注意的是,IDT表中的第一个元素不是NULL

使用WinDbg查看IDT表的基址和大小:

IDT表可以包含三种门描述符:

  1. 任务门描述符
  2. 中断门描述符
  3. 陷阱门描述符

一、中断门

结构图:

中断门执行前后堆栈变化:

实验:构造一个中断门

第一步:初步构造参数
Offset in Segment 31:16 = 0x0000        //暂定P = 1DPL = 二进制:11Segment Selector = 0x0008
Offset in Segment 15:00 = 0x0000       //暂定

由上述参数构造出的门描述符为:0000EE00`00080000

第二步:确定 Offset in Segment

在VC6中执行以下代码并中断

#include <windows.h>DWORD dwH2GValue;void __declspec(naked) GetH2GValue()
{__asm{pushadpushfdmov eax,[0x8003f00c]mov ebx,[eax]                // 获取高2G地址的值mov dwH2GValue,ebxpopfdpopadiretd}
}void PrintH2GValue()
{printf("%x \n", dwH2GValue);
}int main(int argc, char* argv[])
{__asm{int 0x20         // 中断门位置在IDT[20]}PrintH2GValue();getchar();return 0;
}

右键进入反汇编窗口,查看GetH2GValue函数起始地址,我这里是00401030

至此,门描述符的最终确定为:0040EE00`00081030

第三步:将门描述符写入IDT表

查看IDT表

红框标注处描述符无效,将构造的描述符写入

第四步:继续执行第二步的代码

执行结果:

成功读取了高2G内存的值,构造中断门实验成功!

二、陷阱门

结构图:

实验:构造一个陷阱门

第一步:初步构造参数
Offset in Segment 31:16 = 0x0000        //暂定P = 1DPL = 二进制:11Segment Selector = 0x0008
Offset in Segment 15:00 = 0x0000       //暂定

由上述参数构造出的门描述符为:0000EF00`00080000

第二步~第四步:参考中断门

之后的实验过程不再记录,可以参考中断门,基本相同

陷阱门与中断门的区别:

中断门执行时,会将IF标志位清零,但陷阱门不会

IF=0 时:程序不再接收可屏蔽中断
可屏蔽中断:比如程序正在运行时,我们通过键盘敲击了锁屏的快捷键,若IF位为1,CPU就能够接收到我们敲击键盘的指令并锁屏
不可屏蔽中断:断电时,电源会向CPU发出一个请求,这个请求叫作不可屏蔽中断,此时不管IF位是否为0,CPU都要去处理这个请求

IF位是否会被清零是陷阱门与中断门唯一的区别

Windows保护模式学习笔记(四)—— 中断门陷阱门相关推荐

  1. Windows保护模式学习笔记(五)—— 任务段任务门

    Windows保护模式学习笔记(五)-- 任务段&任务门 要点回顾 任务段 TSS (Task-state segment ) TR段寄存器 TR段寄存器的读写 TSS段描述符 实验:加载自定 ...

  2. Windows保护模式学习笔记(三)—— 长调用/短调用/调用门

    Windows保护模式学习笔记(三)-- 长调用/短调用/调用门 要点回顾 长调用与短调用 一.短调用 二.长调用(跨段不提权) 三.长调用(跨段并提权) 长调用执行时: 执行返回(RETF)时: 总 ...

  3. Windows保护模式学习笔记(十四)—— 阶段测试

    Windows保护模式学习笔记(十四)-- 阶段测试 题目一 解题步骤 题目二 解题步骤 题目一 描述:给定一个线性地址,和长度,读取内容 int ReadMemory(OUT BYTE* buffe ...

  4. Windows保护模式学习笔记(十)—— TLB

    Windows保护模式学习笔记(十)-- TLB 地址解析 10-10-12分页 2-9-9-12分页 TLB TLB结构 TLB种类 练习1:体验TLB的存在 第一步:运行代码 第二步:设置中断门描 ...

  5. Windows保护模式学习笔记(二)—— 代码跨段跳转

    Windows保护模式学习笔记(二)-- 代码跨段跳转 要点回顾 代码跨段跳转 执行流程 1)段选择子拆分 2)查表得到段描述符 3)权限检查 4)加载段描述符 5)代码执行 6)总结 一致代码段(共 ...

  6. Windows保护模式学习笔记(九)—— 2-9-9-12分页

    Windows保护模式学习笔记(九)-- 2-9-9-12分页 要点回顾 10-10-12分页 原理 环境配置 2-9-9-12分页 原理 PDPTE PDE PTE XD/NX标志位 环境配置 实验 ...

  7. Windows保护模式学习笔记(八)—— 页目录表基址/页表基址

    Windows保护模式学习笔记(八)-- 页目录表基址/页表基址 要点回顾 一.页目录表基址 实验:拆分线性地址C0300000,并查看其对应的物理页 第一步:打开一个进程,获得它的Cr3 第二步:查 ...

  8. Windows保护模式学习笔记(七)—— PDEPTE

    Windows保护模式学习笔记(七)-- PDE&PTE Cr3 PDE(页目录表项) PTE(页表项) 物理页的属性 10-10-12分页的补充 实验1:证明PTE的特征1 第一步:选择一个 ...

  9. Windows保护模式学习笔记(六)—— 10-10-12分页

    Windows保护模式学习笔记(六)-- 10-10-12分页 基本概念 4GB内存空间 有效地址-线性地址-物理地址 有效地址与线性地址 物理地址 控制寄存器:Cr3 10-10-12分页 实验:通 ...

最新文章

  1. rocketmq python 一个进程订阅多个topic_玩转不同业务场景,这些RabbitMQ特性会是得力助攻...
  2. CISCO CCNA RIP
  3. python只能运行一次怎么改_是否可以修改和运行部分Python程序而无需一次又一次地运行所有这些程序?...
  4. golang 小知识-持续更新中
  5. REST API URI 设计的七准则
  6. 三因子两水平doe_DOE试验设计案例
  7. 安卓程序段——时间测试函数
  8. jquery图片预加载+自动等比例缩放插件
  9. SpringCloud Feign使用详解
  10. Java 常用对象-System类
  11. Android驱动工程师职位要求
  12. java jsession,JSession
  13. lisp怎么改成vlx_如何用CAD自带的VLisp修改Lisp文件并且生成vlx文件??
  14. Xposed 之旅 -- 微信防撤回
  15. EXCEL:单元格内换行符的ASC码值
  16. 客户端第二次连接失败,SYN包发了,没有收到服务端回 SYN+ACK ,SYN包被丢弃了
  17. 如何手动启动消防广播_消防应急广播应如何规范设置?
  18. C# Excel 条件格式
  19. 数字信号处理基础----正交基与正交函数集
  20. 【市场调查与预测】廊坊师范学院大学生洗发水使用情况调查(课程论文)

热门文章

  1. Python语言学习:创建/删除文件/文件夹、获取当前文件/文件夹路径(系统环境路径/目录)、获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略
  2. Docker windows 安装MySql和Tomcat
  3. (原创)7-1 银行业务队列简单模拟 (30 分)
  4. SoringMVC-常用注解标签详解(摘抄)
  5. Python面向对象-特殊成员
  6. SQLSERVER单表CRUD通用方法
  7. Hadoop集群_Eclipse开发环境设置
  8. poj1201Intervals(差分约束)
  9. GridView自动排序(原创)
  10. Linux下unlink函数的使用