中断门与陷阱门

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 

中断门与陷阱门

问题索引:

1.中断的初步认识

2.查看idt表

3.中断门描述符

4.中断门的执行流程

5.构造中断门函数并通过iref返回

6.陷阱门描述符

7.修改IF标志位(只有在零环才能使用)

8.中断门与陷阱门的区别

9. 中断与异常的区别

10.陷阱门实验

 

问题解答:

1. 中断的初步认识

  中断表中存在中断门、任务门、陷阱门。

  这一节我们讲解中断门与陷阱门,下一节讲解任务门。

  执行中断表中的各种门通过 int 指令,比如软件中断是 int 0x3。(注意 int 指令后面默认十进制)

2. 查看idt表
  可以使用 r idtr 查看其位置,然后dq来读取。
  可以使用 "!idt x" 指令,来查看其各个中断号的信息。

  

3. 中断门描述符
  其与之前的任务门类似,但是注意其没有参数

 

4. 中断门的执行流程
  门的本质一样的,就是去gdt表找,根据gdt表找到对应的段选择子然后加载

5.构造中断门进入函数并通过retf的方式返回

 1     // interpret gate.cpp : Defines the entry point for the console application.
 2     #include "stdafx.h"
 3     _declspec(naked) void func(){
 4         //printf("Hello World!\n");
 5         __asm{
 6             
 7             pop eax;
 8             pop ebx;
 9             pop ecx;
10             push ebx;
11             push eax;
12             retf;
13             
14             //iretd;
15         }
16     }
17     
18     int main(int argc, char* argv[])
19     {
20         printf("%x",func);
21         getchar();
22         __asm{
23             int 0x20;
24         }
25         return 0;
26     }

    windbg修改:
    eq 8003f500 0040ee00`00081005 (401005为其函数地址)
  注意:retf远调用,与iretd前面已经讲过不同了。

  备注:在中断门中如果调用int 3,正常返回之后,你会发现调用api出现错误,这是因为 fs没有修复,这里需要保存一份。

       这个错误的原因并不是Intel的问题,我们之后嵌套调用门,int20 --> int21 并没有发现这个问题;

     并且查阅intel手册,里面重点强调NT、IF、VM等Eflags位,并没有提到FS寄存器;

     因此这里可以推断是Windows的处理机制存在的问题,怀疑是先前模式搞得鬼,我们在三环,但是使用零环的权限,而系统以为我们在内核调用int3;

     这问题先放一下,之后如果有时间再来研究这个问题。

 6. 陷阱门描述符

7.  陷阱门有什么用
    查看idt表,并没有陷阱门的影子

 但陷阱门可以接收中断,这一点还是值得使用的。

8. 修改IF标志位的指令(只有在内核层才能使用)

 cli 清零 (不可被屏蔽)
    sti 置位 (可被屏蔽)

9.中断门与陷阱门的区别

 中断门进入会执行cli,此时可屏蔽中断将不被屏蔽。
    陷阱门却不会,此时还可以被可屏蔽中断屏蔽。

10. 中断与异常的区别
  中断往往是硬件触发的;异常往往是软件触发的

11. 陷阱门实验

  实验代码(与上次的中断门一样)

 1     实验代码(与上次的中断门一样)
 2     // interpret gate.cpp : Defines the entry point for the console application.
 3     //
 4     
 5     #include "stdafx.h"
 6     _declspec(naked) void func(){
 7         //printf("Hello World!\n");
 8         __asm{
 9             
10             pop eax;
11             pop ebx;
12             pop ecx;
13             push ebx;
14             push eax;
15             retf;
16             
17             //iretd;
18         }
19     }
20     
21     int main(int argc, char* argv[])
22     {
23         printf("%x",func);
24         getchar();
25         __asm{
26             int 0x20;
27         }
28         return 0;
29     }

   windbg修改
  eq 8003f500 0040ef00`001b1005  

posted @ 2020-03-07 19:15  OneTrainee  阅读(2362)  评论(0编辑  收藏  举报