免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
內(nèi)核級(jí)Rootkit技術(shù)入門
本文介紹了Windows下的內(nèi)核級(jí)Rootkit的最基礎(chǔ)性的東西,以及利用驅(qū)動(dòng)程序?qū)⒋a導(dǎo)入到內(nèi)核的方法。雖然我們還沒有涉及到真正的Rootkit,但這些內(nèi)容是我們掌握Rootkit的必經(jīng)之路,就像我們要建一座6層的樓房,卻不能撇開基礎(chǔ)和低層而直接蓋第六層一樣!更多的內(nèi)容,會(huì)在后續(xù)的文章中陸續(xù)介紹。
 

Rootkit是一種奇特的程序,它具有隱身功能:無論靜止時(shí)(作為文件存在),還是活動(dòng)時(shí),(作為進(jìn)程存在),都不會(huì)被察覺。換句話說,這種程序可能一直存在于我們的計(jì)算機(jī)中,但我們卻渾然不知,這一功能正是許多人夢(mèng)寐以求的——不論是計(jì)算機(jī)黑客,還是計(jì)算機(jī)取證人員。黑客可以在入侵后置入Rootkit,秘密地窺探敏感信息,或等待時(shí)機(jī),伺機(jī)而動(dòng);取證人員也可以利用Rootkit實(shí)時(shí)監(jiān)控嫌疑人員的不法行為,它不僅能搜集證據(jù),還有利于及時(shí)采取行動(dòng)。而本文的目的,就是同讀者一起踏上Windows內(nèi)核級(jí)Rootkit之旅!

一、背景知識(shí)

我們通常所說的智能機(jī)器,大至超級(jí)計(jì)算機(jī),中到個(gè)人PC,小至智能手機(jī),通常都有兩部分組成:硬件和軟件。并且,設(shè)備的智能是通過軟件來實(shí)現(xiàn)的。所有軟件中,有一種是必不可少的,那就是操作系統(tǒng)。操作系統(tǒng)可以簡(jiǎn)單理解為一組高度復(fù)用的核心程序,一方面,它要管理低層的硬件設(shè)備,另一方面,為上層其它程序提供一個(gè)良好的運(yùn)行環(huán)境。真是同人不同命,同為軟件,操作系統(tǒng)卻享有至高無上的特權(quán):它不僅管理硬件,而且其他所有軟件也都受制于它。

因?yàn)樵趹?yīng)用程序和硬件之間隔著操作系統(tǒng),所以應(yīng)用程序不能直接訪問硬件,而是通過調(diào)用操作系統(tǒng)提供的接口來使用硬件。也就是說,對(duì)應(yīng)用程序而言,硬件是不可見的。當(dāng)然,凡事是沒有絕對(duì)的,應(yīng)用程序繞過操作系統(tǒng)來直接訪問硬件也不是不可能的,但這樣做會(huì)付出高昂的代價(jià)。設(shè)想一個(gè)軟件開發(fā)商在開發(fā)一款功能豐富的軟件,功能本身就夠他頭痛得了,現(xiàn)在他還得操心某個(gè)數(shù)據(jù)在某個(gè)磁道的某個(gè)簇上,某個(gè)字符在某品牌顯示器上的顏色的二進(jìn)制代碼等等繁瑣的事情,不用說財(cái)力和物力,單說開發(fā)周期就是無法容忍的。所以,現(xiàn)在的應(yīng)用程序都是使用操作系統(tǒng)提供的簡(jiǎn)單明了的服務(wù)來訪問系統(tǒng)的,因?yàn)楫吘箾]有誰愿意自討苦吃。

二、內(nèi)核的主要功能

從上文中我們已經(jīng)了解,內(nèi)核在系統(tǒng)中處于核心樞紐的地位,下面我們具體介紹內(nèi)核中與Rootkit緊密相關(guān)的幾個(gè)主要功能,更重要的是這些功能對(duì)Rootkit的意義所在:

進(jìn)程管理。進(jìn)程可以簡(jiǎn)單理解為運(yùn)行中的程序,它需要占用內(nèi)存、CPU時(shí)間等系統(tǒng)資源?,F(xiàn)在的操作系統(tǒng)大多支持多用戶多任務(wù),也就是說系統(tǒng)要并行運(yùn)行多個(gè)程序。為此,內(nèi)核不僅要有專門代碼來負(fù)責(zé)為進(jìn)程或線程分配CPU時(shí)間,另一方面還要開辟一段內(nèi)存區(qū)域存放用來記錄這些進(jìn)程詳細(xì)情況的數(shù)據(jù)結(jié)構(gòu)。內(nèi)核是怎么知道系統(tǒng)中有多少進(jìn)程、各進(jìn)程的狀態(tài)等信息的?就是通過這些數(shù)據(jù)結(jié)構(gòu),換句話說它們就是內(nèi)核感知進(jìn)程存在的依據(jù)。因此,只要修改這些數(shù)據(jù)結(jié)構(gòu),就能達(dá)到隱藏進(jìn)程的目的。

