徐敏 王玲芬 王鵬杰
大連民族學院計算機科學與工程學院 遼寧 116600
Rootkits最早是一組用于UNIX操作系統(tǒng)的工具集,黑客使用它們隱藏入侵活動的痕跡,它能在操作系統(tǒng)中隱藏惡意程序,進而達到某種不可告人的目的。隨著互聯(lián)網(wǎng)和個人電腦的普及和廣泛的使用,Rootkits也在不斷的演化和發(fā)展中,許多功能更強,技術(shù)更新,破壞更大的Rootkits程序應運而生,它從之前較簡單的對信息的隱藏發(fā)展到通過獲取用戶的隱私信息來謀取私利,給用戶帶來了直接或者間接的經(jīng)濟財產(chǎn)上的損失。
針對上述情況,開發(fā)出一款能夠?qū)π滦蚏ootkits進行檢測的安全軟件就尤為重要了。本文提出了一種基于關(guān)聯(lián)檢測技術(shù)對惡意Rootkits進行有效檢測的方法,為清除Rootkits提供了重要的信息。
當前,國內(nèi)外在對Rootkits的檢測方面主要提出了以下幾種方法:
(1) 基于特征碼的匹配技術(shù):該檢測方法依賴于病毒分析人員取得病毒樣本后,首先分析其在內(nèi)存中惟一特征碼,然后利用特征碼去匹配內(nèi)存塊來檢測Rootkits,但是,這種方法無法檢測出新Rootkits程序,因為檢測技術(shù)通常滯后于Rootkits的發(fā)展。
(2) 基于交叉視圖的檢測技術(shù):該檢測方法是通過對比兩種不同系統(tǒng)調(diào)用獲取到的系統(tǒng)信息進行對比,進而判斷是否存在Rootkits程序。例如:當要檢測系統(tǒng)是否存在隱藏的進程時,可以通過在應用層獲取一張快照的方式得到當前的進程信息,進而與直接使用內(nèi)核程序接口獲取的當前進程信息進行對比。該檢測方法的缺點是當Rootkits程序運行比檢測驅(qū)動更低層時,該檢測方法就無效了,同時,此方法只能檢測系統(tǒng)是否存在Rootkits程序,并不能直接找出Rootkits程序。
(3) 基于程序完整性檢測技術(shù):該檢測方法是通過解析磁盤文件,獲取文件的相關(guān)信息,利用獲取到的信息與當前內(nèi)存中的信息進行對比。它的缺點是無法檢測通過內(nèi)嵌鉤子的方式修改系統(tǒng)執(zhí)行流程的Rootkits程序。

圖1 SSDT的表項
如圖1所示,Rootkits可通過修改系統(tǒng)服務描述表(System Service Descriptor Table,SSDT)中的對應的函數(shù)地址達到更改系統(tǒng)服務執(zhí)行流程的目的。這里以NtQueryDirectoryFile函數(shù)為例進行說明。如圖2所示,當應用層調(diào)用FindNextFile的時候,它最終會在內(nèi)核中調(diào)用NtQueryDirectoryFile,而NtQuery DirectoryFile的地址存放在系統(tǒng)服務描述表中。假如,它被替換為Rootkits的函數(shù)地址,Rootkits就可以隱藏掉某些文件的相關(guān)信息,當應用層執(zhí)行文件查詢時,就不能查詢到被隱藏的文件。

