MBR引导流程及后门原理。
# 系统加载流程
以win7为例,由MBR格式引导的系统加载流程如下图:
- BIOSBIOS加电自检,执行内存地址为0FFF:0000处的跳转指令,跳转到固化在ROM中的自检程序,对系统硬件进行检查。通过自检后,将MBR从引导设备的第一个扇区读入地址0x7c00,并提供一系列低级功能,即BIOS中断,可通过
int
指令访问实模式代码。 - MBRMBR在实模式下执行,先将自己重定位到0x0600地址后再继续执行,查看分区表,找到活动分区,然后将分区的第一个扇区(VBR)读入0x7c00。
- VBRVBR的大小也为512字节,其前两个字节为跳转指令,跳过VBR中的BIOS参数块(BPB,包含驱动程序和分区的信息)并进入主代码。然后将分区的前16个扇区读入内存(0xD000处)
- IPL最大可达15个扇区,位于VBR之后(1-15扇区),IPL的主要功能是在磁盘上定位NTDLR,然后将其读入0x20000内存处。
- NT Boot SectorMBR加载NT Boot Sector,它可以读取FAT32和NTFS格式的磁盘文件,它将读取位于C://system32或C://system32/boot目录下的BOOTMGR.exe程序
- BootMGR.exebootmgr.exe有一个16字节的校验头,当检验成功后,将映射到0x40000的位置,并从
BmMain
函数开始执行。然后检查休眠状态,一旦发现休眠,则加载winresume.exe并继续执行。BootMGR.exe加载BCD数据库,并遍历Boot入口点。选择了入口点后,加载BmLanuchBootEntry
函数,然后CPU进入64位模式,并跳转到winload.exe。 - Winload.exewinload.exe首先加载system的hive文件,然后加载ntoskrnl.exe、HAL.dll、依赖和关键驱动。创建
PSLoadModuleList
和LOADER_PARMETER_BLOCK
结构,其中包含了内核映射和选项列表等信息。然后使用OslArchTranslateToKernel
函数进行内核(ntoskrnl.exe)初始化流程。 - NTOSKRNLNTOSKRNL使用两个阶段来初始化操作系统:
- 第一阶段——初始化内核本身:调用
HalInitialiseBios
初始化显示驱动启动调试器调用KiInitializeKernel
- 第二阶段——初始化系统:
HalInit
SystemObInit
System为ASLR设置启动时间差PsInitial
系统进程启动首个系统进程(SMSS.exe)
- 第一阶段——初始化内核本身:调用
MBR BootKit原理
MBR BootKit的基本原理是:首先是读取原始MBR,把分区表从MBR中复制出来。然后,BootKit把自己的包含恶意二进制数据的主引导记录放到主引导扇区,并复制新的分区表进去。但是,并非只有分区表需要保留,原始主引导记录也需要保存下来。为此,BootKit复制原始主引导记录到其它64个未用到的扇区。BootKit执行完自己的操作后再读取原始的主引导记录并跳到0x7c00处执行来引导开机
下图为vBootKit
的感染流程:
- 从CD-ROM获取执行权限(也就是vBootKit将制作成ISO文件,伪装成启动光盘),BIOS加载阶段,PXE将vBootKit代码重定位到0x9e000。
- vBootKit代码Hook INT 13
- Hook函数搜索每个读取请求中的签名,如签名匹配,则执行payload
- vBootKit读取MBR,并在INT 13 Hook安装的情况下正常启动boot进程
- 当NT boot sector加载BOOTMGR.exe时,16字节的头开始执行,并对BOOTMGR.exe进行校验(checksum PE头),之后BOOTMGR.exe,被映射到0x400000,Hook钩子获取到执行权限,并将检查签名验证(签名为bootmgr.exe的最后8个字节,不包含0字节),然后执行payload(payload给Bootmgr.exe打上补丁),用于绕过签名验证。
- 然后bootmgr加载引导显示界面,等用户选择了引导项后,bootmgr调用
BlImgLoadPEImageEx
函数来加载winload.exe,并验证该程序的数字签名。 - 和bootmgr.exe被打补丁的过程差不多,winload.exe也被打上了补丁:
OslArchTransferToKernel
该函数用于获取控制权限,使得vbootkit再次被重定位到内核内存的空间中,且该内存具有读写权限,并将20字节的代码应用到StartFirstUserProcess
函数中,将vbootkit重定位到新分配的空间中,并跳转到该位置。 - 获取了完全控制权限后,修复内核并加载payload。
使用vbootkit ISO引导windows 7:
近期评论