深入底层 评估Vista内核模式的安全性

UPGDSED的分析与绕过PG和DSE的方式 大纲: 对UPGDSED源码进行分析,并浅析其绕过PG和DSE方式。 小插曲: (1)、要在内核搞事情,就必须加载驱动。加载驱动的道路充满荆棘,先是有杀软的加载驱动拦截,后是有MS的 PG 和 DSE 保护。杀软那一关已经过了,但后面还有PG和DSE。 (2)、逐渐深入研究,发现Fyyre和EP_X0FF两位大牛早已经绕过了,并且公布了UPGDSED源码。在这里... 阅读详情
Windows Vista与之前的MS Windows版本(包括Windows XP SP2)相比增加了很多的安全性。Vista新安全性的特征可以包括以下几个方面:

  驱动签名

  路径保护

  内核模式代码完整性检查

  可选择支持使用TPM芯片的安全启动

  限制用户模式访问/Device/PhysicalMemory

  上述的这些功能使得Vista64位版本与Linux或MacOS相比更具备安全性。该文档的主要贡献在:通过拟向工程较全面的分析内核模式的安全组件以及评估可能存在的内核模式攻击。

  该文档检查新的安全特性,通过这些安全特性来阻止恶意代码危及内核。由于这些特性都仅存在于64位的Windows Vista系统内,因此该文档的关注点在Vista64位版本。

  该文档没有分析PatchGuard的执行,针对PatchGuard的分析在前期已经有Skape和Skywing[6]进行了较全面的分析,值得注意的是PatchGuard发展到目前已经有所改变(在skape与skywing分析完后)。仅当下面章节对PatchGuard进行攻击评估时才会讨论这些问题。针对Vista用户模式的安全性评估在前面已经有所讨论[7]。

  由于无法访问Windows Vista的源代码,我们通过debugger(调试器)、disassembler(反编译)、hex editor(16进制编辑器,例如UE)学习了Windows Vista Community Technical Preview (CTP) Build 5365版本。如果读者不熟悉X86体系架构和汇编语言的知识,推荐大家一本不错的关于X86汇编语言的在线图书[8]。另外,在看该文档前你需要熟悉一些Windows系统架构的知识,推荐大家阅读[9],该书讲解了Windows系统架构的知识,同时这本书的一些知识同样可以应用到Vista系统上。在该文档公布时Vista系统还在测试阶段,但Vista在后来版本的安全性方面又做了一些改动。我们希望Vista在最终的发布版本上有更多的改变,同时我们也计划继续对未来的Vista版本的内核改动进行研究。

  Vista引导过程

  Windows Vista支持从PC/AT BIOS和Intel新的EFI(可扩展固件接口)启动。我们的分析过程忽略了EFI部分。在本章节的最后部分,引用了bootmgr入口点的开始指令(DllMail为EFI的入口点指令,offset 0为PC/AT的入口点指令)这个过程从Vista启动管理器开始,定位%SystemDrive%/bootmgr 文件 (for PC/AT legacy BIOS)或%SystemDrive%/Boot/EFI/bootmgr.efi (for EFI BIOS)。Vista Boot Manager是启动Vista的必须环节,但也适用于启动Windows Vista之前的Windows版本。

  Vista Boot Manager首先调用InitializeLibrary,然后依次调用BlpArchInitialize (GDT, IDT, etc.), BlMmInitialize (memory management), BlpFwInitialize (firmware=固件?), BlpTpmInitialize (TPM), BlpIoInitialize (file systems), BlpPltInitialize (PCI configuration), BlBdInitialize (debugging), BlDisplayInitialize, BlpResourceInitialize (finds its own .rsrc section), and BlNetInitialize。

  在Vista系统内,Windows传统的boot.ini配置文件已经被启动配置数据文件(BCD)所代替,Vista下该文件位于%SystemDrive%/Boot/BCD,该文件也是注册表的值(在Vista下被挂载在HKEY_LOCAL_MACHINE/BCD00000000下)。可以使用bcdedit.exe来查看该文件的内容。

  一个典型的Boot Manager的BCD配置文件如下:

      Windows Boot Manager
  Identifier: {bootmgr}
  Type: 10100002
  Device: partition=C:
  Description: Windows Boot Manager
  Locale: en-US
  Inherit options: {globalsettings}
  Boot debugger: No
  Pre-boot EMS Enabled: No
  Default: {current}
  Resume application: {3ced334e-a0a5-11da-8c2b-cbb6baaeea6d}
  Display order: {current}
  Timeout: 30


  如果只有一个启动入口在BCD文件内,启动管理器会直接从该入口启动。如果多于一个启动入口,Boot Manager会给用户一个可选择的列表,并提示用户选择启动那个OS。如果启动阶段激活了日志记录,启动管理器会把状态信息写入%SystemDrive%/Boot/bootstat.dat文件内(通过BmpInitializeBootStatusDataLog)。紧接着启动管理器会使用BlResourceFindHtml把bootmgr.xsl定位在资源节点,而后把它传给BlXmiInitialize。bootmgr.xsl文件控制启动菜单和位于启动菜单的选项。

  如果启动列表的某个条目被选择,跟随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%/System32/WINLOAD.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: /Windows/system32/WINLOAD.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%/Boot/bootstat.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)
  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。如果没有检测到调试器处在开启状态,会直接跳过该处。

  接下来通过BlImgRegisterCodeIntegrityCatalogs从%SystemRoot%/System32/CatRoot/{F750E6C3-38EE-11D1-85E5-00C04FC295EE}/nt5.cat加载OS的编目录(在内部调用了API函数MinCrypL_AddCatalog)。

