九.Windows内核保护机制--TSS

一.什么是TSS:

  TSS全称Task State Segment,中文名任务状态段,储存在内存中,大小104个字节,结构如下:

  

二.TSS原本的作用:

  TSS在任务(进程)切换时起着重要的作用,通过它保存CPU中各寄存器的值,实现任务的挂起和恢复。

  比如说,当CPU执行A进程的时间片用完,要切换到B进程时,CPU会先把当前寄存器里的值保存到A进程的TSS里(任务寄存器TR指向当前进程的TSS),比如CS,EIP,ESP,标志寄存器等等,然后挂起A进程。执行B进程。这样,在CPU下次执行A进程的时候,就可以从其TSS中取出,CPU就知道上一次A进程执行到了什么位置,执行状态等等,这样就恢复了上次A进程的执行现场。(但是Windows和Linux并没有使用TSS进行任务切换的工作,是使用的堆栈来实现的任务(也就是线程)的切换.但是在执行调用门操作的时候,ESP和SS的值就是通过TSS来自动进行切换的.)

三.CPU如何调用TSS:

  CPU中有一个TR段寄存器,存出一个段描述符,存在于GDT段描述符表中,属于系统段描述符的一种,base指向TSS表的地址,limit表示他的偏移范围.

四.我们对于TSS的调用:

  1.申请内存空间,自己写一个TSS表(104字节),并为表中的寄存器赋值.

  2.修改GDT表中的段描述符,让其Base指向我们自己的TSS表

  3.CALL FAR 或者 JMP FAR,跳到段描述符,使用我们的TSS表.(会先自动改写TR寄存器,不需要LTR在改了.)

    1)也可以通过LTR指令:修改TR寄存器的段选择子,让TR寄存器指向GDT表中我们改写的TR段描述符.(LTR是系统指令,只有在R0层,才能使用)

        mov ax,4B(GDT中,自己写的段描述符)

        ltr ax

  *加载后TSS段描述符状态会更改(就是上图的B位),TYPE的值由1001变为1011.

  *如果要读TR寄存器的值,也就是段选择子,可以用STR指令.

  上述操作完成,可以一次性改写一堆寄存器,在指向TSS表的时候,我们可以使用CALL FAR 和JMP FAR指令来进行,需要注意的是二者的区别,  CALL FAR后NT位为1,返回时,EIP会取Previous Task Link的值,JMP FAR后NT位为0,返回时,EIP从堆栈中取值.

原文地址:https://www.cnblogs.com/jszyx/p/12431773.html

时间: 2024-10-15 11:15:28

九.Windows内核保护机制--TSS的相关文章

六.Windows内核保护机制--中断门

一.中断门,和调用门差不多,细节方面有些差异: 1.符号表的问题,调用门中所使用的是GDT表,而中断门中使用的是IDT表. 2.中断门,不能直接传参数. 3.TEPY标志不一样,调用门是1100 ,32位中断门是1110 ,16位中断门是0110. 4.调用方式不太一样,调用门使用的是CALL调用,中断门直接使用 int [ index](index使用10进制就行了),对IDT表进行搜索. 5.前面说过了,调用门在使用的时候,会更改 CS SS EIP ESP四个寄存.中断门除了这4个,还增加

【安全健行】(6):Windows漏洞保护机制

2015/5/21 11:07:55 之前我们一直在Linux平台上分析漏洞,那是因为对于绝大多数Hacker获得一个Linux平台更加容易,而且主流的服务器系统基本也都是Linux/Unix的:另外一个好处就是Linux提供了用户自定义的强大功能,我们可以根据需要编译汇编程序代码,关闭相应的安全保护机制,便于我们的研究学习. 然而现实中有影响力的漏洞大多是基于Windows系统,因此这节我们来介绍下Winodws系统上是安全保护机制,至于Windows上的漏洞分析,我们会在之后的恶意代码分析章

二.x86内核保护机制--段保护

一.段的作用: 在x86-16体系中,为了解决16位寄存器对20位地址线的寻址问题,引入了分段式内存管理.而段的沿用,一方面是为了保持向下的拓展性,另一方面,也增加了可寻址的范围,增加了CPU的性能. 随着CPU性能的大幅度提升,生产商的研发重点,也开始着重于计算机的稳定性,和数据的安全性,因此,在会影响到计算机稳定性和重要数据的地方,就要给用户加上限制,限制用户的行为主要是,数据的读,写和执行,在限制用户的同时,又不能影响操作系统对数据和代码的使用,因此,引入了层(R0,R1,R2,R3)的概

【转】深入Windows内核——C++中的消息机制

上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图  Win32Test.h 1 #pragma once 2 3 #include <windows.h> 4 #include <atltypes.h> 5 #include <tchar.h> 6 7 //资源ID 8 #define ID_BUTTON_DRAW 1000 9 #d

Windows内核原理系列01 - 基本概念

1.Windows API Windows 应用编程接口(API)是针对WIndwos操作系统用户模式的系统编程接口,包含在WindwosSDK中. 2.关于.NET .NET由一个被称为FCL的类库和一个被称为CLR的公共语言运行库组成.FCL是建立在CLR之上的,而CLR是一组标准的COM服务器,提供了垃圾回收,即时编译类型检验等特性.由于CLR的这些特性,使得开发人员的生产效率得以提高..NET框架与组建的关系如下: .NET应用程序 用户模式(托管代码) —————————— 类库(FC

Linux内核同步机制

http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制——信号量.锁. 一.信号量 首先还是看看内核中是怎么实现的,内核中用struct semaphore数据结构表示信号量(<linux/semphone.h>中): [cpp] view plaincopyprint? struct semaph

Linux内核同步机制--转发自蜗窝科技

Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个位于memory中的变量的值到寄存器中 2.修改该变量的值(也就是修改寄存器中的值) 3.将寄存器中的数值写回memory中的变量值 如果这个操作序列是串行化的操作(在一个thread中串行执行),那么一切OK,然而,世界总是不能如你所愿.在多CPU体系结构中,运行在两个CPU上的两个内核控制路径同

各种保护机制绕过手法

一.绕过GS编译选项 ●原理:通过VC++编译器在函数前后添加额外的处理代码,前部分用于由伪随机数生成的cookie并放入.data节段,当本地变量初始化,就会向栈中插入cookie,它位于局部变量和返回地址之间 ●绕过方法: 1.猜测/计算cookie Reducing the Effective Entropy of GS Cookies:http://www.uninformed.org/?v=7&a=2&t=html 至从覆盖SEH的方法出现后,这种方法目前已基本不用了,它没有后面

windows内存详解(一) 全面介绍Windows内存管理机制及C++内存分配实例

十分感谢MS社区的帖子,讲得很好~ http://social.technet.microsoft.com/Forums/zh-CN/2219/thread/afc1269f-fe08-4dc7-bb94-c395d607e536 (一):进程空间 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本文目的: 对Windows内存管理机制了解清楚,有效的利用C+