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