当OS 编目录 nt5.cat被加载后,WINLOAD.EXE通过SelfIntegrityCheck对其自身进行完整性检查,这里的检查做了两个事情:

  1. 计算PE映像(image)的SHA1哈希值,然后与PE证书表内的SHA1哈希值进行对比,这里的对比必须是匹配的,如果不匹配就会返回一个错误信息。

  2. 另外,他也调用ImgpValidateImageHash来验证映象(image)哈希值是否与nt5.cat内的相匹配。ImgpValidateImageHash会调用API函数MinCrypL_CheckSignedFile来验证证书,调用MinCrypL_CheckImageHash来寻找nt5.cat上的映象(image)匹配哈希值。在下面的章节III会讨论通过MinCrypL_CheckSignedFile和 MinCrypL_CheckImageHash进行驱动签名验证。

  如果上述的签名过程不匹配,但是调试器在开启状态(BlBdDebuggerEnabled returns TRUE),那么在这里会打印处如下的调试信息:

      *** Windows is unable to verify the signature of the file %s.
  It will be allowed to load because the boot debugger is enabled.
  Use g to continue!!


  如果调试器是存在的,那么可以通过调用DbgBreakPoint来进行激活;另外,在这里通过调用ReportCodeIntegrityFailure替换了系统提示致命错误的错误形式。

  当所有的完整性检查结束后(unless all integrity checks have been disabled),OslInitializeCodeIntegrity会返回成功状态,然后会继续从OslMain开始执行。接着,OslpLoadAllModules被调用并开始加载系统模块。首先,会调用OslLoadImage来加载NTOSKRNL.EXE和HAL.DLL,在这里仅仅是加载,此时没有解决Imports;第二,如果内核调试被开启,调试驱动会依靠启动调试选项的情况被加载(kdcom.dll for serial port, kd1394.dll for IEEE1394, or kdusb.dll for USB)。第三,NTOSKRNL.EXE的Imports被加载和初始化(使用LoadImports和BindImportRefences函数)。

  OslLoadImage calls GetImageValidationFlags to check the filename against a pre-defined list of boot drivers in LoadBootImagesTable. If integrity checks are enabled, then boot drivers must be signed by a trusted root authority and all the image hashes must match the signed catalog file unless a debugger is enabled. If a debugger is enabled, WINLOAD.EXE does not enforce this requirement. Instead it will print an error message to the debugger, but will otherwise ignore the code integrity check failure. However, the following boot drivers (also listed in Appendix A) must pass the code integrity checks even if a debugger is enabled (otherwise WINLOAD.EXE will refuse to boot Windows Vista):

  OslLoadImage调用GetImageValidationFlags来检查在LoadBootImagesTable中预先定义好的boot drivers文件名。如果启用了完整性检查,除非在这里调试器被开启,否则boot drivers必须进行可信任的root签名,并且所有的映象哈希值(image hashes)要与编目录签名相匹配。如果调试器处于开启状态,WINLOAD.EXE不会强制这些要求。安全后WINLOAD.EXE会打印一个错误信息给调试器,但是却忽略了代码完整性检查的失败。无论如何,接下来的boot drivers必须通过代码完整性检查,即使调试器在开启状态也必须检查。(如果没有进行检查,vista不会被启动起来):

      /Windows/system32/bootvid.dll
  /Windows/system32/ci.dll
  /Windows/system32/clfs.sys
  /Windows/system32/hal.dll
  /Windows/system32/kdcom.dll (or kd1394.sys or kdusb.dll, depending on boot options)
  /Windows/system32/ntoskrnl.exe
  /Windows/system32/pshed.dll
  /Windows/system32/WINLOAD.EXE
  /Windows/system32/drivers/ksecdd.sys
  /Windows/system32/drivers/spldr.sys
  /Windows/system32/drivers/tpm.sys


  加载映象和验证代码完整性都在BlImgLoadPEImageEx内,都使用了SelfIntegrityCheck(在前面章节有描述)函数。所有的映象(image)都通过代码完整性校验后,NTOSKRNL.EXE和它所有的Imports此时会被加载。列表(版本:Build 5363)如下:

      /Windows/system32/NTOSKRNL.exe
  /Windows/system32/HAL.dll
  /Windows/system32/PSHED.dll
  /Windows/system32/BOOTVID.dll
  /Windows/system32/CLFS.SYS
  /Windows/system32/CI.dll


  接下来使用OslHiveFindDrivers查找所有的boot drivers,并且根据组(which is ordered according to HKEY_LOCAL_MACHINE/CurrentControlSet/Control/GroupOrderList)和标记(an integer which determines each driver’s order within its respective group)对他们进行分类。这个分类好的boot drivers列表通过OslLoadDrivers进行加载。OslLoadDrivers为列表中的每个驱动调用LoadImageEx。LoadImageEx将会加载每个驱动及相关信息。

  此时,剩余的boot drivers也被加载和初始化。列表如下(按照年月日排列,64位Vista):

      1. /Windows/system32/drivers/Wdf01000.sys
  2. /Windows/system32/drivers/WDFLDR.SYS
  3. /Windows/system32/drivers/acpi.sys
  4. /Windows/system32/drivers/WMILIB.SYS
  5. /Windows/system32/drivers/msisadrv.sys
  6. /Windows/system32/drivers/pci.sys
  7. /Windows/system32/drivers/volmgr.sys
  8. /Windows/system32/drivers/isapnp.sys
  9. /Windows/system32/drivers/mpio.sys
  10. /Windows/system32/drivers/compbatt.sys
  11. /Windows/system32/drivers/BATTC.SYS
  12. /Windows/System32/drivers/mountmgr.sys
  13. /Windows/system32/drivers/intelide.sys
  14. /Windows/system32/drivers/PCIIDEX.SYS
  15. /Windows/system32/drivers/pcmcia.sys
  16. /Windows/system32/drivers/aliide.sys
  17. /Windows/system32/drivers/amdide.sys
  18. /Windows/system32/drivers/cmdide.sys
  19. /Windows/system32/drivers/msdsm.sys
  20. /Windows/system32/drivers/pciide.sys
  21. /Windows/system32/drivers/viaide.sys
  22. /Windows/System32/drivers/volmgrx.sys
  23. /Windows/system32/drivers/atapi.sys
  24. /Windows/system32/drivers/ataport.SYS
  25. /Windows/system32/drivers/hpcisss.sys
  26. /Windows/system32/drivers/storport.sys
  27. /Windows/system32/drivers/adp94xx.sys
  28. /Windows/system32/drivers/adpu160m.sys
  29. /Windows/system32/drivers/SCSIPORT.SYS
  30. /Windows/system32/drivers/adpu320.sys
  31. /Windows/system32/drivers/djsvs.sys
  32. /Windows/system32/drivers/arc.sys
  33. /Windows/system32/drivers/arcsas.sys
  34. /Windows/system32/drivers/elxstor.sys
  35. /Windows/system32/drivers/i2omp.sys
  36. /Windows/system32/drivers/iirsp.sys
  37. /Windows/system32/drivers/iteraid.sys
  38. /Windows/system32/drivers/lsi_fc.sys
  39. /Windows/system32/drivers/lsi_sas.sys
  40. /Windows/system32/drivers/lsi_scsi.sys
  41. /Windows/system32/drivers/megasas.sys
  42. /Windows/system32/drivers/mraid35x.sys
  43. /Windows/system32/drivers/msahci.sys
  44. /Windows/system32/drivers/nfrd960.sys
  45. /Windows/system32/drivers/ql2300.sys
  46. /Windows/system32/drivers/ql40xx.sys
  47. /Windows/system32/drivers/sisraid2.sys
  48. /Windows/system32/drivers/sisraid4.sys
  49. /Windows/system32/drivers/symc8xx.sys
  50. /Windows/system32/drivers/sym_hi.sys
  51. /Windows/system32/drivers/sym_u3.sys
  52. /Windows/system32/drivers/vsmraid.sys
  53. /Windows/system32/drivers/fltmgr.sys
  54. /Windows/system32/drivers/fileinfo.sys
  55. /Windows/system32/drivers/ndis.sys
  56. /Windows/system32/drivers/msrpc.sys
  57. /Windows/system32/drivers/NETIO.SYS
  58. /Windows/System32/Drivers/Ntfs.sys


  此时,所有的boot drivers被加载。接下来,调用OslpLoadNlsData从注册表项HKEY_LOCAL_MACHINE/CurrentControlSet/Control/NLS加载操作系统的语言版本。最后调用OslpLoadAllModules做了下面的几个事情:

  1. 显示Vista启动过程中的进度条。

  2. 加载%SystemRoot%/AppPatch/drvmain.sdb(the application compatability database)

  3. 加载%SystemRoot%/System32/acpitabl.dat

  4. 加载HKEY_LOCAL_MACHINE/CurrentControlSet/Control/Errata/InfName注册表项的INF文件。

  在OslpLoadAllModules结束后,OslMain保存启动日志(OslpLogSaveInformation),如果FVE(Full Volume Encryption)选项开启,结束FVE的加载(BlFveSecureBootRestrictToOne and BlTpmShutdown)。最后,调用OslArchTransferToKernel把控制权转交给NTOSKRNL.EXE。

