驅動開發:內核測試模式過DSE簽名
- 2022 年 10 月 22 日
- 筆記
- Windows 內核安全開發, Windows 內核驅動開發
微軟在x64
系統中推出了DSE
保護機制,DSE全稱(Driver Signature Enforcement)
,該保護機制的核心就是任何驅動程式或者是第三方驅動如果想要在正常模式下被載入則必須要經過微軟的認證,當驅動程式被載入到記憶體時會驗證簽名的正確性,如果簽名不正常則系統會拒絕運行驅動,這種機制也被稱為驅動強制籤名,該機制的作用是保護系統免受惡意軟體的破壞,是提高系統安全性的一種手段。
該驗證機制即便是在調試模式也需要強制籤名,對於一名驅動開發者
來說是很麻煩的一件事情,而簽名的驗證則是在載入時驗證驅動入口_KLDR_DATA_TABLE_ENTRY
裡面的Flags
標誌,如果此標誌被pLdrData->Flags | 0x20
置位,則在調試模式下就不會在驗證簽名了,省去了重複簽名的麻煩。
程式碼的實現非常容易,如下所示:
// 署名權
// right to sign one's name on a piece of work
// PowerBy: LyShark
// Email: [email protected]
#include <ntifs.h>
// 繞過簽名檢查
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;
}
VOID UnDriver(PDRIVER_OBJECT driver)
{
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{
NTSTATUS status;
// 繞過簽名檢查
// LINKER_FLAGS=/INTEGRITYCHECK
BypassCheckSign(Driver);
DbgPrint("[驅動已載入] hello lyshark.com \n");
Driver->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}
將程式拖入到虛擬機,直接運行即可載入,無需再繼續簽名:
當然這種方式只能在測試模式下使用,在正常模式也是無效的,只是為了方便測試驅動。