刺激战场
六合彩
贵宾厅
  • 2013阅读
  • 0回复

天道酬勤2016 VT驱动 笔记20-2016-1-6 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-07-31

1.sysenter/sysexit指令
由model-specific registers(MSR)控制

我们Hook的3个断点 1,3,E
分别是 Debug,BreakPoint,PageFault

可参考
http://www.docin.com/p-1179607200.html

1.1特权级
   环 0~3共4个特权级,数字越小级别越高,内层的级别高,外层级别低
   CPL(Current Privilege Leave 当前特权级)为当前执行的程序或任务的特权级,存储在CS和SS的低2位中
   DPL(Descriptor Privilege Leave 描述符特权级)为段或门的特权级,储存在段或门描述符的属性低字节中的DPL字段中
   RPL(Requested Privilege Leave 请求特权级)为取代(override)特权级,储存在指向调用目标段的段/门选择符的低2位中
1.2特权指令
   在保护模式下,某些CPU指令属于特权指令,禁止应用程序调用,这些特权指令控制着系统功能(比如装载系统寄存器)。
   仅当CPL为0时才执行他们。如果CPL不为0,执行他们将会产生一个一般保护异常#GP(General-Protection Exception)
   特权级指令
   LGDT/SGDT 装载/保存GDT寄存器
   LLDT/SLDT 装载/保存LDT寄存器
   LIDT/SIDT 装载/保存IDT寄存器
   LTR/STR   装载/保存任务寄存器
   MOV(控制寄存器) 装载或储存控制寄存器
   LMSW/SMSW 装载/保存机器状态字
   CLTS 清除寄存器CR0中的任务切换标志
   MOV(调试寄存器) 装载或储存调试寄存器
   INVD 使缓存失效,有回写
   INVLPG 使TLB项失效
   HLT  使处理器停止
   RDMSR 读模型相关寄存器
   WRMSR 写模型相关寄存器
   RDPMC 读取性能监视计数器
   RDTSC 读取时间戳计数器

1.3 不同特权级代码之间的转移
   代码转移可由指令JMP,CALL,RET,SYSENTER,SYSEXIT,INT n,IRET和中断与异常机制引起
   在保护模式下,代码转移前,处理器会检查描述符的界限,类型和特权级等,
   在检验成功后,目标代码的选择符会被加载到代码段寄存器CS中,指令指针寄存器EIP被重新设置,
   程序控制权被移到新的代码段中
   1.Jmp和Call指令可实现的转移
   (1)直接转移 目标操作数包含目标代码的段选择符
   (2)通过某种描述符转移。目标操作数指向包含目标代码段选择符的某种描述符
   (3)调用门 目标操作数指向一个包含目标代码段选择符的调用门描述符
   (4)TSS(任务段状态)目标操作数指向一个包含目标代码段选择符的TSS描述符
   (5)任务门 目标操作数指向一个任务门,该任务门指向一个包含目标代码段选择符的TSS
   Jmp和Call只能在同特权级的代码之间转移。不可能改变代码的特权级
   2.通过调用门改变特权级
   无论代码段一致还是非一致,都可以利用调用门和Call指令实现从低特权级到高特权级的代码转移
   3.TSS
   任务可以在4个特权级转移,而我们的程序只有一个堆栈,应该如何合区其余堆栈的信息?这就需要IA-32提供的
   新数据结构-TSS(Task-state Segment),任务状态段,可用于任务的堆栈切换及保存任务的运行现场,大小为104字节。
   TSS的段描述符只能位于GDT中,不能位域LDT和IDT中。TSS的段选择符位域系统寄存器TR(Task-Register 任务寄存器)中


1.4 代码转移 (R0-->R3)
    push SelectorStack3 ;SS
    push TopOfStack3    ;ESP
    push SelectorCodeRing3 ;CS
    push 0               ;EIP
    retf                 ;R0-->R3 历史性转移

1.5 调用门(R3-->R0)
   Call SelectorCallGateTest:0 测试调用门(有特权级变换) 还要提供相应的TSS信息

http://www.techbulo.com/708.html
说明一下概念

(1)全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。

基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。在保护模式初始化过程中必须给GDTR加载一个新值。

(2)段选择子(Selector)由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的。段选择子是一个16位的寄存器(同实模式下的段寄存器相同)
    
段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。他的index(描述符索引)部分表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符。然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址,段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。请求特权级(RPL)则代表选择子的特权级,共有4个特权级(0级、1级、2级、3级)。

关于特权级的说明:任务中的每一个段都有一个特定的级别。每当一个程序试图访问某一个段时,就将该程序所拥有的特权级与要访问的特权级进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权级或级别较低特权级的段。
例如给出逻辑地址:21h:12345678h转换为线性地址

a. 选择子SEL=21h=0000000000100 0 01b 他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1

b. OFFSET=12345678h若此时GDT第四个描述符中描述的段基址(Base)为11111111h,则线性地址=11111111h+12345678h=23456789h


(3)局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若干张,每个任务可以有一张。我们可以这样理解GDT和LDT:GDT为一级描述符表,LDT为二级描述符表。如图
LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。LDTR记录局部描述符表的起始位置,与GDTR不同,LDTR的内容是一个段选择子。由于LDT本身同样是一段内存,也是一个段,所以它也有个描述符描述它,这个描述符就存储在GDT中,对应这个表述符也会有一个选择子,LDTR装载的就是这样一个选择子。LDTR可以在程序中随时改变,通过使用lldt指令。如上图,如果装载的是Selector 2则LDTR指向的是表LDT2。举个例子:如果我们想在表LDT2中选择第三个描述符所描述的段的地址12345678h。

1. 首先需要装载LDTR使它指向LDT2 使用指令lldt将Select2装载到LDTR

2. 通过逻辑地址(SEL:OFFSET)访问时SEL的index=3代表选择第三个描述符;TI=1代表选择子是在LDT选择,此时LDTR指向的是LDT2,所以是在LDT2中选择,此时的SEL值为1Ch(二进制为11 1 00b)。OFFSET=12345678h。逻辑地址为1C:12345678h

3. 由SEL选择出描述符,由描述符中的基址(Base)加上OFFSET可得到线性地址,例如基址是11111111h,则线性地址=11111111h+12345678h=23456789h

4. 此时若再想访问LDT1中的第三个描述符,只要使用lldt指令将选择子Selector 1装入再执行2、3两步就可以了(因为此时LDTR又指向了LDT1)

由于每个进程都有自己的一套程序段、数据段、堆栈段,有了局部描述符表则可以将每个进程的程序段、数据段、堆栈段封装在一起,只要改变LDTR就可以实现对不同进程的段进行访问。

当进行任务切换时,处理器会把新任务LDT的段选择符和段描述符自动地加载进LDTR中。在机器加电或处理器复位后,段选择符和基地址被默认地设置为0,而段长度被设置成0xFFFF。
善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个