任务门

使用 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

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