Vista Windows系统内核

  Vista使用了与先前版本一样的惯例。64位Vista会在%SystemRoot%/System32/ntoskrnl.exe查找NTOSKRNL.EXE,在本章节的剩余部分,会引用ntoskrnl.exe在开始入口点的操作指令(KiSystemStartup)。

  执行首先从KiSystemStartup开始。Vista下的NTOSKRNL.EXE内的一些重要部分与Windows 2003 SP1版相比,并没有太多的改变,因此我们的重点为分析Vista下改变的特殊部分。在Vista下,NTOSKRNL.EXE添加了一个新函数SepInitializeCodeIntegrity,但该函数仅仅是把CL.DLL内的CiInitialize(关于CiInitialize会在后面的章节VI进行讨论)进行了另外的包装而已。如果代码完整性检查开启,SepInitializeCodeIntegrity会调用CiInitialize,除此之外,它没有做任何其它的事情。

  WINLOAD.EXE还负责检查boot drivers签名的完整性。与WINLOAD.EXE相比,NTOSKRNL.EXE负责查证system drivers(在boot driver加载后)和运行时加载的drivers(即:当一个设备被插进系统)。当完整性检查开启,会使用SeValidateImageHeader(在CI.DLL内CiValidateImageHeader函数的包装)和SeValidateImageData(在CI.DLL内CiValidateImageData函数的包装)对加载的映象(image)进行代码完整性检查。只要一个执行映射进kernel memeory都会调用SeValidateImageHeader(通过MmCreateSection)。当一个内核模块加载时,都会调用SeValidateImageData对kernel drivers的代码段进行校验。运行时检查(例如:不断的检查kernel drivers的代码段是否被修改)由PatchGuard和CI.DLL进行处理。

 