文件訪問。文件系統(tǒng)是操作系統(tǒng)提供的最為重要的功能之一。內(nèi)核中的驅(qū)動(dòng)程序把設(shè)備的柱面、扇區(qū)等原始結(jié)構(gòu)抽象成為更加易用的文件系統(tǒng),并提供一個(gè)一致的接口供上層程序調(diào)用。也就是說,這部分代碼完全控制著對(duì)硬盤的訪問,通過修改內(nèi)核的這部分代碼,攻擊者能夠隱藏文件和目錄。

安全控制。對(duì)大部分操作系統(tǒng)來說,因?yàn)橄到y(tǒng)中同時(shí)存在多個(gè)進(jìn)程,為了避免各進(jìn)程之間發(fā)生沖突,內(nèi)核必須對(duì)各進(jìn)程實(shí)施有效的隔離措施。比如,在MS-Windows系統(tǒng)中,每個(gè)進(jìn)程都被強(qiáng)制規(guī)定了具體的權(quán)限和單獨(dú)的內(nèi)存范圍。因此,對(duì)攻擊者而言,只要對(duì)內(nèi)核中負(fù)責(zé)安全事務(wù)的代碼稍事修改,整個(gè)安全機(jī)制就會(huì)全線崩潰。

內(nèi)存管理?,F(xiàn)在的硬件平臺(tái)(比如英特爾的奔騰系列處理器)的內(nèi)存管理機(jī)制已經(jīng)復(fù)雜到可以將一個(gè)內(nèi)存地址轉(zhuǎn)換成多個(gè)物理地址的地步。舉例來說,進(jìn)程A按照地址0x0030030讀取內(nèi)存,它得到值的是“飛機(jī)”;然而,進(jìn)程B也是按照同樣的地址0x0030030來讀取內(nèi)存,但它取得的值卻是“大炮”。像上面這樣,同一個(gè)地址指向截然不同的兩個(gè)物理內(nèi)存位置,并且每個(gè)位置存放不同的數(shù)據(jù)這種現(xiàn)象并不足以為怪——只不過是兩個(gè)進(jìn)程對(duì)虛擬地址到物理地址進(jìn)行了不同的映射而已。如果這一點(diǎn)利用好了,我們可以讓Rootkit躲避調(diào)試程序和取證軟件的追蹤。

上面介紹了內(nèi)核的主要功能,以及它們對(duì)Rootkit的重大意義。說到這里,我們就要切入正題了,即:只要我們顛覆(即修改)了操作系統(tǒng)的核心服務(wù)(即內(nèi)核),那么整個(gè)系統(tǒng)包括各種應(yīng)用就完全處于我們的掌控之下了。要想顛覆內(nèi)核,前提條件是能把我們的代碼導(dǎo)入內(nèi)核。具體請(qǐng)見下文。
 

三、將代碼導(dǎo)入內(nèi)核的方法

所有應(yīng)用程序都是運(yùn)行在用戶模式下的,而操作系統(tǒng)是運(yùn)行在內(nèi)核模式下的,所以應(yīng)用程序根本沒有機(jī)會(huì)來修改內(nèi)核程序。要想顛覆內(nèi)核,前提是設(shè)法讓我們的代碼也運(yùn)行在內(nèi)核模式下,即將我們的代碼導(dǎo)入內(nèi)核。

設(shè)想一下當(dāng)我們的代碼通過驅(qū)動(dòng)程序進(jìn)入內(nèi)核后的情形:我們的代碼一旦在內(nèi)核運(yùn)行,就能訪問內(nèi)核的所有特權(quán)內(nèi)存空間和系統(tǒng)進(jìn)程——有了這樣的內(nèi)核級(jí)訪問特權(quán),我們就能任意修改系統(tǒng)中的任何代碼和數(shù)據(jù)了!

將代碼導(dǎo)入內(nèi)核的方法很多,但我們要介紹的是利用設(shè)備驅(qū)動(dòng)程序?qū)⒋a導(dǎo)入內(nèi)核的方式。內(nèi)核驅(qū)動(dòng)程序有多種叫法,有時(shí)候又稱為內(nèi)核驅(qū)動(dòng)程序,或者可加載模塊。我們之所以利用設(shè)備驅(qū)動(dòng)程序?qū)⒋a導(dǎo)入到內(nèi)核,主要考慮到兩點(diǎn):

