Windows內核中的CPU架構-6-中斷門(32-Bit Interrupt Gate)


Windows內核中的CPU架構-6-中斷門(32-Bit Interrupt Gate)

中斷門和調用門類似,也是一種系統段。同樣的它也可以用來提權。

中斷門:

雖然中斷門的段描述符如下:

 

 

但是中斷門其實也就是段描述的一種。只不過有稍微區別,並且和調用門的段描述符類型非常相似。

中斷門和調用門的區別:

這里將調用們的段描述符拿來對比下:

 

 

可以看到大致的結構是相同的,只不過 高32位的0-4位作為了一種保留位,采用0填充。

而Type位和段描述符中的s位采用了固定的值。其實這個就拿標准段描述符拿來對比就好了。

首先肯定是一個系統段,那么S字段就采用的是0,Type字段用來標記是系統段的哪一個段,根據下圖就采用D,12的32-Bit Interrupt Gade段。

  還有就是中斷門的高11位的內容采用的是一個字母D,在intel手冊里面表達了這個字段的意思,就是用來判斷是32位還是16位,如果是32位就是是1,16位就是0。

 

除了段描述符的區別,還有段選擇子的區別:

中斷門的段描述符存放在 idt表里面,前面解析的時候有提過idt和gdt表,兩者用起來是一模一樣的。

手動實現中斷門:

構建中斷門

跟前面一樣根據段描述符來構建:

高32位:
    0-700
    8-11:
        E
    12-15:
        E
    16-310040
​
​
低32:
    0-151080
    16-310008

 

得到的段描述符為: 0040EE0000081080

注:這里的配段描述符的過程可以參考前一博客:Windows內核中的CPU架構-5-調用門(32-Bit Call Gate) - Sna1lGo - 博客園 (cnblogs.com)

中的流程。

存放中斷門

中斷門和調用門類似,我們需要把它的段描述符保存到表里,中斷門的表是idt表,所以這里我們首先查看idt表里面的內容:

 

 

可以看到這個80b93500這里是空缺的,我們就把內容放到這里把: 

 

 

使用中斷門:

就首先得明白什么是中斷:(百度百科)中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序並轉入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續運行。

其實就是停止當前的操作跳轉到自己定義的中斷操作里面。有點類似與異常處理了,但是它針對的是CPU的,就CPU才是真正執行代碼的硬件,就CPU直接停止當前操作去進行中斷操作了。大概這樣理解就可以了。

然后執行中斷操作采用的是int 指令,然后后面會加一個編號,來標識該中斷的段描述符在idt表中的位置。 比如說int 3這個中斷指令,我們通過WinDbg來查看下它的段描述符信息:

 

 

它的段描述符為 83e7ee00 000086180,然后函數地址是83e76180,函數名稱是 KiTrap03

所以我們調用的時候,直接在自己的內聯匯編里面采用 int x指令就行。

由於前面我們把自己的中斷描述符放到了80b93500的位置,所以通過計算(80b93500-80b93400)/8=20。我們直接采用int 0x20就行了。

還需要注意的是編寫中斷的函數和普通的函數不一樣,不能采用ret和retn,得采用iretd作為返回指令。

使用中斷門完整代碼:

#include<iostream>
#include<Windows.h>
using namespace std;
​
void _declspec(naked) test()
{
    _asm
    {
        push eax
        mov eax, 0x80b93040
        mov eax, [eax]
        pop eax
        iretd
    }
}
​
int main()
{
    printf("%x\n", test);
    __asm
    {
        int 0x20
    }
    system("pause");
    return 0;
}

 

 

 

這樣我們的程序就可以美美地在x86系統上運行了。

 

小結

中斷門和調用門比較類似,也是一種用來提權的東西。其核心理念在於Windows對intel CPU的一種利用。中斷也是一個常用的計算機術語,其內容也包含了很多,這里就不深入了。任重而道遠,大家加油。


免責聲明!

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



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