任務門

使用 call/jmp 去訪問一個任務段,可以達到切換一堆寄存器的目的。但是,CPU同時又提供了另一種方法讓我們訪問任務段,就是任務門。使用 int 指令加索引號,比call/jmp加選擇子要方便。因爲一個 int 0x20 指令(假設我在 IDT[20]處安裝了一個任務門描述符)就可以讓我切換一堆寄存器。

IDT表裏面就三種內容:任務門描述符、中斷門描述符、陷阱門描述符。

到現在或許你已經明白門的含義了,所有的門描述符的裏頭都嵌入着另一個段的選擇子。比如中斷門和陷阱門中嵌入了代碼段的選擇子。任務門也不例外,它裏頭嵌入了任務段的選擇子。

任務門描述符

任務門
任務門的 S=0, TYPE=0101。
在Windows中,典型任務門描述符就是安裝在 IDT[8] 的位置(int 8,8號中斷是雙重錯誤,例如:程序發生錯誤後,進入中斷處理,中斷處理時再發生錯誤,就是雙重錯誤,藍屏),0000850000501188.其中有用的就只有85000050部分。它告訴我們,該任務段的段選擇子是0x0050.

8號中斷詳解:一旦進入 8 號中斷,CPU 會切換一堆寄存器,這時候無論發生什麼錯誤都沒什麼關係,通過一堆寄存器的切換,CPU 保證能跳到一個正確的地方去執行(除非那個地方也被破壞了),緊接着做一些後續處理(比如收集錯誤信息),系統藍屏。

構造任務門描述符

除了TSS描述符選擇子以外, 其他位都是固定的。我們計劃在 8003f048 處設置TSS描述符,因此,任務門描述符的值可以確定:
0000e50000480000<br/>我們計劃將任務門描述符放在 8003f500,所以我們要在windbg執行的第一條命令是:<br/>eq 8003f500 0000e50000480000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章