保护模式(五) 中断门&陷阱门

前言

一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com
二、海东老师牛逼!

要点回顾

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

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

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


中断描述符表(IDT)

描述:

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

使用WinDbg查看IDT表的基址和大小:
IDT
IDT表可以包含三种门描述符:

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

一、中断门

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

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

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

第二步:确定 Offset in Segment

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

#include <windows.h>

DWORD dwH2GValue;

void __declspec(naked) GetH2GValue()
{
	__asm
	{
		pushad
		pushfd

		mov eax,[0x8003f00c]
		mov ebx,[eax]				// 获取高2G地址的值
		mov dwH2GValue,ebx

		popfd
		popad

		iretd
	}
}

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表
IDT表
红框标注处描述符无效,将构造的描述符写入
中断门描述符写入IDT

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

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

二、陷阱门

结构图:
陷阱门

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

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

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

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

陷阱门与中断门的区别:

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值