1.簡(jiǎn)單性。能夠讓我們的代碼運(yùn)行在內(nèi)核模式之的方法有多種,例如把我們的代碼做成設(shè)備驅(qū)動(dòng)程序、設(shè)法修改正在內(nèi)存運(yùn)行的內(nèi)核、覆蓋硬盤中的內(nèi)核映像等等。其中,利用設(shè)備驅(qū)動(dòng)程序是最為簡(jiǎn)單的一種。

2.適用性?,F(xiàn)在,絕大多數(shù)的操作系統(tǒng)都允許第三方的硬件廠商加載為其硬件產(chǎn)品制作的內(nèi)核擴(kuò)展,從而使得操作系統(tǒng)能夠支持它們的硬件產(chǎn)品。這的確是一個(gè)雙贏之舉,只有這樣,操作系統(tǒng)開發(fā)商才能不斷鞏固和擴(kuò)大其用戶群。因此,各個(gè)操作系統(tǒng)開發(fā)商不僅提供該系統(tǒng)下的開發(fā)設(shè)備驅(qū)動(dòng)程序的詳盡幫助文檔,而且還提供了相應(yīng)的開發(fā)工具包。

雖然我們已經(jīng)找到將我們的代碼導(dǎo)入到內(nèi)核模式的路徑,但還有一個(gè)問題需要回答:除了與硬件打交道的代碼外,其它代碼是否也能寫進(jìn)設(shè)備驅(qū)動(dòng)程序?答案是肯定的。盡管這里的“設(shè)備”一詞容易誤導(dǎo)我們,實(shí)際上任何代碼都可以寫成設(shè)備驅(qū)動(dòng)程序。

迄今為止,我們已經(jīng)回答了利用設(shè)備驅(qū)動(dòng)程序來打造內(nèi)核級(jí)別的Rootkit可行性問題,也就是說,內(nèi)核級(jí)Rootkit大門已經(jīng)打開了一扇,為了打開另一扇,我們要解決的是“how to”的問題。并且,我們第一個(gè)必須解決的“how to”問題就是如何編寫Windows設(shè)備驅(qū)動(dòng)程序。

四、Windows設(shè)備驅(qū)動(dòng)程序

下面我們介紹如何在Windows XP平臺(tái)上開發(fā)一個(gè)簡(jiǎn)單的設(shè)備驅(qū)動(dòng)程序。在此過程中,我們要用到設(shè)備驅(qū)動(dòng)程序開發(fā)包DDK。需要注意的是,微軟為不同的Windows版本提供了不同的DDK。就目前來說,我們可以使用Windows 2003 DDK,因?yàn)樵摪姹灸軌蛑С諻indows 2000、Windows XP和Windows 2003等三個(gè)平臺(tái)下的設(shè)備驅(qū)動(dòng)程序的開發(fā)。

1. 驅(qū)動(dòng)程序源文件

首先在C盤根目錄下新建一個(gè)目錄,本例為C:\myrootkit,此后向相應(yīng)文件都存放在該目錄之下。然后可以在VC++下建立一個(gè)C源文件,讓其內(nèi)容如下所示:

//一個(gè)簡(jiǎn)單的驅(qū)動(dòng)程序?qū)嵗?br>
#include "ntddk.h"

NTSTATUS DriverEntry ( IN  PDRIVER_OBJECT theDriverObject,

IN  PUNICODE_STRING theRegistryPath )

{

DbgPrint("I am a driver!");

return STATUS_SUCCESS;

}

之后,將其保存在我們的C:\myrootkit目錄下,并且該文件命名為mydriver.c。下面對(duì)上面的代碼作簡(jiǎn)要的解釋:

DriverEntry是該驅(qū)動(dòng)程序的入口點(diǎn),即當(dāng)該驅(qū)動(dòng)程序啟動(dòng)時(shí),操作系統(tǒng)會(huì)首先調(diào)用該函數(shù)。它相當(dāng)于一般C/C++程序中的main或Winmain函數(shù)。另外,我們看到DriverEntry的兩個(gè)參數(shù)中都含有一個(gè)關(guān)鍵詞IN,說明這兩個(gè)參數(shù)只能用于輸入。第一個(gè)參數(shù)指向應(yīng)被初始化的當(dāng)前驅(qū)動(dòng)程序的驅(qū)動(dòng)對(duì)象;第二個(gè)參數(shù)是設(shè)備服務(wù)鍵的鍵名。