圖2 替換NtQueryDirectoryFile函數(shù)
獲取到修改中斷描述表( Interrupt Descriptor Table,IDT )入口地址后,可以替換掉相應的中斷處理函數(shù),改變系統(tǒng)中斷的處理流程。比如,修改響應鍵盤中斷處理的函數(shù)地址,就可以攔截下用戶的輸入信息。
驅(qū)動的分發(fā)函數(shù)總是用來處理發(fā)給這個驅(qū)動程序的各種I/O請求包(I/O Request Package,IRP)。當有IRP發(fā)給這個驅(qū)動時,Windows總是調(diào)用DRIVER_OBJECT下的分發(fā)函數(shù)來處理這些請求。DRIVER_OBJECT下的分發(fā)函數(shù)指針被保存在一個數(shù)組中。Rootkits可以通過替換這個數(shù)組中的函數(shù)地址,進而能在驅(qū)動響應這個IRP前,提前攔截下這個IRP,執(zhí)行相關(guān)操作。
這里以Hook鍵盤的分發(fā)函數(shù)的指針進行說明。首先,可以通過鍵盤名獲取到鍵盤類驅(qū)動對象,然后,利用鍵盤類驅(qū)動對象修改驅(qū)動中分發(fā)函數(shù)的指針,進而替換為Rootkits的函數(shù)地址,從而達到了攔截鍵盤信息的目的。
如圖3中左邊是一個設備對象棧,設備對象是操作系統(tǒng)為幫助軟件管理而創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)。它為每個硬件至少創(chuàng)建一個物理設備對象(PDO)和功能設備對象(FDO),它們中間會存在一些過濾設備對象(FIDO)。驅(qū)動程序?qū)ο蟀艘唤M處理IRP的例程。分層結(jié)構(gòu)使IRP的過程更加清晰,影響到設備的每個操作都使用IRP,每個IRP均有I/O管理器發(fā)出,并且依次從相應設備棧的棧頂向下傳遞。每一層的對應的驅(qū)動程序?qū)ο蠖伎梢哉{(diào)用相應的例程來處理IRP。

圖3 Windows驅(qū)動模型的分層結(jié)構(gòu)
這種分層結(jié)構(gòu)非常利于第三方的驅(qū)動程序加載到操作系統(tǒng)中的對應層次中,Rootkits同樣也可以創(chuàng)建自己的設備對象掛載到相應的設備棧的棧頂,并對所有發(fā)往此設備棧的IRP進行攔截,執(zhí)行其某些特定的功能。
當前的Windows Rootkits結(jié)構(gòu)具有多樣化的特點,單一的檢測方法很難對其進行有效檢測。本文提出了一種基于關(guān)聯(lián)檢測的方法,它能有效對當前絕大部分的Windows檢測。基于關(guān)聯(lián)檢測技術(shù)主要由三部分構(gòu)成:完整性檢測、流程結(jié)構(gòu)檢測和模塊特征檢測。此三部分不僅具有自身獨特的檢測特點,而且能夠相互補充,使三種不同檢測方式可以有效被整合在一起,最大程度發(fā)揮三種不同檢測技術(shù)對Windows Rootkits檢測方面的優(yōu)勢。
Rootkits在執(zhí)行Hook時,都會修改相關(guān)信息,進而破壞原始數(shù)據(jù)結(jié)構(gòu),可通過重新將磁盤中原始文件加載到內(nèi)存中,獲取要檢測數(shù)據(jù)在程序中的偏移地址,將獲取到的偏移地址與當前數(shù)據(jù)的偏移地址進行比較,假如數(shù)據(jù)與獲取到偏移地址不一致,則可以斷定數(shù)據(jù)被修改了。
如圖4所示,這里以ntoskrnl.exe的導出表中導出函數(shù)為例進行說明。首先,重新加載ntoskrnl.exe到內(nèi)存中,解析其PE文件結(jié)構(gòu),記錄獲取到的導出表中導出函數(shù)的偏移地址,然后,將其與當前SSDT中的函數(shù)地址進行對比,就可以實現(xiàn)對當前SSDT中相關(guān)地址進行檢測。

圖4 ntoskrnl.exe導出函數(shù)的信息
使用完整性檢測對Rootkits進行檢測的方法具有實現(xiàn)簡單、檢測結(jié)果準確、穩(wěn)定性好等特點。然而,對于當前的一些功能比較強大,技術(shù)比較隱秘的Rootkits程序而言,它的缺點就暴露了出來。例如,Rootkits不直接替換原始的函數(shù)地址,而是替換掉這個函數(shù)執(zhí)行前的某些指令,轉(zhuǎn)而去執(zhí)行Rootkits的功能函數(shù)時。由于Rootkits沒有修改當前函數(shù)的地址,那么,使用完整性檢測的方法對相關(guān)函數(shù)的地址進行檢測就不能夠發(fā)現(xiàn)Rootkits了,但是,當這個函數(shù)被外界調(diào)用時,Rootkits同樣會先于這個函數(shù)攔截到這個操作,轉(zhuǎn)而去執(zhí)行相關(guān)的操作。
如圖5所示,Inline Hook就是一種不能利用完整性檢測來發(fā)現(xiàn)Rootkits的技術(shù)。它的實現(xiàn)原理如圖5中所示。通過修改相關(guān)執(zhí)行函數(shù)指令前的指令代碼,轉(zhuǎn)而去執(zhí)行Rootkits的功能函數(shù)代碼,達到Rootkits的相關(guān)目的。對于這種隱蔽性極強的Inline Hook技術(shù),通過使用反匯編引擎對相關(guān)指令進行分析,根據(jù)反匯編引擎對代碼進行反匯編后的結(jié)果,分析其結(jié)構(gòu)來判斷是否存在Inline Hook。

圖5 Inline Hook內(nèi)核函數(shù)流程示意圖
無論內(nèi)核級Rootkits使用什么樣的Hook技術(shù),它都必須作為一個模塊加載到內(nèi)存中,而模塊中的相關(guān)函數(shù)地址必須滿足于一定的要求。具體來說,假設可疑的轉(zhuǎn)移地址為u1,當前的模塊地址和模塊大小為u2和u3。假如u2 利用這種特征,可以通過遍歷當前系統(tǒng)中所有加載的模塊,獲取它們的完整信息。通過與可疑地址進行比對,確定出可疑地址的真實來源,進而判斷是否是Rootkits。 Rootkit Revealer V1.71是一款著名反Rootkits的工具,用戶通過它可檢測當前隱藏進程、文件、注冊表、SSDT、IDT等重要系統(tǒng)部件的信息,為用戶查找Rootkits提供了極大的幫助。 如圖6所示,RegHook.sys是一種能夠隱藏注冊表啟動項的Rootkits程序,它能夠?qū)⒚Q:My,類型:REG_SZ,數(shù)據(jù):C:WINDOWSUM.exe的注冊表項給隱藏,從而達到隱藏開機啟動程序的目的。通過利用這款國外的反Rootkits工具與基于關(guān)聯(lián)技術(shù)進行檢測所得到的結(jié)果對比分析。 圖6 利用Rootkit Revealer V1.71進行檢測得到的結(jié)果 當執(zhí)行RegHook.sys后,運行RootkitRevealer.exe進行檢測,并不能發(fā)現(xiàn)被Rootkits程序隱藏的注冊表鍵值,如圖7所示,利用基于關(guān)聯(lián)檢測的方法卻能成功檢測和恢復出被隱藏的注冊表鍵值信息。 圖7 利用關(guān)聯(lián)檢測技術(shù)進行檢測得到的結(jié)果 圖8是清除掉Rootkits程序后,注冊表顯示出被隱藏的相關(guān)信息情況。 圖8 清除Rootkits后注冊表的情況 基于關(guān)聯(lián)技術(shù)檢測Rootkits惡意程序的方法能夠準確的檢測出針對內(nèi)核態(tài)的Rootkits程序,并且能夠提供完整的Rootkits的種類、路徑、相關(guān)模塊的當前地址和原始地址等相關(guān)的詳細信息,幫助我們發(fā)現(xiàn)和清除Rootkits提供了重要的信息來源。 基于關(guān)聯(lián)技術(shù)的方法采用大量Windows內(nèi)核技術(shù)對Rootkits進行檢測,程序的兼容性和穩(wěn)定性將是下一步工作的重點。 [1] Greg H,James B.Rootkits:Subverting the Windows kernel[J].Addison Wesley Professional.2005. [2] Levine J,Grizzard J,Owen H.Detecting and categorizing kernel-level Rootkits to aid future detection[J].IEEE Security&Privacy.2006. [3] Kruegel C,Robertson W,Vigna G.Detecting kernel-level Rootkits through binary analysis[C].Tucson,AZ,USA:20th Annual Computer Security Applications Conference.2004. [4] 陳曉蘇,黃文超,肖道舉.一種基于交叉視圖的Windows Rootkit檢測方法[J].計算機工程與科學.2007. [5] Pankaj Gupta, Nick McKeown. Design and implementation of a fast crossbar scheduler[J].IEEE Micro Magazine.1999. [6] 顏仁仲,鐘錫昌,張倪.一種自動檢瀏內(nèi)核級 Rootkit 并恢復系統(tǒng)的方法[J].計算機工程.2006. [7] 龍海,郝東白,黃皓.Windows下系統(tǒng)服務Rootkits的檢測與恢復[J].計算機工程與設計.2008. [8] 易宇,金然.基于符號執(zhí)行的內(nèi)核級Rootkit 靜態(tài)檢測[J].計算機工程與設計.2006. [9] 梁升榮,范明鈺,王光衛(wèi),鄭秀林.一種新的內(nèi)核級 Rootkit的檢測方法[J].計算機應用研究.2009. [10] 王建華,張煥生,侯麗坤等譯.Richter J.Windows 核心編程[M].北京:機械工業(yè)出版社.2006.4 檢測結(jié)果及分析



5 結(jié)語