Windows保护模式学习笔记(四)—— 中断门陷阱门
Windows保护模式学习笔记(四)—— 中断门&陷阱门
- 要点回顾
- 中断描述符表(IDT)
- 一、中断门
- 实验:构造一个中断门
- 第一步:初步构造参数
- 第二步:确定 Offset in Segment
- 第三步:将门描述符写入IDT表
- 第四步:继续执行第二步的代码
- 二、陷阱门
- 实验:构造一个陷阱门
- 第一步:初步构造参数
- 第二步~第四步:参考中断门
- 陷阱门与中断门的区别:
要点回顾
Windows实际上并没有使用调用门,但是使用了中断门
学习调用门是为了更好地理解中断门
注意:老式CPU会使用中断门,新式CPU使用的是快速调用
中断描述符表(IDT)
描述:
IDT即中断描述符表,同GDT一样,IDT也是由一系列描述符组成的,每个描述符占8个字节
但要注意的是,IDT表中的第一个元素不是NULL
使用WinDbg查看IDT表的基址和大小:
IDT表可以包含三种门描述符:
- 任务门描述符
- 中断门描述符
- 陷阱门描述符
一、中断门
结构图:
中断门执行前后堆栈变化:
实验:构造一个中断门
第一步:初步构造参数
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 //暂定
由上述参数构造出的门描述符为:0000EF
00`00080000
第二步~第四步:参考中断门
之后的实验过程不再记录,可以参考中断门,基本相同
陷阱门与中断门的区别:
中断门执行时,会将IF标志位
清零,但陷阱门不会
IF=0 时:程序不再接收可屏蔽中断
可屏蔽中断:比如程序正在运行时,我们通过键盘敲击了锁屏的快捷键,若IF位为1,CPU就能够接收到我们敲击键盘的指令并锁屏
不可屏蔽中断:断电时,电源会向CPU发出一个请求,这个请求叫作不可屏蔽中断,此时不管IF位是否为0,CPU都要去处理这个请求
IF位是否会被清零是陷阱门与中断门唯一的区别
Windows保护模式学习笔记(四)—— 中断门陷阱门相关推荐
- Windows保护模式学习笔记(五)—— 任务段任务门
Windows保护模式学习笔记(五)-- 任务段&任务门 要点回顾 任务段 TSS (Task-state segment ) TR段寄存器 TR段寄存器的读写 TSS段描述符 实验:加载自定 ...
- Windows保护模式学习笔记(三)—— 长调用/短调用/调用门
Windows保护模式学习笔记(三)-- 长调用/短调用/调用门 要点回顾 长调用与短调用 一.短调用 二.长调用(跨段不提权) 三.长调用(跨段并提权) 长调用执行时: 执行返回(RETF)时: 总 ...
- Windows保护模式学习笔记(十四)—— 阶段测试
Windows保护模式学习笔记(十四)-- 阶段测试 题目一 解题步骤 题目二 解题步骤 题目一 描述:给定一个线性地址,和长度,读取内容 int ReadMemory(OUT BYTE* buffe ...
- Windows保护模式学习笔记(十)—— TLB
Windows保护模式学习笔记(十)-- TLB 地址解析 10-10-12分页 2-9-9-12分页 TLB TLB结构 TLB种类 练习1:体验TLB的存在 第一步:运行代码 第二步:设置中断门描 ...
- Windows保护模式学习笔记(二)—— 代码跨段跳转
Windows保护模式学习笔记(二)-- 代码跨段跳转 要点回顾 代码跨段跳转 执行流程 1)段选择子拆分 2)查表得到段描述符 3)权限检查 4)加载段描述符 5)代码执行 6)总结 一致代码段(共 ...
- Windows保护模式学习笔记(九)—— 2-9-9-12分页
Windows保护模式学习笔记(九)-- 2-9-9-12分页 要点回顾 10-10-12分页 原理 环境配置 2-9-9-12分页 原理 PDPTE PDE PTE XD/NX标志位 环境配置 实验 ...
- Windows保护模式学习笔记(八)—— 页目录表基址/页表基址
Windows保护模式学习笔记(八)-- 页目录表基址/页表基址 要点回顾 一.页目录表基址 实验:拆分线性地址C0300000,并查看其对应的物理页 第一步:打开一个进程,获得它的Cr3 第二步:查 ...
- Windows保护模式学习笔记(七)—— PDEPTE
Windows保护模式学习笔记(七)-- PDE&PTE Cr3 PDE(页目录表项) PTE(页表项) 物理页的属性 10-10-12分页的补充 实验1:证明PTE的特征1 第一步:选择一个 ...
- Windows保护模式学习笔记(六)—— 10-10-12分页
Windows保护模式学习笔记(六)-- 10-10-12分页 基本概念 4GB内存空间 有效地址-线性地址-物理地址 有效地址与线性地址 物理地址 控制寄存器:Cr3 10-10-12分页 实验:通 ...
最新文章
- rocketmq python 一个进程订阅多个topic_玩转不同业务场景,这些RabbitMQ特性会是得力助攻...
- CISCO CCNA RIP
- python只能运行一次怎么改_是否可以修改和运行部分Python程序而无需一次又一次地运行所有这些程序?...
- golang 小知识-持续更新中
- REST API URI 设计的七准则
- 三因子两水平doe_DOE试验设计案例
- 安卓程序段——时间测试函数
- jquery图片预加载+自动等比例缩放插件
- SpringCloud Feign使用详解
- Java 常用对象-System类
- Android驱动工程师职位要求
- java jsession,JSession
- lisp怎么改成vlx_如何用CAD自带的VLisp修改Lisp文件并且生成vlx文件??
- Xposed 之旅 -- 微信防撤回
- EXCEL:单元格内换行符的ASC码值
- 客户端第二次连接失败,SYN包发了,没有收到服务端回 SYN+ACK ,SYN包被丢弃了
- 如何手动启动消防广播_消防应急广播应如何规范设置?
- C# Excel 条件格式
- 数字信号处理基础----正交基与正交函数集
- 【市场调查与预测】廊坊师范学院大学生洗发水使用情况调查(课程论文)
热门文章
- Python语言学习:创建/删除文件/文件夹、获取当前文件/文件夹路径(系统环境路径/目录)、获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略
- Docker windows 安装MySql和Tomcat
- (原创)7-1 银行业务队列简单模拟 (30 分)
- SoringMVC-常用注解标签详解(摘抄)
- Python面向对象-特殊成员
- SQLSERVER单表CRUD通用方法
- Hadoop集群_Eclipse开发环境设置
- poj1201Intervals(差分约束)
- GridView自动排序(原创)
- Linux下unlink函数的使用