該驅(qū)動(dòng)程序?qū)嵲谔?jiǎn)單了,它只是在內(nèi)核運(yùn)行時(shí),利用調(diào)試語句給出一則消息:“I am a driver!”。不過,和一般程序不同,該消息不會(huì)顯示在標(biāo)準(zhǔn)輸出設(shè)備上,也就是說,我們?cè)谄聊簧峡床坏竭@則消失,關(guān)于調(diào)試輸出的處理我們會(huì)在后文中加以詳細(xì)介紹。

有一點(diǎn)需要指出,那就是上面的驅(qū)動(dòng)程序沒有設(shè)置卸載例程。盡管卸載例程不是必需的,但有時(shí)它卻非常有用:?jiǎn)?dòng)驅(qū)動(dòng)程序時(shí),系統(tǒng)會(huì)將參數(shù)theDriverObject傳遞給該驅(qū)動(dòng)程序的主函數(shù),這個(gè)參數(shù)指向的數(shù)據(jù)結(jié)構(gòu)含有許多函數(shù)指針,其中一個(gè)指針稱為“unload routine”。如果我們?cè)O(shè)置該指針,就能從內(nèi)存中卸載驅(qū)動(dòng)程序;如果不設(shè)置該指針的話,除非重新啟動(dòng)機(jī)器,否則無法將載入內(nèi)存的驅(qū)動(dòng)程序卸載掉。同時(shí),驅(qū)動(dòng)程序在開發(fā)過程中,會(huì)不斷添加或改變功能,所以要經(jīng)常裝載以及卸載它們。為了避免每次測(cè)試新版本的驅(qū)動(dòng)程序時(shí)都必須重啟系統(tǒng),我們應(yīng)當(dāng)設(shè)置“unload routine”指針。事實(shí)上,設(shè)置該指針并不是什么難事:先建立一個(gè)卸載例程,就可以設(shè)置該卸載指針了。

現(xiàn)在以前面的驅(qū)動(dòng)程序?yàn)槔?,介紹如何為其添加卸載例程:

//一個(gè)簡(jiǎn)單的驅(qū)動(dòng)程序?qū)嵗?br>
#include "ntddk.h"

// 這里是我們的卸載函數(shù)

VOID MyUnload( IN PDRIVER_OBJECT DriverObject )

{

DbgPrint("MyUnload called\n");

}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,

IN PUNICODE_STRING theRegistryPath)

{

DbgPrint("I am a driver and I loaded!");

// 初始化DriverObject對(duì)象中指向卸載函數(shù)的指針

theDriverObject->DriverUnload  =  MyUnload;

return STATUS_SUCCESS;

}

這樣一來,我們用重啟系統(tǒng)就能方便地裝載和卸載驅(qū)動(dòng)程序了。

2. SOURCES文件

要想構(gòu)建設(shè)備驅(qū)動(dòng)程序,僅有驅(qū)動(dòng)程序源文件還是不夠的,我們還需另外兩個(gè)文件:SOURCES和MAKEFILE文件。

我們先來介紹SOURCES文件,此文件的名稱必須使用大寫字母,并且不帶任何擴(kuò)展名,它的內(nèi)容應(yīng)當(dāng)包含:

TARGETNAME=MYDRIVER

TARGETPATH=OBJ

TARGETTYPE=DRIVER

SOURCES=mydriver.c

其中,第一個(gè)變量TARGETNAME的作用是為我們的驅(qū)動(dòng)程序命名。在本例中,我們的設(shè)備驅(qū)動(dòng)程序在編譯后被命名為MYDRIVER。需要注意的是,變量TARGETNAME指定的名稱會(huì)被嵌入到二進(jìn)制代碼之中,所以在寫Rootkit時(shí),千萬不要用該變量為其指定容易被人猜中的名稱。即使把二進(jìn)制文件本身改名,但其內(nèi)部的名字是無法改變的。最好用一些迷惑性較強(qiáng)的名稱來為這些Rootkit命名,方法是根據(jù)系統(tǒng)中已有的驅(qū)動(dòng)程序名,在此基礎(chǔ)上少做手腳,一個(gè)上佳的Rootkit名便誕生了。

第二個(gè)變量TARGETPATH的作用是指定驅(qū)動(dòng)程序編譯后的存放位置,該變量通常設(shè)為OBJ。一般來說,驅(qū)動(dòng)程序文件被放在目錄objchk_xxx/i386下面,例如本文驅(qū)動(dòng)程序,作者在Windows XP下構(gòu)建后的文件將位于C:\myrootkit\objchk_wxp_x86\i386。

