驅動開發:內核測試模式過DSE簽名

微軟在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: me@lyshark.com#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;ULONGFlags;USHORTLoadCount;USHORT__Undefined5;ULONG64 __Undefined6;ULONGCheckSum;ULONG__padding1;ULONGTimeDateStamp;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;ULONGFlags; } KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;#endif PKLDR_DATA_TABLE_ENTRY pLdrData = https://www.huyubaike.com/biancheng/(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;}將程序拖入到虛擬機,直接運行即可加載,無需再繼續簽名:

驅動開發:內核測試模式過DSE簽名

文章插圖
【驅動開發:內核測試模式過DSE簽名】當然這種方式只能在測試模式下使用,在正常模式也是無效的,只是為了方便測試驅動 。

    推薦閱讀