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

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

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

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

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

圖5 Inline Hook內核函數流程示意圖
無論內核級Rootkits使用什么樣的Hook技術,它都必須作為一個模塊加載到內存中,而模塊中的相關函數地址必須滿足于一定的要求。具體來說,假設可疑的轉移地址為u1,當前的模塊地址和模塊大小為u2和u3。假如u2 利用這種特征,可以通過遍歷當前系統中所有加載的模塊,獲取它們的完整信息。通過與可疑地址進行比對,確定出可疑地址的真實來源,進而判斷是否是Rootkits。 Rootkit Revealer V1.71是一款著名反Rootkits的工具,用戶通過它可檢測當前隱藏進程、文件、注冊表、SSDT、IDT等重要系統部件的信息,為用戶查找Rootkits提供了極大的幫助。 如圖6所示,RegHook.sys是一種能夠隱藏注冊表啟動項的Rootkits程序,它能夠將名稱:My,類型:REG_SZ,數據:C:WINDOWSUM.exe的注冊表項給隱藏,從而達到隱藏開機啟動程序的目的。通過利用這款國外的反Rootkits工具與基于關聯技術進行檢測所得到的結果對比分析。 圖6 利用Rootkit Revealer V1.71進行檢測得到的結果 當執行RegHook.sys后,運行RootkitRevealer.exe進行檢測,并不能發現被Rootkits程序隱藏的注冊表鍵值,如圖7所示,利用基于關聯檢測的方法卻能成功檢測和恢復出被隱藏的注冊表鍵值信息。 圖7 利用關聯檢測技術進行檢測得到的結果 圖8是清除掉Rootkits程序后,注冊表顯示出被隱藏的相關信息情況。 圖8 清除Rootkits后注冊表的情況 基于關聯技術檢測Rootkits惡意程序的方法能夠準確的檢測出針對內核態的Rootkits程序,并且能夠提供完整的Rootkits的種類、路徑、相關模塊的當前地址和原始地址等相關的詳細信息,幫助我們發現和清除Rootkits提供了重要的信息來源。 基于關聯技術的方法采用大量Windows內核技術對Rootkits進行檢測,程序的兼容性和穩定性將是下一步工作的重點。 [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] 顏仁仲,鐘錫昌,張倪.一種自動檢瀏內核級 Rootkit 并恢復系統的方法[J].計算機工程.2006. [7] 龍海,郝東白,黃皓.Windows下系統服務Rootkits的檢測與恢復[J].計算機工程與設計.2008. [8] 易宇,金然.基于符號執行的內核級Rootkit 靜態檢測[J].計算機工程與設計.2006. [9] 梁升榮,范明鈺,王光衛,鄭秀林.一種新的內核級 Rootkit的檢測方法[J].計算機應用研究.2009. [10] 王建華,張煥生,侯麗坤等譯.Richter J.Windows 核心編程[M].北京:機械工業出版社.2006.4 檢測結果及分析



5 結語