日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(14)陷阱门

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (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位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的(14)陷阱门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。