文件透明加解密驱动内核原理与实现深度解析 文件透明加解密技术是数据安全领域的核心实践,它通过在操作系统内核层拦截文件I/O请求,实现对数据的实时加解密处理,对用户和应用程序完全透明。其原理基于文件系统过滤驱动,通过挂载到设备栈来捕获IRP请求包,结合策略引擎判断文件保护范围,并利用AES等对称加密算法保障数据机密性。这项技术的核心价值在于为企业数据防泄漏、终端安全防护提供了底层、可靠的解决方案,尤其适用于需要强制加密保护的敏感数据存储场景。本文以Windows平台为例,深入剖析了过滤驱动的架构设计、IRP_MJ_READ/WRITE的拦截处理流程、 阅读详情

相关推荐

Windows下Inpout库实现硬件端口直接读写:原理、部署与实战

在计算机体系结构中,输入输出(IO)端口是CPU与外部设备通信的关键接口,通过特定的端口地址实现数据交换。其工作原理基于x86架构的in/out指令,允许处理器直接读写硬件寄存器。这项技术的核心价值在于绕过操作系统抽象层,实现对硬件设备的底层精准控制,在嵌入式开发、工业自动化、硬件调试及老旧设备维护等场景中至关重要。为在Windows NT内核系统(如Win7/10/11)中安全实现此功能,需借助内核模式驱动程序作为桥梁。Inpout32/Inpoutx64库作为行业广泛采用的解决方案,通过Inp32和Ou