第三個(gè)變量TARGETTYPE用來指定要編譯的文件類型。對(duì)于設(shè)備驅(qū)動(dòng)程序,該變量設(shè)為DRIVER。

第四個(gè)變量SOURCES用來指定源文件。該變量可以指定多個(gè)源文件,這時(shí)每行一個(gè)文件,并且除最后一行外,在每行末尾都要放上一個(gè)反斜杠,如下例所示:

SOURCES=  myfile1.c \

myfile2.c \

myfile3.c    /*注意,最后一行沒有反斜杠*/

除了上面幾個(gè)必選的變量外,還有一些可選變量。變量INCLUDES便是可選變量之一,它用以規(guī)定尋找包含文件的目錄?,F(xiàn)舉例說明:
NCLUDES = c:\my_includes \

..\..\inc \

c:\other_includes

如果需要鏈接庫(kù)的話,我們還需要變量TARGETLIBS。例如,有時(shí)我們要用到NDIS庫(kù),這時(shí)在SOURCES文件就應(yīng)當(dāng)包含如下一行:
TARGETLIBS=$(BASEDIR)\lib\w2k\i386\ndis.lib
或者:
TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib
當(dāng)然,ndis.lib在你自己系統(tǒng)上的位置可能有所不同,你可以根據(jù)實(shí)際情況將上面的路徑加以調(diào)整。其中,變量$(BASEDIR)規(guī)定DDK的安裝目錄$(DDK_LIB_PATH);變量$(DDK_LIB_PATH)則規(guī)定了庫(kù)文件的默認(rèn)安裝位置。
3. MAKEFILE文件

和SOURCES文件一樣,MAKEFILE文件的名稱也必須使用大寫字母,同時(shí)也不能帶任何擴(kuò)展名,它的內(nèi)容一般為:

!INCLUDE $(NTMAKEENV)\makefile.def
注意的是,要在Windows中建立不帶擴(kuò)展名的文件,可以利用dos命令行下的EDIT命令或copy con命令。此外,SOURCES和MAKEFILE文件必須與驅(qū)動(dòng)程序的源代碼位于同一個(gè)目錄下。

4. 構(gòu)建過程

準(zhǔn)備好SOURCES、MAKEFILE以及C源代碼文件后,我們就可以構(gòu)建驅(qū)動(dòng)程序了。在此之前,我們先說明一下DDK的兩種構(gòu)建環(huán)境:checked和free構(gòu)建環(huán)境。其中前者一般在開發(fā)過程中使用,為了便于調(diào)試,它會(huì)在生成的驅(qū)動(dòng)程序中添加一些調(diào)試信息,這會(huì)使得驅(qū)動(dòng)程序體積較大。開發(fā)測(cè)試完成后,當(dāng)我們需要發(fā)布產(chǎn)品級(jí)的驅(qū)動(dòng)程序時(shí),就可以利用free構(gòu)建環(huán)境來生成驅(qū)動(dòng)程序。

從DDK中單擊checked-build environment,打開如圖1所示的命令窗口:



圖1

然后,利用cd命令將工作目錄切換到C:\myrootkit目錄下面:

cd C:\myrootkit

接著在命令提示符下輸入命令build開始構(gòu)建,如圖2所示:



圖2

如果沒有收到任何錯(cuò)誤消息,而是類似下圖所示的提示,則說明我們的第一個(gè)設(shè)備驅(qū)動(dòng)程序已經(jīng)大功告成了!



圖3

五、小結(jié)

到目前為止,本文介紹了Windows下的內(nèi)核級(jí)Rootkit的最基礎(chǔ)性的東西,以及利用驅(qū)動(dòng)程序?qū)⒋a導(dǎo)入到內(nèi)核的方法。雖然我們還沒有涉及到真正的Rootkit,但這些內(nèi)容是我們掌握Rootkit的必經(jīng)之路,就像我們要建一座6層的樓房,卻不能撇開基礎(chǔ)和低層而直接蓋第六層一樣!更多的內(nèi)容,會(huì)在后續(xù)的文章中陸續(xù)介紹。


 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
如何刪除電腦中隱藏的木馬
什么是Rootkit?
RobbinHood勒索軟件另辟渠道,通過驅(qū)動(dòng)漏洞干翻殺毒軟件奇安信威脅情報(bào)中心
從流氓軟件說說DLL動(dòng)態(tài)插入技術(shù)與Rootkit技術(shù)
Windows 操作系統(tǒng)引導(dǎo)過程 BIOS & EFI
最新GhostHook攻擊可以繞過Windows PatchGuard防護(hù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服