首页
社区
课程
招聘
[分享]Windows初始化过程
发表于: 2021-6-28 18:22 15467

[分享]Windows初始化过程

2021-6-28 18:22
15467

最近在专研UEFI,发现有段时间没发帖子了... 所以讲一下Windows初始化的过程。
环境:Windows 2004 x64
个人见解,有不对的可以私信我,QQ:1045551070
个人博客:5e7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2D9k6h3q4F1L8%4c8W2i4K6u0W2j5$3!0E0i4K6u0r3j5i4u0U0K9r3W2$3k6i4y4Q4x3V1k6G2L8X3I4&6i4K6g2X3N6r3S2W2i4K6g2X3j5Y4u0S2N6X3f1`.

1. 前言

1
2
随着计算机的发展, 传统的BIOS引导已经过时, 关于UEFI引导的安全对抗已经展开。
从如下流程图我们可以看出UEFI中MBR和VBR不再存在, 而是UEFI自己负责加载bootmgr, 这也意味着更加安全和迅速。 

图片描述

2. UEFI规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
与传统的BIOS引导相反, UEFI规范覆盖了硬件初始化开始到操作系统启动前的每一个步骤, 该规范主要分七个步骤,如下:
 
  1.     安全性阶段(SEC):初始化临时缓存区, 即将Cpu的Cache设置为no-eviction模式, 并将整理的参数传递给BFV中找出的PEI入口函数。(在SEC阶段执行的代码是从SPI闪存运行)
 
  2.     Pre-EFI 初始化阶段(PEI):配置内存控制器,初始化芯片组,并处理S3恢复过程。在此阶段执行的代码在临时内存中运行,直到初始化内存控制器为止。随后从DXE IPL PPI的Entry服务中找到DXE Image的入口函数并调用。
 
  3.     驱动执行环境阶段(DXE):初始化系统管理模式(SMM) 和 DXE服务(Protocol)以及BS和RT服务。初始化完毕后DXE通过 EFI_BDS_ARCH_PROTOCOL找到BDS并调用入口函数。
 
  4.     引导设备选择阶段(BDS):通过枚举可能包含UEFI兼容引导程序的PCI总线上的外围设备,来发现可以从中引导OS的硬件设备(Os loader)。
 
  5.     临时系统加载阶段(TSL):操作系统加载器(Os loader)执行的第一阶段, 这个阶段是为Os loader准备执行环境,直至启动服务调用ExitBootServices(),系统将进入RT阶段。
 
  6.     运行时阶段(RT):此时系统的控制权已由UEFI内核转交给Os loader手中, 随着Os loader的运行,最终会进入内核入口KiSystemStartup函数,将控制权完全交给OS。
 
  7.     AL阶段:在RT阶段系统遇到灾难性错误会来到这(不做详细描述)。

如上所述,我们主要将视线放到BDS、TSL、RT阶段。

3. BootMgr

3.1 EfiEntry

1
在BDS后,SPI储存的UEFI固件代码已完成工作, 随后UEFI固件启动管理器先查询NVRAM UEFI变量以找到ESP,并找到OS特定的启动管理器bootmgfw.efi调用它入口函数(DXE 驱动)。

BootMgr的入口函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
EFI_STATUS __fastcall EfiEntry(
    EFI_HANDLE ImageHandle,         // 程序内存映像的句柄
    EFI_SYSTEM_TABLE *SystemTable   // 系统表指针
    )
{
  int unKnow;
  __int64 *BootParameters;
  unsigned int Status;
 
  BootParameters = EfiInitCreateInputParametersEx(
      ImageHandle,
      SystemTable,
      unKnow);// 将EfiEntry参数转换为bootmgfw所期望的应用程序参数格式
  if ( BootParameters )
    Status = BmMain(BootParameters);   // 调用Windows引导管理器入口点
  else
    Status = 0xC000000D;                        // STATUS_INVALID_PARAMETER
  return EfiGetEfiStatusCode(Status);           // 将NT状态代码转换为EFI代码
}
1
2
3
该函数首先会调用 EfiInitCreateInputParametersEx 函数, 该函数主要用于将EfiEntry参数转换为bootmgfw.efi所期望的参数格式。
 
随后调用Windows引导管理器入口点 BmMain 函数。

3.2 BmMain

1
2
3
在该函数中调用了 BmFwInitializeBootDirectoryPath 用于初始化启动应用程序(BootDirectory)路径(\EFI\Microsoft\Boot)。
 
随后BootMgr会读取系统引导配置信(BCD), 如果有多个启动选项,其会调用 BmDisplayGetBootMenuStatus 显示启动菜单,如下图:

图片描述

1
2
3
再然后其会调用 BmpLaunchBootEntry 函数, 启动应用程序(winload.efi)。
 
当然bootmgfw.efi做的不止这些还有启动策略验证代码完整性以及安全启动组件的初始化,这些就不细说了。

3.3 BmpLaunchBootEntry

1
2
3
4
5
在Windows引导管理器(BootMgr)最后阶段, BmpLaunchBootEntry 函数会根据之前BCD的值选择正确的启动项, 如果启用了全卷加密(BitLocker), 则会先解密系统分区,然后才能将控制权转移到winload.efi。
 
其次会调用 BmTransferExecution 函数,检查启动选项并将执行流传递给BlImgStartBootApplication函数。
 
再然后 BlImgStartBootApplication 函数中会调用 ImgFwStartBootApplication 函数, 而最终调用 ImgArchStartBootApplication 函数。

图片描述

3.4 ImgArchStartBootApplication

1
ImgArchStartBootApplication 函数原型如下:
1
2
3
4
5
6
7
EFI_STATUS EFIAPI ImgArchStartBootApplication(
    PBL_APPLICATION_ENTRY AppEntry,
    VOID* ImageBase,            // winload.efi镜像基址
    UINT32 ImageSize,           // winload.efi镜像大小
    UINT8 BootOption,
    PBL_RETURN_ARGUMENTS ReturnArguments
    );
1
2
3
4
在其中会初始化winload.efi的内存保护模式,
随后调用BlpArchTransferTo64BitApplication 函数,                 
BlpArchTransferTo64BitApplication 会调用
Archpx64TransferTo64BitApplicationAsm 函数,最终将控制权交给winload.efi。

3.5 Archpx64TransferTo64BitApplicationAsm

1
该函数会启用新的GDT和IDT, 随后完全把控制权交给winload.efi, 到此BootMgr完成使命,Winload开始工作。  

图片描述

4. Winload

4.1 OslMain

1
该函数会初始化所需的支持库随后调用 OslpMain。

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

收藏
免费 11
支持
分享
最新回复 (11)
雪    币: 7093
活跃值: (2006)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2021-6-28 18:57
0
雪    币: 8511
活跃值: (5131)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
3
mark
2021-6-28 19:38
1
雪    币: 32
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2021-6-28 19:57
0
雪    币: 11238
活跃值: (4897)
能力值: ( LV12,RANK:404 )
在线值:
发帖
回帖
粉丝
5

bootmgfw.ImgArchStartBootApplication between windows versions 2004-1709 is invoked to start winload.efi. A hook is place on this function in order to install hooks in winload.efi before winload.efi starts execution. On windows 1703-1511 the symbol/name is different but parameters and return type are the same: bootmgfw.BlImgStartBootApplication.


3b2K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4N6h3W2V1k6h3c8Z5j5h3y4C8K9h3&6Y4i4K6u0W2j5$3!0E0i4K6u0r3N6r3S2J5k6h3q4V1M7#2)9J5c8X3S2&6M7r3g2J5i4K6u0V1N6W2)9J5k6r3S2S2j5$3E0A6L8X3N6Q4x3X3c8X3M7X3q4E0k6i4N6G2M7X3E0Q4x3X3c8%4L8%4u0C8M7#2)9J5k6r3!0F1i4K6u0V1k6i4k6W2M7Y4W2Q4x3X3c8$3k6i4u0K6K9h3!0F1i4K6u0V1L8$3k6Q4x3X3c8%4K9h3&6V1L8%4N6K6i4K6u0V1x3e0m8Q4x3X3b7J5x3o6l9@1i4K6u0V1x3e0f1I4x3g2)9J5k6r3q4E0k6q4)9J5k6r3W2F1N6r3g2D9i4K6u0W2x3e0j5J5y4e0q4Q4x3V1j5`.

2021-6-28 20:28
0
雪    币: 3915
活跃值: (4182)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感谢分享!
2021-6-28 20:39
0
雪    币: 379
活跃值: (394)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
厉害
2021-6-28 23:47
0
雪    币: 300
活跃值: (2662)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
mark
2021-6-29 08:18
0
雪    币: 181
活跃值: (8602)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
9
过来点个赞
2021-6-29 10:43
0
雪    币: 4929
活跃值: (4837)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
呦西
2021-6-29 11:27
0
雪    币: 575
活跃值: (591)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
1
2021-7-1 11:20
0
雪    币: 3275
活跃值: (1481)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢分享~~~~~~~~~~~~~~~~~··
2021-7-8 16:33
0
游客
登录 | 注册 方可回帖
返回