通过学习windows启动流程,我们可以了解该过程中系统启动了什么服务,加载了什么驱动,运行了什么程序,这对学习rootkit有参考意义。
下图是windows从引导开始,到windows子系统启动完成的整个流程:
我将跟随书本的顺序,将一些我认为可以藏rootkit的位置加粗表示出来。
固件启动
书上介绍了两种固件启动方式,分别是BIOS和EFI。
BIOS固件启动
机器启动时进行加电自检(Power-on Self-test, POST),POST的工作有确定板载内存大小,对内存进行循环检测,枚举主板上存储设备并确定状态等。
接下来BIOS搜索可引导设备列表以查找引导扇区。硬盘的第一个扇区是主引导记录(MBR),是由windows安装程序写进去的,MBR包含引导代码和分区表,分区表由4个分区表项构成,每个分区表项指向一个主分区。MBR在分区表中找到活动分区(也叫可引导分区,也叫系统卷),然后加载活动分区的引导扇区到内存。引导扇区也叫卷引导记录(Volume Boot Record, VBR),它是分区的第一个扇区,包含一小段引导代码。
VBR中的引导代码负责读取分区文件系统,执行 %SystemDrive%\bootmgr
,这是一个16位启动器管理程序,在实模式下运行,负责建立必须的数据结构,把机器切换到保护模式,把启动管理器的保护模式版本加载到内存。
EFI固件启动
这种方式更简单些,加电自检(POST)后,执行 %SystemDrive%\EFI\Microsoft\Boot\Bootmgfw.efi
程序,将机器切换到保护模式。
启动管理器
BIOS和EFI机器最终都将启动管理器 bootmgr / Bootmgfw.efi 加载到内存中执行。
启动管理器通过注册表储巢文件中的配置数据启动系统,这个文件叫做 BCD(启动配置数据),它存储在下面两个位置之一:
%SystemDrive%\Boot\
对于BIOS机器%SystemDrive%\EFI\Microsoft\Boot\
对于EFI机器
一般使用 bcdedit 工具对这个文件进行操作,比如之前配置WIN7双机调试环境时,就使用了这个工具。
bcdedit /enum
上面这个命令可以枚举BCD对象,如果配置了双机调试,应该至少能看到3条记录,我这没配置:
启动加载器
- BIOS: winload.exe
- EFI: winload.efi
启动加载器首先加载 SYSTEM 注册表储巢(位于%SystemRoot%\System32\config
),并将它装载到注册表 HKLM\SYSTEM 键下。
然后加载数字签名目录文件 nt5.cat 验证