windows内核安全(二)

windows系统概述

Posted by volcanohatred on April 10, 2018

系统概述

1.windows下的内存

1.1物理内存

windows下的物理内存不是都可以使用的,因为windows还为设备内存预留了空间。windows能够访问的物理内存取决于windows的系统版本和底层的硬件平台,有时还取决于系统配置。
物理地址扩展通过分页机制可以增加机器地址线的个数,从而增加可访问内存大小。使用PAE看似没用,其实是为了支持数据执行保护和其他特征。
windows
查看windows版本是否支持PAE,检查位于system32中的内核版本:
windows

1.2分段与分页

在windows系统中,应用程序与系统的界限主要取决于硬件的机制,IA-32处理器通过分段和分页来实现内存保护,但是windows更依赖与分页机制(前面讲过),通过分段特权参数实现的复杂4环模型(r0-r3)被2环(r0,r3)替代,即操作系统要么运行在r0(内核层),要么运行在r3(用户层),这两者的差异主要有PDE,PTE的U/S位决定。
分段
在前面的硬件基础中所说的最简化分段机制就是windows系统的分段机制。
windows
分页
页帧是物理内存的一个区域,用于存放需要占用物理内存的页,页帧号(PFN)只是页帧的地址。
在windows中,每个进程都分配有一个自己专有的CR3控制寄存器值,因为CR3寄存器存有页目录的20位PFN,因此每个进程都有自己的页目录,相关的CR3值存储在进程KPROCESS结构的DirectoryTableBASE域中。

1.3其他内存保护

数据执行保护(DEP)
数据执行保护允许内存页被指定为不可执行。DEP分为软件强制和硬件强制。
地址随机化(ASLR)
/GS编译器选项
/SAFESEH链接器

2.R0和R3

2.1空间

用户空间(线性地址0x00000000~0x7fffffff)
内核空间(线性地址0x80000000~0xffffffff) IA-32硬件和windows实现的薄记约定确定每个进程的物理地址不一样,虽然两个程序可能有相同的线性地址但是每个程序最终访问的物理地址不同,每个进程都有自己私有的用户空间。注意是用户空间,因为内核空间是共享的,每个程序的管理员级PDE映射到同一系统页表。
windows windows windows
内核空间是受保护的,因此应用程序的线程必须通过系统调用门访问内核空间,但是线程可以先在用户空间启动,然后通过SYSENTER指令(或者0x2e)跳转到内核空间,然后再转到用户模式。

2.2模式

在用户模式下运行的代码不能访问内核空间的任何信息,也不能直接和硬件进行通讯或触发特权机器指令。内核空间用于存储操作系统和设备驱动程序,内核空间的代码以特权模式执行,该模式称为内核模式,运行在内核模式中的指令基本对机器拥有自主的控制权。
硬件之上的层为windows的硬件抽象层,HAL。HAL主要是通过使用HAL DLL中实现的API封装机器特有的细节来完成。标准的内核模式设备驱动程序调用HAL列程,来间接与硬件交互。
windows
HAL的DLL文件会根据windows运行硬件的不同而不同。
BOOTVID.DLL是计算机启动时原式的VGA图形支持。
操作系统的核心层驻留在nt*.exe中,这个可执行文件通过两层来实现其功能:执行体和内核。执行体实现了系统调用接口和主要系统操作组件(I/O管理器,内存管理器,进程和线程管理器),内核实现了低级例程(同步相关例程,线程调度和中断),执行体建立在这些之上以提供更高服务。内核模式驱动程序部署在HAL和执行体I/O管理器之间。
win32k.sys驱动实现了USER和图形设备接口服务。
内核组件相关联情况:
windows
用户模式服务就像一个后台运行的用户模式应用程序,它很少与用户交互,而是通过一个叫做服务控制管理器(SCM)的用户模式程序来启动和管理。
用户组件相关联情况:
windows

3.API接口

SYSENTER指令
当windows启动时,它会检查自己运行在哪一种处理器上,并且调整自己系统调用的触发方式,如果处理器是很早之前的处理器,那么系统使用INT 0x2e 指令来产生系统调用,对于IA-32处理器,windows使用SYSENTER指令跳转到内核代码,减轻了IDT的负担。
在调用SYSENTER指令之前,必须填充3个64位机器特有的寄存器(MSR),以便处理器能够知道哪里跳转并定位内核模式栈的位置,这些MSR可以被RDMSR和WRMSR指令操控。
windows
系统服务调度表
不论用户模式代码执行的是INT 0x2e还是SYSENTER,最终都是内核系统服务调度程序被调用。它使用系统服务号在地址查找表中索引一个入口。
系统服务号是一个32位的值,前12位表示会调用那个系统服务,12位和13位指定了四个可能的服务描述符表中的一个。 windows
如果12位13位是0x00,使用KeServiceDescriptorTable,如果是0x01,则使用KeServiceDescriptorTableShadows
writefile()的调用流程。
windows
除了本机API以外,windows执行体还导出了数百个其他历程。 windows

4.系统引导

windows引导过程是从启动管理器加载到内存并执行开始,,当然确切还是取决于主板上的安装固件类型。
BIOS固件启动
机器启动时进行加电自检POST,POST进行低级的硬件检查,确定可用板载内存的大小等,然后BIOS搜索可引导设备的列表以查找引导扇区,如果引导设备是硬盘驱动器,那么引导扇区就是主引导记录MBR,MBR引导代码在分区表中查找活动分区,然后把该分区的引导扇区加载到内存。
windows
VBR:卷引导记录。分区的引导扇区。如果BIOS中设置的第一个引导设备不是硬盘驱动器,而是DVD或者其他,BIOS将加载设备的VBR。
EFI固件启动
如果固件符合EFI规范,则就不需要依赖嵌入到MBR或者VBR的代码,因为EFI的引导代码已经存放在固件之中。
Windows启动过程
windows和efi机器最终都将启动管理器(bootmgr或者Bootmgfw.efi)加载到内存,启动管理器使用存储在注册表储巢文件(BCD(启动配置数据))中的配置数据启动系统。如果选择windows作为操作系统,启动加载器将加载并执行windows启动加载器winload.exe,winload.exe加载SYSTEM注册表储巢后会进行完整性验证(nt5.cat),如果完整,启动加载器将会把ntoskrnl.exe和hal.dll到内存。然后加载由ntoskrnl.exe导入的dll,并把这些dll的数字签名和nt5.cat中的数字签名进行核对,然后初始化他们。 windows
smss.exe是会话管理器,执行体做的最后一件事就是初始会话管理器,会话管理器会先执行注册表键值BootExecute所指定的程序,默认情况是autochk.exe。会话管理器还要启动windows子系统(win32k.sys和csrss.exe)


>