RootKit基础学习

很多RootKit都是运行在Ring0层的,所以我们必须先了解Ring0是个什么东西。

其实Ring(环)就是x86平台进行访问控制的概念,Ring0层也叫作环0层,win平台下一共就有4个环,不用说肯定是Ring0,Ring1,Ring2,Ring3了,权限最高的就是Ring0层,也叫做内核层,权限最低的就是Ring3层了呀,也叫作用户层。Windows系统就仅仅使用了Ring0层和Ring3层,试想Windows系统用4个环来实现访问控制那么难度大大上升了。内核层权限运行系统内核和驱动程序,而用户层权限运行普通程序。当一个程序执行的时候系统会分配一个环编号,环编号高的程序不能直接访问环编号低的程序,就是Ring3层的程序不能访问Ring0层的程序,当然除了程序外还有汇编语言,有的汇编指令也是需要Ring0权限的。

就比如读写硬件端口的in,out指令和控制CPU状态的cli,sti指令。

除了需要了解Ring0层概念,还需要了解关键表的概念。

CPU除了使用Ring分层机制进行访问限制外还需要对正在运行的代码进行管理控制。发出中断,程序崩溃,发出硬件信号都是有的CPU处理的而不是系统,所以CPU要实现这些功能就必须维护管理很多数据,而这些数据一般都是以表的形式存放的,这些表如下:

1.全局描述符表,英文全称Global Descriptor Table,简称GDT,有且仅有一个,用于映射内存地址。

2.本地描述符表,英文全称Local Descriptor Table,简称LDT,也是用于映射内存地址。

3.页目录,英文全称Page Directory,也是用于映射内存。

4.中断描述符表,英文全称Interrupt Descriptor Table,简称IDT,用于索引中断处理程序。

5.系统服务调度表,英文全称System Services Descriptor Table,简称SSDT,用于协助Windows系统处理系统调用。

内存分页的概念也不得不说呀!

因为Windows系统内存分页机制是比较难以理解的一部分内容,我们都知道在32位的Windows系统中每一个进程都有属于自己的4GB内存空间,但是在以前Windows的主流配置的计算机的自身内存都不够4GB的时候,那如何保证每个进程都独享4GB呢?答案就是虚拟内存了,在现实环境下运行的程序所用的内存都是非常小的,所以就是操作系统给了4GB的虚拟内存,但是它真正的物理内存可能只有几十MB甚至几MB大小,然而每个程序面对的内存地址都是基本相同的,这就是映射。为了实现这种巧妙的内存映射,Windows系统使用页表概念。其实Windows系统通过目录,页表(Page Table)与页表项(Page Table Entry,PTE)这种二级表结构将虚拟地址转化为物理地址之间的内存映射的。

首先Windows给每一个进程分配一个不同的页目录用于保存这种二级表结构,每个页目录保存的虚拟地址到物理地址的映射关系都不同,所以才会有两个不同的进程访问同一虚拟地址而可以存储不同数据的情况。一个32位的虚拟地址可以解释为3个部分,就是页目录索引,页表索引,字节索引,负责描述内存映射结构中索引物理地址。

页目录索引用来在页目录中索引这个虚拟地址的页目录项(Page Directory Entries,PDE)从而找到PTE所在的页表。

页表索引用来在准确的页表中索引PTE从而找到目标内存页。

字节索引负责在目标内存页中索引最终物理地址。

我们解释一下转换虚拟地址的方法。

1.内存管理硬件找到当前进程页目录,而且每一次都在进程环境切换时也会得到一个新的进程页目录地址。

2.在进程页目录中使用页目录索引可以找到相应的PDE,这个PDE包含了这个页表的页面帧编号(Page Frame Number,PFN),通过这些信息可以找到包含这个虚拟地址映射信息的页表。

3.在找到页表中使用页表索引可以找到PTE,它描述了这个虚拟地址所在物理地址信息。

4.根据这个PTE索引找到页面,判断这个页面是不是有效的,如果这个页面有效,它就会包含这个虚拟页所对应的物理内存页信息的PFN,但是如果这个页面是无效的,那么内存管理错误处理器就会找到该页面而且尝试使它变成有效的页面,如果不能变成有效的,就是产生错误。

5.PTE所指的页面如果有效的话,那么在它指向的物理内存页中使用字节索引,就可以定位到真正的物理地址上。

你可能感兴趣的:(Window核心)