weixin_33743880的博客 411

Win7 64位静态过PG,文件修改记录,备忘

一:修改system32 "ntoskrnl.exe" 1,SeValidateImageData: 修改此函数第二个跳转处代码. 修改前:PAGE:00000001403A4A58 mov eax, 0C0000428h PAGE:00000001403A4A5D jmp loc_140306C71 修改后:PAGE...

u010799137的专栏 1746

EV2300驱动兼容Win10/Win11实战指南

USB转串口是嵌入式调试的基础通信方式,其核心依赖于USB协议栈、UART桥接芯片(如FT232RL)与上层通信协议的协同工作。理解VCP虚拟串口原理和SMBus over UART封装机制,有助于突破老旧工具链的兼容瓶颈。现代Windows系统(Win10/Win11)因驱动模型升级(WDF替代WDM)、签名策略收紧(SHA-1禁用)及端口命名规范变化,导致TI官方EV2300 XP2K安装包失效。实际解法在于解耦四层架构:用WHQL认证的FTDI VCP驱动替代旧版底层驱动,以标准COM端口打通物理层;

weixin_33816946的博客 406

windows x64 vista以上系统代码完整性校验分析

<br /><br /> .text:00000001400E63EE MiResolveTransitionFault           mov     eax, 0C0000428h<br /> .text:00000001400E640D MiResolveTransitionFault           mov     eax, 0C0000428h<br /> .text:00000001400E671C MiResolveProtoPteFault             mov   

