(14)陷阱门
一、中斷門和陷阱門的對比
陷阱門和中斷門的結(jié)構(gòu)是一樣的,除了TYPE域的區(qū)別:
32位下,中斷門是0xE,陷阱門是0xF。
使用上也沒什么區(qū)別,除了一點:中斷門會將IF位置0,而陷阱門不會。IF置0表示不響應(yīng)可屏蔽中斷,IF置1表示響應(yīng)可屏蔽中斷。IF對不可屏蔽中斷無影響。鍵盤輸入就是可屏蔽中斷,按電源鍵就是不可屏蔽中斷。
windows不使用陷阱門。
二、構(gòu)造陷阱門
之前做中斷門練習的代碼可以直接應(yīng)用到陷阱門上,正如上面說的,唯二的區(qū)別就是TYPE域和對IF位的影響。
構(gòu)造一個陷阱門:
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 函數(shù),讀取了IDT表第一項 // 004113A0 void __declspec(naked) R0Function() {__asm{//int 3 // 調(diào)試用的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位下應(yīng)該使用iretd,硬編碼是CF} }int _tmain(int argc, _TCHAR* argv[]) {__asm {INT 0x20}printf("%08x %08x\n", *(PDWORD)IDTItem0, *(PDWORD)((PBYTE)IDTItem0+0x4));getchar();return 0; }可以看到,和中斷門沒什么區(qū)別,接下來,在裸函數(shù)內(nèi)加一個int 3,我們到0環(huán)跟一下,看看IF位,中斷門和陷阱門的區(qū)別。
先看陷阱門的EFLAG:
是202,IF位是1.
現(xiàn)在,修改IDT,改成中斷門:
kd> eq 8003f500 0041ee00`000813a0執(zhí)行,看看esp:
可以看到,EFLAG寄存器的值是0x2,IF被清零了。但是內(nèi)存窗口的值沒有更新,不太清楚原因。
以上就是陷阱門的實驗。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)