Rootkit是一種奇特的程序,它具有隱身功能:無論靜止時(作為文件存在),還是活動時,(作為進程存在),都不會被察覺。換句話說,這種程序可能一直存在于我們的計算機中,但我們卻渾然不知,這一功能正是許多人夢寐以求的——不論是計算機黑客,還是計算機取證人員。黑客可以在入侵后置入Rootkit,秘密地窺探敏感信息,或等待時機,伺機而動;取證人員也可以利用Rootkit實時監控嫌疑人員的不法行為,它不僅能搜集證據,還有利于及時采取行動。而本文的目的,就是同讀者一起踏上Windows內核級Rootkit之旅!
一、背景知識
我們通常所說的智能機器,大至超級計算機,中到個人PC,小至智能手機,通常都有兩部分組成:硬件和軟件。并且,設備的智能是通過軟件來實現的。所有軟件中,有一種是必不可少的,那就是操作系統。操作系統可以簡單理解為一組高度復用的核心程序,一方面,它要管理低層的硬件設備,另一方面,為上層其它程序提供一個良好的運行環境。真是同人不同命,同為軟件,操作系統卻享有至高無上的特權:它不僅管理硬件,而且其他所有軟件也都受制于它。
因為在應用程序和硬件之間隔著操作系統,所以應用程序不能直接訪問硬件,而是通過調用操作系統提供的接口來使用硬件。也就是說,對應用程序而言,硬件是不可見的。當然,凡事是沒有絕對的,應用程序繞過操作系統來直接訪問硬件也不是不可能的,但這樣做會付出高昂的代價。設想一個軟件開發商在開發一款功能豐富的軟件,功能本身就夠他頭痛得了,現在他還得操心某個數據在某個磁道的某個簇上,某個字符在某品牌顯示器上的顏色的二進制代碼等等繁瑣的事情,不用說財力和物力,單說開發周期就是無法容忍的。所以,現在的應用程序都是使用操作系統提供的簡單明了的服務來訪問系統的,因為畢竟沒有誰愿意自討苦吃。
二、內核的主要功能
從上文中我們已經了解,內核在系統中處于核心樞紐的地位,下面我們具體介紹內核中與Rootkit緊密相關的幾個主要功能,更重要的是這些功能對Rootkit的意義所在:
進程管理。進程可以簡單理解為運行中的程序,它需要占用內存、CPU時間等系統資源。現在的操作系統大多支持多用戶多任務,也就是說系統要并行運行多個程序。為此,內核不僅要有專門代碼來負責為進程或線程分配CPU時間,另一方面還要開辟一段內存區域存放用來記錄這些進程詳細情況的數據結構。內核是怎么知道系統中有多少進程、各進程的狀態等信息的?就是通過這些數據結構,換句話說它們就是內核感知進程存在的依據。因此,只要修改這些數據結構,就能達到隱藏進程的目的。
文件訪問。文件系統是操作系統提供的最為重要的功能之一。內核中的驅動程序把設備的柱面、扇區等原始結構抽象成為更加易用的文件系統,并提供一個一致的接口供上層程序調用。也就是說,這部分代碼完全控制著對硬盤的訪問,通過修改內核的這部分代碼,攻擊者能夠隱藏文件和目錄。
安全控制。對大部分操作系統來說,因為系統中同時存在多個進程,為了避免各進程之間發生沖突,內核必須對各進程實施有效的隔離措施。比如,在MS-Windows系統中,每個進程都被強制規定了具體的權限和單獨的內存范圍。因此,對攻擊者而言,只要對內核中負責安全事務的代碼稍事修改,整個安全機制就會全線崩潰。
內存管理。現在的硬件平臺(比如英特爾的奔騰系列處理器)的內存管理機制已經復雜到可以將一個內存地址轉換成多個物理地址的地步。舉例來說,進程A按照地址0x0030030讀取內存,它得到值的是“飛機”;然而,進程B也是按照同樣的地址0x0030030來讀取內存,但它取得的值卻是“大炮”。像上面這樣,同一個地址指向截然不同的兩個物理內存位置,并且每個位置存放不同的數據這種現象并不足以為怪——只不過是兩個進程對虛擬地址到物理地址進行了不同的映射而已。如果這一點利用好了,我們可以讓Rootkit躲避調試程序和取證軟件的追蹤。
上面介紹了內核的主要功能,以及它們對Rootkit的重大意義。說到這里,我們就要切入正題了,即:只要我們顛覆(即修改)了操作系統的核心服務(即內核),那么整個系統包括各種應用就完全處于我們的掌控之下了。要想顛覆內核,前提條件是能把我們的代碼導入內核。具體請見下文。