Tommy(凌飞)的专栏 4979

微信小程序导航栏滑动一定距离后固定到顶部

接上一篇文章的内容,通常在一个页面中部会有一个导航栏查看不同的内容,这篇文章旨在实现在页面下滑的过程中导航栏自动固定到顶部以便我们阅读过程中的切换。 下滑一段距离后自动固定到顶部 首先,思考这个功能应该是怎么实现的: 在页面下滑的过程中,我们希望系统应当能识别下滑了多少距离,当原本的导航栏逐渐被遮住以后(遮住意味着下滑了特定距离),触发这个功能,执行另一种样式,将导航栏固定在页面顶端,同时如果我们将页面往上滑,系统能识别到原来的导航栏能露出来了(即距离顶端的高度小于一个特定的值),这时候又执行最初的样式

Oblivision_Geek的博客 4032

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

windows10永久禁用驱动强制签名

windows驱动签名非常麻烦,特别是中国用户,必须是公司才能被windows打上签名,非常繁琐,个人基本就是无望获得微软签名. 那么我们个人开发的驱动就很不方便使用了,虽然可以把系统设置为测试模式就能加载无签名驱动,但看着桌面上的几行测试模式字符串就很不舒服了,而且还各种受限,比如开发一个驱动,要读取某一进程的内存,都会被针对,说不能在测试模式下运行,目前网上并没有很好的办法解决Windows10永久禁用驱动强制签名,经过本人一番研究,发现还有一种办法能永久禁用驱动强制签名,可以加载无签名驱动.

时空向量的博客 5140

LabVIew串口收发的一些问题

LabView串口收发实验总结

weixin_45508826的博客 2065

评估后Vista时代系统内核模式安全性

Windows Vista与之前的MS Windows版本(包括WindowsXPSP2)相比增加了很多的安全性。Vista新安全性的特征可以包括以下几个方面: 驱动签名 路径保护 内核模式代码完整性检查 可选择支持使用TPM芯片的安全启动 限制用户模式访问\Device\PhysicalMemory 上述的这些功能使得Vista64位版本与Linux或MacOS相比更具备安全性。该文档...

weixin_30335575的博客 401

Webug4.0 打靶笔记

一、Webug 的安装 (1)基本信息 WeBug 名称定义为”我们的漏洞”靶场环境 ,基础环境是基于 PHP/mysql 制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作环境。部分漏洞是基于Windows操作系统的漏洞所以将WeBug的web环境都装在了一个纯净版的Windows 2003的虚拟机中。在 webug3.0 发布后的四百多天 226安全团队终于在大年初二发布了 webug 的 4.0 版本。 (2)虚拟机的安装 最新超详细VMware虚拟机下载与安装_隐

m0_60716947的博客 6128

Python入门实战:Python生物信息学编程基础

本文旨在为生物学背景的研究人员和对生物信息学感兴趣的程序员提供一个全面的Python生物信息学编程入门指南。我们将从Python基础知识开始,逐步深入到生物信息学特定的工具和技术,最终达到能够独立开发生物信息学分析程序的水平。Python编程基础生物信息学常用数据结构和算法DNA和蛋白质序列分析基因组数据处理生物信息学数据可视化Biopython库的使用实际项目案例背景介绍:概述文章目的、范围和预期读者核心概念与联系:介绍Python和生物信息学的基本概念。

AI架构师小马 1514

掌握系统底层控制:EfiGuard - 革命性UEFI启动工具彻底解除Windows安全限制

你是否曾因Windows的严格安全机制而无法加载自定义驱动?是否在开发内核级应用时频繁遭遇蓝屏死机?EfiGuard为你提供了一站式解决方案。这个强大的UEFI启动工具能够在系统启动时彻底禁用PatchGuard和驱动程序签名强制(DSE),为驱动开发者、系统管理员和安全研究人员打开系统底层控制的大门。通过巧妙的UEFI启动阶段介入,EfiGuard在Windows安全机制生效前完成关键修改,让你

