windows核心分析索引目錄:
中斷門與陷阱門
問題索引:
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的方式返回
1windbg修改://2 #include "
stdafx.h
"3 _declspec(naked) void
func()16}
1718
int main(int argc, char*ar**)
1925
return0;
26 }
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. 陷阱門實驗
實驗**(與上次的中斷門一樣)
1windbg修改實驗**(與上次的中斷門一樣)2//
3//45 #include "
stdafx.h
"6 _declspec(naked) void
func()19}
2021
int main(int argc, char*ar**)
2228
return0;
29 }
eq 8003f500 0040ef00`001b1005
12 中斷門與陷阱門
當我們寫win32程式的時候,呼叫windows提供的api,程式執行要一步一步從三環到0環,這乙個過程就要用到中斷門,新的cpu用快速呼叫。1.idt idt即中斷描述符表,與gdt一樣,idt也是由一系列描述符組成,每個描述符佔8個位元組,但是idt第乙個描述符不是null.在windbg中檢視...
中斷描述符(IDT) 任務門 中斷門 陷阱門
中斷描述符idt表示乙個系統表,它與中斷或異常向量相聯絡。每乙個中斷或異常向量在這個系統表中有對應的中斷或異常處理程式入口位址。中斷描述符的每一項對應乙個中斷或異常向量,每個向量由8個位元組組成。因此,最多需要256 8 2048位元組來存放idt。在執行中斷之前,必須初始化idt 中斷描述符表 i...
利用oc門或od門實現線與 oc門 od門
oc門特點 即集電極開路閘電路,od門,即漏極開路閘電路,必須外界上拉電阻和電源才能將開關電平作為高低電平用。否則它一般只作為開關大電壓和大電流負載,所以又叫做驅動閘電路。輸出端可以實現線與連線 oc門必須外接負載電阻和電源才能正常工作。od門特點 開漏形式的電路有以下幾個特點 利用外部電路的驅動能...