【驱动】3-测试模式下签名绕过

概述:Windows 测试模式下绕过签名校验,便于测试

相关参考

DSE

Windows DSE(Driver Signature Enforcement)机制是微软Windows操作系统中的一项关键安全特性,旨在确保只有经过验证和签名的驱动程序才能被加载到系统中。以下是DSE机制的主要功能和特点:

  1. 安全性和验证:DSE的主要目的是保护操作系统免受恶意或不稳定的驱动程序影响。通过确保所有加载的驱动程序都经过签名验证,DSE帮助防止恶意代码和不安全的软件干扰系统操作。

  2. 数字签名:驱动程序需要使用有效的数字证书进行签名。数字签名通过公钥加密技术保证驱动程序的来源和完整性。签名证书由受信任的证书颁发机构颁发,证书包含开发者的公钥以及CA的签名信息。

  3. 内核模式驱动程序加载:Windows操作系统内核模式下的驱动程序需要经过DSE的验证过程,以确保其签名有效。如果签名有效,系统会允许驱动程序加载,并将其映射到内核空间;如果签名无效,系统会阻止驱动程序加载,并提供错误信息给用户或管理员。

  4. 代码完整性检查:DSE还包括代码完整性检查,用于确保驱动程序在加载时没有被篡改。驱动程序的哈希值(如SHA256)会与签名中的哈希值进行比对,以确保驱动程序的内容与签名时的一致性。

  5. Secure Boot配合:DSE可以与Secure Boot配合使用,进一步提升系统的安全性。Secure Boot确保在启动阶段仅允许经过认证的操作系统和驱动程序加载,防止未授权的代码在启动阶段运行。

  6. DSE运行模式:在强制模式下,DSE确保所有驱动程序都经过数字签名。这是Windows的默认设置,从Vista及后续版本开始就已经启用。在测试模式下,DSE允许加载未签名的驱动程序,主要用于开发和测试阶段。

  7. 用户和管理员控制:用户可以通过高级启动选项临时禁用DSE,以便安装或测试未签名的驱动程序。在企业环境或特殊需求下,管理员可以通过组策略或注册表设置来永久禁用DSE,但这种做法会降低系统的安全性。

  8. 政策管理:在企业环境中,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;
}

【驱动】3-测试模式下签名绕过
https://hodlyounger.github.io/2024/11/29/A_OS/Windows/驱动/windows驱动开发教程/【驱动】3-测试模式下签名绕过/
作者
mingming
发布于
2024年11月29日
许可协议