gitblog_01056的博客 1100

LPDDR6与LPDDR5 ZQ Calibration技术探讨

LPDDR6与LPDDR5 ZQ Calibration技术探讨

zilan23的博客 1104

探索驱动签名强制执行的终结者:DSEFix

在追求系统安全性的道路上,Windows操作系统一直采取严格的驱动签名政策。然而,在特定场景下,绕过这一限制的需求应运而生——这就是DSEFix登场的时刻。 ## 项目介绍 **DSEFix**,一个专为Windows x64系统打造的开源工具,旨在临时或永久性地解除驱动签名强制执行(Driver Signature Enforcement, DSE)。其灵感源自于著名的技术论坛讨论,通过内核...

gitblog_00847的博客 1083

指纹浏览器 WebGPU:新一代图形指纹的检测趋势与提前防御

指纹浏览器与风控系统对抗已升级至硬件层面。传统基于WebGL的API拦截和像素噪声技术,在WebGPU时代因架构变革而失效。WebGPU通过Compute Shader直接测量GPU物理算力,暴露了软件模拟的致命缺陷。防御需转向真实GPU硬件直通和虚拟化技术,如vGPU分割算力并伪装特征,以应对风控系统对硬件拓扑和浮点精度的检测。唯有基于物理算力的拟态,才能抵御新一代图形指纹的降维打击。

数据知道的博客 218

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

DSEFix终极指南:Windows驱动签名强制快速绕过工具

DSEFix是一款专门用于绕过Windows x64系统驱动签名强制(Driver Signature Enforcement)的开源工具。对于驱动程序开发者和安全研究人员来说,这个工具提供了在测试环境中临时禁用DSE限制的解决方案,让您能够加载和测试未签名的驱动程序。 ## 为什么需要驱动签名绕过工具? Windows从Vista开始引入了驱动签名强制机制,这是微软为提高系统安全性而采取的重

gitblog_00813的博客 821

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Embassy Microchip HAL 实战指南:基于 Rust 与 async 的 MEC/CEC 微控制器开发

