WinDBG查看内核初始化过程

环境:

  1. host:Win11 预览版
  2. guest:VMwarre Pro 16 + Windows 10 18362 x64
  3. 其他工具:VirtualKD-Redux、WinDBG

第一步

  1. 打开VirtualKD-Redux,将DbgBreakPoint() on start勾选。
  2. 开启虚拟机
  3. 在VirtualKD-Redux中选中目标虚拟机,开启WinDBG

正式开启

进入虚拟机后打开WinDBG,立即就触发了一个断点,在命令窗口输入kc,查看调用栈:

1
2
3
4
5
6
kd> kc
# Call Site
00 nt!DebugService2
01 nt!DbgLoadImageSymbols
02 nt!KdInitSystem
03 nt!KiSystemStartup

先来看看这个KiSystemStartup函数,顾名思义就是系统开始启动的地方,它接收一个参数——结构体LOADER_PARAMETER_BLOCK,先来看看结构体的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
kd> dt nt!_LOADER_PARAMETER_BLOCK
+0x000 OsMajorVersion : Uint4B
+0x004 OsMinorVersion : Uint4B
+0x008 Size : Uint4B
+0x00c OsLoaderSecurityVersion : Uint4B
+0x010 LoadOrderListHead : _LIST_ENTRY
+0x020 MemoryDescriptorListHead : _LIST_ENTRY
+0x030 BootDriverListHead : _LIST_ENTRY
+0x040 EarlyLaunchListHead : _LIST_ENTRY
+0x050 CoreDriverListHead : _LIST_ENTRY
+0x060 CoreExtensionsDriverListHead : _LIST_ENTRY
+0x070 TpmCoreDriverListHead : _LIST_ENTRY
+0x080 KernelStack : Uint8B
+0x088 Prcb : Uint8B
+0x090 Process : Uint8B
+0x098 Thread : Uint8B
+0x0a0 KernelStackSize : Uint4B
+0x0a4 RegistryLength : Uint4B
+0x0a8 RegistryBase : Ptr64 Void
+0x0b0 ConfigurationRoot : Ptr64 _CONFIGURATION_COMPONENT_DATA
+0x0b8 ArcBootDeviceName : Ptr64 Char
+0x0c0 ArcHalDeviceName : Ptr64 Char
+0x0c8 NtBootPathName : Ptr64 Char
+0x0d0 NtHalPathName : Ptr64 Char
+0x0d8 LoadOptions : Ptr64 Char
+0x0e0 NlsData : Ptr64 _NLS_DATA_BLOCK
+0x0e8 ArcDiskInformation : Ptr64 _ARC_DISK_INFORMATION
+0x0f0 Extension : Ptr64 _LOADER_PARAMETER_EXTENSION
+0x0f8 u : <anonymous-tag>
+0x108 FirmwareInformation : _FIRMWARE_INFORMATION_LOADER_BLOCK
+0x148 OsBootstatPathName : Ptr64 Char
+0x150 ArcOSDataDeviceName : Ptr64 Char
+0x158 ArcWindowsSysPartName : Ptr64 Char

此时,也就是KiSystemStartup函数执行后,会将参数地址赋予全局变量KeLoaderBlock,来看一看:

1
2
kd> dq nt!KeLoaderBlock L1
fffff801`1ea1a3d8 fffff801`1d00df60

在内核启动结束后,KeLoaderBlock会被设置为0,现在并没有,来看看KeLoaderBlock所指向的结构体的具体内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
kd> dt nt!_LOADER_PARAMETER_BLOCK fffff801`1d00df60
+0x000 OsMajorVersion : 0xa
+0x004 OsMinorVersion : 0
+0x008 Size : 0x160
+0x00c OsLoaderSecurityVersion : 1
+0x010 LoadOrderListHead : _LIST_ENTRY [ 0xfffff801`1d120000 - 0xfffff801`1d1d2b60 ]
+0x020 MemoryDescriptorListHead : _LIST_ENTRY [ 0xfffff801`1d1fa000 - 0xfffff801`1d1fc148 ]
+0x030 BootDriverListHead : _LIST_ENTRY [ 0xfffff801`1d134d20 - 0xfffff801`1d132e40 ]
+0x040 EarlyLaunchListHead : _LIST_ENTRY [ 0xfffff801`1d1365b0 - 0xfffff801`1d1365b0 ]
+0x050 CoreDriverListHead : _LIST_ENTRY [ 0xfffff801`1d136760 - 0xfffff801`1d135200 ]
+0x060 CoreExtensionsDriverListHead : _LIST_ENTRY [ 0xfffff801`1d133b40 - 0xfffff801`1d136e60 ]
+0x070 TpmCoreDriverListHead : _LIST_ENTRY [ 0xfffff801`1d125bc0 - 0xfffff801`1d125bc0 ]
+0x080 KernelStack : 0xfffff801`20c83000
+0x088 Prcb : 0xfffff801`1d380180
+0x090 Process : 0xfffff801`1ea349c0
+0x098 Thread : 0xfffff801`1ea37400
+0x0a0 KernelStackSize : 0x6000
+0x0a4 RegistryLength : 0xb40000
+0x0a8 RegistryBase : 0xfffff801`1d3fa000 Void
+0x0b0 ConfigurationRoot : 0xfffff801`1d03a480 _CONFIGURATION_COMPONENT_DATA
+0x0b8 ArcBootDeviceName : 0xfffff801`1d039fd0 "multi(0)disk(0)rdisk(0)partition(3)"
+0x0c0 ArcHalDeviceName : 0xfffff801`1d039ed0 "multi(0)disk(0)rdisk(0)partition(1)"
+0x0c8 NtBootPathName : 0xfffff801`1d03e010 "\Windows\"
+0x0d0 NtHalPathName : 0xfffff801`1d04d0b0 "\"
+0x0d8 LoadOptions : 0xfffff801`1d03a1e0 " TESTSIGNING NOEXECUTE=OPTIN DEBUG DISABLE_INTEGRITY_CHECKS"
+0x0e0 NlsData : 0xfffff801`1d1beac0 _NLS_DATA_BLOCK
+0x0e8 ArcDiskInformation : 0xfffff801`1d0383d0 _ARC_DISK_INFORMATION
+0x0f0 Extension : 0xfffff801`1d00e0c0 _LOADER_PARAMETER_EXTENSION
+0x0f8 u : <anonymous-tag>
+0x108 FirmwareInformation : _FIRMWARE_INFORMATION_LOADER_BLOCK
+0x148 OsBootstatPathName : (null)
+0x150 ArcOSDataDeviceName : (null)
+0x158 ArcWindowsSysPartName : (null)