(14)陷阱门
一、中斷門和陷阱門的對比
陷阱門和中斷門的結構是一樣的,除了TYPE域的區別:
32位下,中斷門是0xE,陷阱門是0xF。
使用上也沒什么區別,除了一點:中斷門會將IF位置0,而陷阱門不會。IF置0表示不響應可屏蔽中斷,IF置1表示響應可屏蔽中斷。IF對不可屏蔽中斷無影響。鍵盤輸入就是可屏蔽中斷,按電源鍵就是不可屏蔽中斷。
windows不使用陷阱門。
二、構造陷阱門
之前做中斷門練習的代碼可以直接應用到陷阱門上,正如上面說的,唯二的區別就是TYPE域和對IF位的影響。
構造一個陷阱門:
kd> eq 8003f500 0041ef00`000813a0照搬中斷門的代碼:
// INTGate.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Windows.h> #include <stdio.h>BYTE IDTItem0[8];// R0 函數,讀取了IDT表第一項 // 004113A0 void __declspec(naked) R0Function() {__asm{//int 3 // 調試用的pushadpushfdmov eax,0x8003f400mov ebx,[eax]mov ecx,[eax+0x4]mov dword ptr ds:[IDTItem0],ebxmov dword ptr ds:[IDTItem0+0x4],ecxpopfdpopadiretd // iret 會藍屏,因為 iret的硬編碼是66CF,32位下應該使用iretd,硬編碼是CF} }int _tmain(int argc, _TCHAR* argv[]) {__asm {INT 0x20}printf("%08x %08x\n", *(PDWORD)IDTItem0, *(PDWORD)((PBYTE)IDTItem0+0x4));getchar();return 0; }可以看到,和中斷門沒什么區別,接下來,在裸函數內加一個int 3,我們到0環跟一下,看看IF位,中斷門和陷阱門的區別。
先看陷阱門的EFLAG:
是202,IF位是1.
現在,修改IDT,改成中斷門:
kd> eq 8003f500 0041ee00`000813a0執行,看看esp:
可以看到,EFLAG寄存器的值是0x2,IF被清零了。但是內存窗口的值沒有更新,不太清楚原因。
以上就是陷阱門的實驗。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結