avatar

Catalog
陷阱门

这一篇来说陷阱门,陷阱门这东西,就没什么好讲的,应该Windows几乎没怎么用,陷阱门也是位于IDT表里的,列出前48个描述符,就没有陷阱门。。。

陷阱门描述符

看图,陷阱门描述符,和中断门描述符,就1个位不一样,中断门的Type域是1110,陷阱门是1111

代码实现

代码实现也和中断门的完全一样,搬过来就行了。

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "stdafx.h"

int saveEax = 0;
short cs3, ss3;
int eflags3, eflags0, esp3;

__declspec(naked) void GetValue() {
_asm {
mov saveEax, eax
pushfd
mov eax, [esp]
mov eflags0, eax
popfd
mov eax, [esp+4]
mov cs3, ax
mov eax, [esp+8]
mov eflags3, eax
mov eax, [esp+0xc]
mov esp3, eax
mov eax, [esp+0x10]
mov ss3, ax
mov eax, saveEax
iretd
}
}

int main(int argc, char* argv[])
{

_asm {
int 0x20
}
printf("cs3: %x, eflags3: %x, esp3: %x, ss3: %x\n \teflags0: %x", cs3, eflags3, esp3, ss3, eflags0);
getchar();
return 0;
}

与中断门的差别

那可能有人要问了,既然陷阱门和中断门完全一样,有什么存在的意义。那还是有一点不同的,来看两次执行的结果:

同样的代码,执行结果不同,可以发现,陷阱门和中断门的区别在于,中断门执行后EFLAG寄存器的值发生了改变,而陷阱门不会改变EFLAG,这就是陷阱门和中断门的差别。

EFLAG寄存器结构

根据EFLAG寄存器的结构可以得知,中断门执行后,将IF位置0了,但陷阱门不会,这就是中断门和陷阱门的唯一区别

那么这个IF位有什么用呢?为什么陷阱门要将IF位置0呢?

稍查资料,可以了解到IF标志是用于控制处理器对可屏蔽中断请求的响应。置1以响应可屏蔽中断反之则禁止可屏蔽中断。IF标志对不可屏蔽中断没有影响

这里举个简单的例子说明下什么是可屏蔽中断,什么是不可屏蔽中断。打开任务管理器,可以看到有很多进程正在运行,这时候,你想把电脑锁屏,于是按下Win+L,这个时候键盘会向CPU发送一个可屏蔽中断,告诉CPU,用户按下了Win+L键,需要执行锁屏功能,如果此时EFLAG的IF位为1,这是CPU会短暂放下手上的任务,先去处理你的锁屏任务,处理完后,你的电脑锁屏了,CPU会继续运行刚刚处理的进程;如果此时ELFAG的IF位为0,那么CPU就和没听到一样,继续做它自己的事。如果遇到意外状况,电脑的电源线拔了下来,断电了,这时电源会向CPU发送一个不可屏蔽中断,这个中断不受IF位影响,CPU一定会去处理。这时有人会问了,断电后CPU还怎么工作?其实在主板上,是有电容的,可以在断电后让CPU再去做一些清理工作,这就是不可屏蔽中断。

总结

中断门和陷阱门的唯一区别:中断门执行时,将IF位清零,但陷阱门不会。

参考教程:https://www.bilibili.com/video/av68700135?p=20

Author: cataLoc
Link: http://cata1oc.github.io/2020/03/15/%E9%99%B7%E9%98%B1%E9%97%A8/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