中斷門與陷阱門


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  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM