驅動開發:內核測試模式過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: [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;
}

將程序拖入到虛擬機,直接運行即可加載,無需再繼續簽名:

當然這種方式只能在測試模式下使用,在正常模式也是無效的,只是爲了方便測試驅動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章