概述:Windows 测试模式下绕过签名校验,便于测试
相关参考
DSE
Windows DSE(Driver Signature Enforcement)机制是微软Windows操作系统中的一项关键安全特性,旨在确保只有经过验证和签名的驱动程序才能被加载到系统中。以下是DSE机制的主要功能和特点:
-
安全性和验证:DSE的主要目的是保护操作系统免受恶意或不稳定的驱动程序影响。通过确保所有加载的驱动程序都经过签名验证,DSE帮助防止恶意代码和不安全的软件干扰系统操作。
-
数字签名:驱动程序需要使用有效的数字证书进行签名。数字签名通过公钥加密技术保证驱动程序的来源和完整性。签名证书由受信任的证书颁发机构颁发,证书包含开发者的公钥以及CA的签名信息。
-
内核模式驱动程序加载:Windows操作系统内核模式下的驱动程序需要经过DSE的验证过程,以确保其签名有效。如果签名有效,系统会允许驱动程序加载,并将其映射到内核空间;如果签名无效,系统会阻止驱动程序加载,并提供错误信息给用户或管理员。
-
代码完整性检查:DSE还包括代码完整性检查,用于确保驱动程序在加载时没有被篡改。驱动程序的哈希值(如SHA256)会与签名中的哈希值进行比对,以确保驱动程序的内容与签名时的一致性。
-
Secure Boot配合:DSE可以与Secure Boot配合使用,进一步提升系统的安全性。Secure Boot确保在启动阶段仅允许经过认证的操作系统和驱动程序加载,防止未授权的代码在启动阶段运行。
-
DSE运行模式:在强制模式下,DSE确保所有驱动程序都经过数字签名。这是Windows的默认设置,从Vista及后续版本开始就已经启用。在测试模式下,DSE允许加载未签名的驱动程序,主要用于开发和测试阶段。
-
用户和管理员控制:用户可以通过高级启动选项临时禁用DSE,以便安装或测试未签名的驱动程序。在企业环境或特殊需求下,管理员可以通过组策略或注册表设置来永久禁用DSE,但这种做法会降低系统的安全性。
-
政策管理:在企业环境中,IT管理员可以使用组策略配置和管理DSE设置,确保符合组织的安全和合规要求。
DSE机制通过这些方式确保了系统中运行的所有驱动程序都经过认证,降低了潜在的安全风险,提高了系统的稳定性和安全性。
ByPass
仅限于在 Windows 测试模式下使用这种方式,通过修改 PKLDR_DATA_TABLE_ENTRY.Flags 来达到测试模式下需要验签的问题。
更改 _KLDR_DATA_TABLE_ENTRY
的 FLAGS, pLdrData->data | 0x20
置位。
代码
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| BOOLEAN BypassCheckSign(PDRIVER_OBJECT pDriverObject) { #ifdef _WIN64 typedef struct _KLDR_DATA_TABLE_ENTRY { LIST_ENTRY listEntry; ULONG64 __Undefined1; ULONG64 __Undefined2; ULONG64 __Undefined3; ULONG64 NonPagedDebugInfo; ULONG64 DllBase; ULONG64 EntryPoint; ULONG SizeOfImage; UNICODE_STRING path; UNICODE_STRING name; ULONG Flags; USHORT LoadCount; USHORT __Undefined5; ULONG64 __Undefined6; ULONG CheckSum; ULONG __padding1; ULONG TimeDateStamp; ULONG __padding2; } KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY; #else typedef struct _KLDR_DATA_TABLE_ENTRY { LIST_ENTRY listEntry; ULONG unknown1; ULONG unknown2; ULONG unknown3; ULONG unknown4; ULONG unknown5; ULONG unknown6; ULONG unknown7; UNICODE_STRING path; UNICODE_STRING name; ULONG Flags; } KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY; #endif
PKLDR_DATA_TABLE_ENTRY pLdrData = (PKLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection; pLdrData->Flags = pLdrData->Flags | 0x20;
return TRUE; }
|
如何使用
1 2 3 4 5 6 7 8 9
| NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) { if (BypassCheckSign(Driver)) DbgPrint("Bypass Sign Success.");
Driver->DriverUnload = UnloadDriver; return STATUS_SUCCESS; }
|