深入底层 评估Vista系统内核模式安全性( 二 )


如果启动列表的某个条目被选择,跟随BmpTransferExecution之后,将使用BmpLaunchBootEntry对该条目进行加载 。BmpTransferExecution将重新找回启动选项(通过BlGetBootOptionString)并把他们交给BlImgLoadBootApplication 。如果FVE(Full Volume Encryption)被激活,BlFveSecureBootUnlockBootDevice和 BlFveSecureBootCheckpointBootApp将被调用 。由于Windows分区被加密,必须在把控制权交给Vista OS Loader前对分区进行解密 。
最后,Boot Manager调用BlImgStartBootApplication把控制权交给Vista OS Loader 。
Windows Vista操作系统加载
bootmgr调用了位于%SystemRoot%System32WINLOAD.EXE下的Vista OS Loader 。WINLOAD.EXE替换了NTLDR(Windows NT OS Loader),该小节的最后部分,会引用WINLOAD.EXE在开始入口点(OslMain)的指令 。
一个典型的Vista OS载入的BCD入口配置文件如下:
Windows;Boot;Loader
IdentifIEr:;{current}
Type:;10200003
Device:;partition=C:
SYMANTEC;ADVANCED;THREAT;RESEARCH;3
Path:;Windowssystem32WINLOAD.EXE
Description:;Microsoft;Windows
Locale:;en-US
Inherit;options:;{bootloadersettings}
Boot;debugger:;No
Pre-boot;EMS;Enabled:;No
Advanced;options:;No
Options;editor:;No
Windows;device:;partition=C:
Windows;root:;Windows
Resume;application:;{3ced334e-a0a5-11da-8c2b-cbb6baaeea6d}
No;Execute;policy:;OptIn
Detect;HAL:;No
No;integrity;checks:;No
Disable;boot;display:;No
Boot;processor;only:;No
Firmware;PCI;settings:;No
Log;initialization:;No
OS;boot;information:;No
Kernel;debugger:;No
HAL;breakpoint:;No
EMS;enabled;in;OS:;No
执行从OslMain开始 。它重用了与bootmgr阶段相同的代码,因此InitializeLibrary在bootmgr内的工作原理与在WINLOAD.EXE内的工作原理相似 。在InitializeLibrary之后,控制权交给OslMain 。
如果启动状态日志记录被激活,WINLOAD.EXE将会把结果写入%SystemDrive%Bootbootstat.dat (通过 OslpInitializeBootStatusDataLog和OslpSetBootStatusData) 。接下来WINLOAD.EXE调用OslDisplayInitialize,并使用BlResourceFindHTML定位osloader.xsl所在的资源节点 。控制权转交给BlXmiInitialize 。在系统启动过程中osloader.xsl控制着高级启动选项 。在操作完高级启动选项(使用OslDisplayAdvancedOptionsProcess),WINLOAD.EXE现在就准备开始启动 。启动阶段首先会使用BlDeviceOpen打开启动设备 。根据设备类型,BlDeviceOpen会使用不同的设备函数集来打开设备 。
全盘加密(_FvebDeviceFunctionTable) 如下:
dd;0;;;FVE;has;no;EnumerateDeviceClass;callback
dd;offset;_FvebOpen@8;;;FvebOpen(x,x)
dd;offset;_FvebClose@4;;;FvebClose(x)
dd;offset;_FvebRead@16;;;FvebRead(x,x,x,x)
dd;offset;_FvebWrite@16;;;FvebWrite(x,x,x,x)
dd;offset;_FvebGetInformation@8;;;FvebGetInformation(x,x)
dd;offset;_FvebSetInformation@8;;;FvebSetInformation(x,x)
dd;offset;_FvebReset@4;;;FvebReset(x)
For;block;I/O;(_BlockIoDeviceFunctionTable);these;are:
dd;offset;_BlockIoEnumerateDeviceClass@12;;;BlockIoEnumerateDeviceClass(x,x,x)
dd;offset;_BlockIoOpen@8;;;BlockIoOpen(x,;x)
dd;offset;_BlockIoClose@4;;;BlockIoClose(x)
dd;offset;_BlockIoReadUsingCache@16;;;BlockIoReadUsingCache(x,x,x,x)
dd;offset;_BlockIoWrite@16;;;BlockIoWrite(x,x,x,x)
dd;offset;_BlockIoGetInformation@8;;;BlockIoGetInformation(x,x)
dd;offset;_BlockIoSetInformation@8;;;BlockIoSetInformation(x,x)
dd;offset;?handleInputChar@OsxmlMeter@@UAEHG@Z;;;OsxmlMeter::handleInputChar(ushort)
dd;offset;_BlockIoCreate@12;;;BlockIoCreate(x,x,x)
For;console;(_ConsoleDeviceFunctionTable);these;are:
dd;offset;_UdpEnumerateDeviceClass@12;;;UdpEnumerateDeviceClass(x,x,x)
dd;offset;_ConsoleOpen@8;;;ConsoleOpen(x,x)
dd;offset;_ConsoleClose@4;;;ConsoleClose(x)
dd;offset;_ConsoleRead@16;;;ConsoleRead(x,x,x,x)
dd;offset;_ConsoleWrite@16;;;ConsoleWrite(x,x,x,x)
dd;offset;_ConsoleGetInformation@8;;;ConsoleGetInformation(x,x)

推荐阅读