Embassy Microchip HAL 是 Embassy 异步嵌入式框架面向 Microchip MEC 与 CEC 系列 MCU 的硬件抽象层,它以安全、惯用的 Rust API 屏蔽了底层寄存器操作,为 GPIO、UART、I2C、PWM、TACH 等外设同时提供阻塞(blocking)与异步(async)两套接口。本文将以 [embassy-microchip/README.md](h

gitblog_01143的博客 463

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

DiffSynth-Studio 怎么调用 compile_pipeline 开启 torch.compile 计算图编译加速推理

DiffSynth-Studio 中扩散模型的推理耗时主要集中在 DiT 的多步去噪阶段。如果你想在不改变模型和采样参数的情况下提升推理速度,可以使用项目提供的计算图编译功能:基于 PyTorch 2.0 的 `torch.compile` 接口,把模型代码即时(JIT)编译成优化 kernel。DiffSynth 的编译功能没有编译整个 DiT,而是只对 DiT 中重复堆叠的基础 Transfo

gitblog_00294的博客 448

Windows驱动签名强制绕过终极指南:DSEFix技术原理与实战应用

Windows x64系统自引入驱动签名强制(Driver Signature Enforcement)机制以来,为系统内核安全提供了重要保障,但也给驱动程序开发者和安全研究人员带来了测试障碍。DSEFix项目通过利用VirtualBox内核模式漏洞技术,实现了对驱动签名强制机制的临时绕过,为开发测试环境提供了技术解决方案。 ## 技术背景:为什么需要绕过DSE? Windows驱动签名强制是

gitblog_00825的博客 412

OpenArk内核驱动加载深度解析:架构设计与安全通信实现原理

OpenArk作为Windows平台上的新一代反Rootkit工具,其核心价值在于通过内核驱动实现对系统底层的深度访问和分析能力。然而内核驱动加载失败已成为众多安全研究人员面临的技术瓶颈,这不仅涉及Windows驱动签名策略的复杂性,更关系到内核模式与用户模式之间的安全通信机制设计。本文将从架构设计、通信协议、安全机制三个维度深入剖析OpenArk内核驱动的工作原理,为开发者提供从理论到实践的技术

gitblog_01136的博客 1129

深度解析DSEFix:Windows 64位驱动签名强制绕过技术实战指南

DSEFix是一个专门用于绕过Windows x64系统驱动签名强制(Driver Signature Enforcement)机制的开源工具。通过利用VirtualBox内核模式漏洞技术,该项目为驱动程序开发者和安全研究人员提供了一种临时禁用DSE的技术方案,使得在开发和测试环境中能够加载未签名的驱动程序。 ## 🔍 技术实现原理:内核内存操作的艺术 ### 系统变量定位机制 DSEFi

gitblog_00332的博客 815

DSEFix:Windows 64位驱动签名强制绕过技术的深度解析与实践指南

在Windows x64系统开发与安全研究领域,驱动签名强制(Driver Signature Enforcement)机制一直是开发者面临的重要技术挑战。DSEFix作为一款专业的Windows x64驱动签名强制绕过工具,通过创新的技术手段为驱动开发者和安全研究人员提供了临时解决方案,让未签名驱动能够在受控环境中运行测试。本文将深入剖析DSEFix的技术原理、实现机制,并提供完整的实践操作指南

gitblog_00294的博客 679

WinC3x开源驱动:让经典DSP开发板在Windows NT/XP上重获新生

在嵌入式系统与数字信号处理(DSP)开发中,硬件访问与操作系统兼容性是核心挑战。其原理在于通过分层软件架构,在确保系统安全的前提下,为上层应用提供统一的硬件抽象接口。这种设计具有显著的技术价值,它使得老旧但功能强大的专用硬件(如经典的DSKC3x DSP评估板)能够摆脱官方驱动支持滞后的束缚,在现代操作系统上继续发挥作用。典型的应用场景包括工业控制、音频处理、电机驱动等需要实时信号处理的领域。本文聚焦的WinC3x项目,正是这一理念的杰出实践。它通过精心设计的内核驱动(WinC3x.sys)与用户态动态链接

weixin_30580341的博客 300

Windows权限提升:从Administrator到SYSTEM的实战方法与原理详解

在Windows系统管理与安全运维中,权限控制是核心基础概念。操作系统通过访问控制列表(ACL)和用户账户控制(UAC)等机制,构建了分层权限体系。理解不同权限层级的工作原理,特别是最高级别的SYSTEM账户,对于解决深层系统问题、进行安全评估至关重要。从管理员权限提升到系统权限,不仅是权限的跃迁,更是对操作系统底层行为的深度掌控。这项技术在实际工程中价值显著,能有效应对文件锁定、注册表访问受限、系统服务故障排查等常见运维难题。通过计划任务创建、进程令牌模拟等合法机制,可以实现安全上下文切换,为系统修复、恶

weixin_30628077的博客 564

Windows全局键盘钩子在Chromium浏览器中失效的原理与解决方案

在Windows系统编程中,全局键盘钩子(Global Keyboard Hook)是一种用于监控或拦截系统级键盘输入事件的常用技术,其核心原理是通过SetWindowsHookEx API安装一个回调函数到系统消息链中。然而,这项技术的实际应用常受到操作系统安全机制和现代软件架构的制约,尤其是在涉及不同进程完整性级别(Integrity Level)和用户界面特权隔离(UIPI)的场景下,其消息传递可能被系统静默阻断。这直接影响了依赖全局键盘监听的应用(如自动化工具、屏幕录制软件、辅助功能软件)的技术价值

weixin_34417183的博客 400
上一篇: 隐藏注册表键代码
下一篇: Monitor process+driver+register
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值