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


dd;offset;_ConsoleSetInformation@8;;;ConsoleSetInformation(x,x)
dd;offset;_ConsoleReset@4;;;ConsoleReset(x)
For;serial;port;(_SerialPortFunctionTable);these;are:
dd;offset;_UdpEnumerateDeviceClass@12;;;UdpEnumerateDeviceClass(x,x,x)
dd;offset;_SpClose@4;;;SpClose(x)
dd;offset;_SpRead@16;;;SpRead(x,x,x,x)
dd;offset;_SpWrite@16;;;SpWrite(x,x,x,x)
dd;offset;_SpGetInformation@8;;;SpGetInformation(x,x)
dd;offset;_SpSetInformation@8;;;SpSetInformation(x,x)
dd;offset;_SpReset@4;;;SpReset(x)
For;PXE;(_UdpFunctionTable):
dd;offset;_UdpEnumerateDeviceClass@12;;;UdpEnumerateDeviceClass(x,x,x)
dd;offset;_UdpOpen@8;;;UdpOpen(x,x)
dd;offset;_SpClose@4;;;SpClose(x)
dd;offset;_UdpRead@16;;;UdpRead(x,x,x,x)
dd;offset;_UdpWrite@16;;;UdpWrite(x,x,x,x)
dd;offset;_UdpGetInformation@8;;;UdpGetInformation(x,x)
dd;offset;_UdpSetInformation@8;;;UdpSetInformation(x,x)
dd;offset;_UdpReset@4;;;UdpReset(x)
你可能注意到有些函数的返回在不同类别之间会存在共享(例如:serial port和PXE) 。
接着LOADER_PARAMETER_BLOCK结构通过OslInitializeLoaderBlock进行初始化,LOADER_PARAMETER_BLOCK包含了一些系统状态信息,如:启动设备、ACPI、SMBIOS表等 。下面为LOADER_PARAMETER_BLOCK在Vista64位版本的结构:
0x000;LoadOrderListHead;:;struct;_LIST_ENTRY
0x010;MemoryDescriptorListHead;:;struct;_LIST_ENTRY
0x020;BootDriverListHead;:;struct;_LIST_ENTRY
0x030;KernelStack;:;Uint8B
0x038;Prcb;:;Uint8B
0x040;Process;:;Uint8B
0x048;Thread;:;Uint8B
0x050;RegistryLength;:;Uint4B
0x058;RegistryBase;:;Ptr64;to;Void
0x060;ConfigurationRoot;:;Ptr64;to;struct;_CONFIGURATION_COMPONENT_DATA
0x068;ArcBootDeviceName;:;Ptr64;to;Char
0x070;ArcHalDeviceName;:;Ptr64;to;Char
0x078;NtBootPathName;:;Ptr64;to;Char
0x080;NtHalPathName;:;Ptr64;to;Char
0x088;LoadOptions;:;Ptr64;to;Char
0x090;NlsData;:;Ptr64;to;struct;_NLS_DATA_BLOCK
0x098;ArcDiskInformation;:;Ptr64;to;struct;_ARC_DISK_INFORMATION
0x0a0;OemFontFile;:;Ptr64;to;Void
0x0a8;SetupLoaderBlock;:;Ptr64;to;struct;_SETUP_LOADER_BLOCK
0x0b0;Extension;:;Ptr64;to;struct;_LOADER_PARAMETER_EXTENSION
0x000;Size;:;Uint4B
0x004;Profile;:;struct;_PROFILE_PARAMETER_BLOCK
0x014;MajorVersion;:;Uint4B
0x018;MinorVersion;:;Uint4B
0x020;EmInfFileImage;:;Ptr64;to;Void
0x028;EmInfFileSize;:;Uint4B
0x030;TriageDumpBlock;:;Ptr64;to;Void
0x038;LoaderPagesSpanned;:;Uint4B
0x040;HeadlessLoaderBlock;:;Ptr64;to;struct;_HEADLESS_LOADER_BLOCK
0x048;SMBiosEPSHeader;:;Ptr64;to;struct;_SMBIOS_TABLE_HEADER
0x050;DrvDBImage;:;Ptr64;to;Void
0x058;DrvDBSize;:;Uint4B
0x060;NetworkLoaderBlock;:;Ptr64;to;struct;_NETWORK_LOADER_BLOCK;bytes
0x068;FirmwareDescriptorListHead;:;struct;_LIST_ENTRY
0x078;AcpiTable;:;Ptr64;to;Void
0x080;AcpiTableSize;:;Uint4B
0x084;BootViaWinload;:;Bitfield;Pos;0,;1;Bit
0x084;BootViaEFI;:;Bitfield;Pos;1,;1;Bit
0x084;Reserved;:;Bitfield;Pos;2,;30;Bits
0x088;LoaderPerformanceData;:;Ptr64;to;struct;_LOADER_PERFORMANCE_DATA
0x090;BootApplicationPersistentData;:;struct;_LIST_ENTRY
0x0a0;WmdTestResult;:;Ptr64;to;Void
0x0a8;BootIdentifier;:;struct;_GUID
0x0b8;u;:;union
0x000;I386;:;struct;_I386_LOADER_BLOCK
0x000;CommonDataArea;:;Ptr64;to;Void
0x008;MachineType;:;Uint4B
0x00c;VirtualBias;:;Uint4B
下面会寻找系统磁盘(通过OslEnumerateDisks)和加载系统注册表项HKEY_LOCAL_MACHINE(通过OslpLoadSystemHive) 。当系统注册表项加载后,我们遇到了Vista在启动阶段的第一次代码完整性(通过OslInitializeCodeIntegrity) 。在该处首先会调用MincrypL_SelfTest,MincrypL_SelfTest验证SHA1散列值,并使PKCS1的签名验证开始工作(using a pre-defined test case=通过预定义的测试样例?) 。如果预先定义的测试样例失败了,会返回错误代码到0xC0000428 。然后,检查调试器是否开启(通过BlBdDebuggerEnabled) 。如果在这里检测到调试器在开启状态,会调用KnownAnswerTest 。如果没有检测到调试器处在开启状态,会直接跳过该处 。

推荐阅读