呼叫門描述符

2021-09-19 12:02:53 字數 1958 閱讀 8562

門描述符跟段描述符的結構不同

2. 它定義了在指定**段例程的入口點(偏移)。

3. 它指定了呼叫者嘗試去訪問例程所需要的特權級(dpl 這裡是訪問者所要具備的特權級)。

4. 如果發生了棧切換,它指定了拷貝到新棧的可選引數的數量(5位最多32個)。

也就是說,在跳到r0執行相應例程的時候,特權級便了,使用的棧也會改變,所以會有傳參這個說法。

5. 它定義了push到目標棧的值的大小:16位門強制16位push,32位門強制32位push。

6. 它指定了呼叫門描述符是否有效(p位)。

我們自己動手嘗試一下:首先安裝我們的呼叫門,我這裡安裝在xp上的,要安裝我們自己例程,需要首先看下我們的安裝函式的位址是多少,可以在***的示例**裡將int 3那裡注釋掉 或者呼叫win32api手動加乙個斷點 然後用windbg捕捉。xp_sp3上是0x401030,並且在8003f048處在xp_sp3必定是全0的一串的,我這裡沒捕捉(太懶了),我們把我們的例程安裝到這個位址上。

用命令 eq 8003f048 0040ec00`00081030 進行安裝。下圖是我安裝好之後的記憶體樣子。

為什麼是 0040ec00`00081030是因為根據呼叫門的結構來看,高16位和最低的16位拼接為偏移 也就是呼叫門中指定的例程位置。其他按照結構來就好 引數記得填0.我們選擇08作為選擇子是因為這個地方的dpl為0,我們進入這裡,我們的cpl也會變為0,並且這個段基址與我們的程式的段基址是相同的,跳到這裡的話不用再計算相對偏移就會非常方便。

呼叫門**如下:

ps:這裡最好用vc6的編譯器編譯,用vs2013發現不能執行,可能是缺少相應的依賴庫,但是並未嘗試,vc6的話能很好的相容。

#include

#include

ushort g_cs;

ushort g_ds;

ushort g_es;

ushort g_ss;

ushort g_fs;

ushort g_gs;

ushort kernelhidword =0;

ushort kernellowdword =0;

_declspec

(naked)

void

getr0data()

//call時呼叫的例程

_asm

}void

getr3data()

}void

printdata()

}int

_tmain

(int argc, _tchar* ar**)

;//跳到0x48的地方 段選擇子恰好索引為9

getr3data()

;printdata()

; _asm

//getr0data(); 我這裡一開始沒發現 寫了上去 發現 不對... 其實根本就不需要 因為呼叫了gate指定的函式了 所以直接列印就好

printdata()

;//測試下返回後的情況

getr3data()

;printdata()

;getchar()

;getchar()

;return0;

}

可以看出我們只是在呼叫過程中暫時到了r0的地方,但實際上呼叫完例程後我們就離開了r0,恢復了原來的一些暫存器。

參考了以下部落格:

帶引數的呼叫門示例講解可以參考下面的部落格:

中斷描述符(IDT) 任務門 中斷門 陷阱門

中斷描述符idt表示乙個系統表,它與中斷或異常向量相聯絡。每乙個中斷或異常向量在這個系統表中有對應的中斷或異常處理程式入口位址。中斷描述符的每一項對應乙個中斷或異常向量,每個向量由8個位元組組成。因此,最多需要256 8 2048位元組來存放idt。在執行中斷之前,必須初始化idt 中斷描述符表 i...

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...