首页
社区
课程
招聘
[原创]15.滴水中级班(内核驱动)——任务门
发表于: 1小时前 38

[原创]15.滴水中级班(内核驱动)——任务门

1小时前
38

访问任务段的目的是可以同时替换一堆寄存器。思考题大家课后的时候好好想想,把这个想明白。

什么是任务门呢?我们之前讲过IDT表,IDT叫中断描述符表,在这个中断描述符表中,全都是系统段描述符,而且系统段描述符主要分为三类,一类是中断门,一类是陷阱门,还有一类是任务门。

中断门和陷阱门我们之前讲过了,任务门是什么样的呢?

上图就是任务门描述符的样子,注意灰色的部分是保留的,大家做实验的时候填0就可以了。任务门描述符比较简单,需要注意的地方就是这里的类型Type是5也就是0101,大家需要记住Type为9和B的时候是什么,1001和1011。低四字节的16~31位存储的是TSS段的段描述符,这块怎么理解呢?这块存储的既不是地址、也不是偏移,而是TSS的段描述符,它是描述符的选择子,就是用来找GDT表里存储的TSS的描述符,一定要弄清楚。

任务门描述符麻烦就麻烦在它跨表了,我们知道任务门本身是在IDT表里,但是这里指定了TSS段的描述符,TSS段描述符在GDT表里,我们看一下任务门执行过程。

首先通过一个INT指令,这个N是索引,这个索引先查IDT表,找到中断门描述符,接着通过中断门描述符去查GDT表,找到任务段描述符,也就是通过那个低四字节的16~31位找到TSS的段描述符,之后把它加载到TR寄存器里,然后再通过TR寄存器指向的那104个字节也就是那个TSS段来修改我们要修改的一堆寄存器,最后通过IRETD返回。

那么学了这些东西我们就知道,如果要做实验的话,要构造两个描述符,一个是任务门的描述符,把它构造出来以后写到IDT表里;一个是TSS段描述符,把这个段描述符写到GDT表里,这样我们就可以执行这个任务门了。

我们可以看到,代码里面第一个eq就是任务描述符,第二个eq就是TSS段描述符,我们的机器是不一样的,自己机器上肯定是要重新构造的。

其他地方都没有改,需要改的就是_asm里面的这块指令,因为我们如果要通过任务门去访问的话,就需要INT指令去访问了。

这里大家注意,我们打印出来CR3多个的时候,就用最后一个就行。代码执行成功了,这里打印出的OK是自定义的全局变量,用来给程序是否执行做哨兵的,不用管。这里CS是8,进入0环,可以看到任务门的实验就完整OK了。回去之后一定好好思考思考思考题——为什么有任务段了还要学任务门。这里水哥又留了一个问题——CPU给我们提供TSS这个东西,任务段也好、任务门也好,目的是希望我们在任务切换的时候,在硬件级别使用这种切换,但是操作系统并没有使用,无论是Windows还是Linux都没有使用,那么请问是什么地方用了呢?并且操作系统既然不用它来任务的切换,那么拿它来做什么呢?



[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回