驅動開發:內核監控Register注冊表回調( 二 )

運行驅動程序,則會輸出當前系統中所有針對注冊表的操作,如下圖所示 。

驅動開發:內核監控Register注冊表回調

文章插圖
如上的代碼只能實現注冊表項的監視 , 而如果需要監控則需要在回調函數MyLySharkCallback判斷,如果指定注冊表項是需要保護的則直接返回status = STATUS_ACCESS_DENIED;從而達到保護注冊表的目的,核心代碼如下所示 。
// 反注冊表刪除回調NTSTATUS MyLySharkCallback(_In_ PVOID CallbackContext, _In_opt_ PVOID Argument1, _In_opt_ PVOID Argument2){ NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING ustrRegPath; // 獲取操作類型 LONG lOperateType = (REG_NOTIFY_CLASS)Argument1; ustrRegPath.Length = 0; ustrRegPath.MaximumLength = 1024 * sizeof(WCHAR); ustrRegPath.Buffer = ExAllocatePool(NonPagedPool, ustrRegPath.MaximumLength); if (NULL == ustrRegPath.Buffer) {return status; } RtlZeroMemory(ustrRegPath.Buffer, ustrRegPath.MaximumLength); // 判斷操作 switch (lOperateType) {// 刪除鍵值之前 case RegNtPreDeleteValueKey: {// 獲取注冊表路徑GetFullPath(&ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->Object);DbgPrint("[刪除鍵值][%wZ][%wZ]\n", &ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->ValueName);// 如果要刪除指定注冊表項則拒絕PWCH pszRegister = L"\\REGISTRY\\MACHINE\\SOFTWARE\\lyshark.com";if (wcscmp(ustrRegPath.Buffer, pszRegister) == 0){DbgPrint("[lyshark] 注冊表項刪除操作已被攔截! \n");// 拒絕操作status = STATUS_ACCESS_DENIED;}break; } default:break; } // 釋放內存 if (NULL != ustrRegPath.Buffer) {ExFreePool(ustrRegPath.Buffer);ustrRegPath.Buffer = NULL; } return status;}運行驅動程序,然后我們嘗試刪除\\LyShark\HKEY_LOCAL_MACHINE\SOFTWARE\lyshark.com里面的子項 , 則會提示如下信息 。
驅動開發:內核監控Register注冊表回調

文章插圖
當然這里的RegNtPreDeleteValueKey是指的刪除操作,如果將其替換成RegNtPreSetValueKey,那么只有當注冊表被創建才會攔截,此時就會變成攔截創建 。
// 攔截創建操作NTSTATUS MyLySharkCallback(_In_ PVOID CallbackContext, _In_opt_ PVOID Argument1, _In_opt_ PVOID Argument2){ NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING ustrRegPath; // 獲取操作類型 LONG lOperateType = (REG_NOTIFY_CLASS)Argument1; // 申請內存 ustrRegPath.Length = 0; ustrRegPath.MaximumLength = 1024 * sizeof(WCHAR); ustrRegPath.Buffer = ExAllocatePool(NonPagedPool, ustrRegPath.MaximumLength); if (NULL == ustrRegPath.Buffer) {return status; } RtlZeroMemory(ustrRegPath.Buffer, ustrRegPath.MaximumLength); // 判斷操作 switch (lOperateType) { // 修改鍵值之前 case RegNtPreSetValueKey: {// 獲取注冊表路徑GetFullPath(&ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->Object);// 攔截創建PWCH pszRegister = L"\\REGISTRY\\MACHINE\\SOFTWARE\\lyshark.com";if (wcscmp(ustrRegPath.Buffer, pszRegister) == 0){DbgPrint("[lyshark] 注冊表項創建操作已被攔截! \n");status = STATUS_ACCESS_DENIED;}break; } default:break; } // 釋放內存 if (NULL != ustrRegPath.Buffer) {ExFreePool(ustrRegPath.Buffer);ustrRegPath.Buffer = NULL; } return status;}加載驅動保護,然后我們嘗試在\\LyShark\HKEY_LOCAL_MACHINE\SOFTWARE\lyshark.com里面創建一個子項,則會提示創建失敗 。
驅動開發:內核監控Register注冊表回調

文章插圖

推薦閱讀