中断门与陷阱门
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