天天看點

RootKit基礎學習

很多RootKit都是運作在Ring0層的,是以我們必須先了解Ring0是個什麼東西。

其實Ring(環)就是x86平台進行通路控制的概念,Ring0層也叫作環0層,win平台下一共就有4個環,不用說肯定是Ring0,Ring1,Ring2,Ring3了,權限最高的就是Ring0層,也叫做核心層,權限最低的就是Ring3層了呀,也叫作使用者層。Windows系統就僅僅使用了Ring0層和Ring3層,試想Windows系統用4個環來實作通路控制那麼難度大大上升了。核心層權限運作系統核心和驅動程式,而使用者層權限運作普通程式。當一個程式執行的時候系統會配置設定一個環編号,環編号高的程式不能直接通路環編号低的程式,就是Ring3層的程式不能通路Ring0層的程式,當然除了程式外還有彙編語言,有的彙編指令也是需要Ring0權限的。

就比如讀寫硬體端口的in,out指令和控制CPU狀态的cli,sti指令。

除了需要了解Ring0層概念,還需要了解關鍵表的概念。

CPU除了使用Ring分層機制進行通路限制外還需要對正在運作的代碼進行管理控制。發出中斷,程式崩潰,發出硬體信号都是有的CPU處理的而不是系統,是以CPU要實作這些功能就必須維護管理很多資料,而這些資料一般都是以表的形式存放的,這些表如下:

1.全局描述符表,英文全稱Global Descriptor Table,簡稱GDT,有且僅有一個,用于映射記憶體位址。

2.本地描述符表,英文全稱Local Descriptor Table,簡稱LDT,也是用于映射記憶體位址。

3.頁目錄,英文全稱Page Directory,也是用于映射記憶體。

4.中斷描述符表,英文全稱Interrupt Descriptor Table,簡稱IDT,用于索引中斷處理程式。

5.系統服務排程表,英文全稱System Services Descriptor Table,簡稱SSDT,用于協助Windows系統處理系統調用。

記憶體分頁的概念也不得不說呀!

因為Windows系統記憶體分頁機制是比較難以了解的一部分内容,我們都知道在32位的Windows系統中每一個程序都有屬于自己的4GB記憶體空間,但是在以前Windows的主流配置的計算機的自身記憶體都不夠4GB的時候,那如何保證每個程序都獨享4GB呢?答案就是虛拟記憶體了,在現實環境下運作的程式所用的記憶體都是非常小的,是以就是作業系統給了4GB的虛拟記憶體,但是它真正的實體記憶體可能隻有幾十MB甚至幾MB大小,然而每個程式面對的記憶體位址都是基本相同的,這就是映射。為了實作這種巧妙的記憶體映射,Windows系統使用頁表概念。其實Windows系統通過目錄,頁表(Page Table)與頁表項(Page Table Entry,PTE)這種二級表結構将虛拟位址轉化為實體位址之間的記憶體映射的。

首先Windows給每一個程序配置設定一個不同的頁目錄用于儲存這種二級表結構,每個頁目錄儲存的虛拟位址到實體位址的映射關系都不同,是以才會有兩個不同的程序通路同一虛拟位址而可以存儲不同資料的情況。一個32位的虛拟位址可以解釋為3個部分,就是頁目錄索引,頁表索引,位元組索引,負責描述記憶體映射結構中索引實體位址。

頁目錄索引用來在頁目錄中索引這個虛拟位址的頁目錄項(Page Directory Entries,PDE)進而找到PTE所在的頁表。

頁表索引用來在準确的頁表中索引PTE進而找到目标記憶體頁。

位元組索引負責在目标記憶體頁中索引最終實體位址。

我們解釋一下轉換虛拟位址的方法。

1.記憶體管理硬體找到目前程序頁目錄,而且每一次都在程序環境切換時也會得到一個新的程序頁目錄位址。

2.在程序頁目錄中使用頁目錄索引可以找到相應的PDE,這個PDE包含了這個頁表的頁面幀編号(Page Frame Number,PFN),通過這些資訊可以找到包含這個虛拟位址映射資訊的頁表。

3.在找到頁表中使用頁表索引可以找到PTE,它描述了這個虛拟位址所在實體位址資訊。

4.根據這個PTE索引找到頁面,判斷這個頁面是不是有效的,如果這個頁面有效,它就會包含這個虛拟頁所對應的實體記憶體頁資訊的PFN,但是如果這個頁面是無效的,那麼記憶體管理錯誤處理器就會找到該頁面而且嘗試使它變成有效的頁面,如果不能變成有效的,就是産生錯誤。

5.PTE所指的頁面如果有效的話,那麼在它指向的實體記憶體頁中使用位元組索引,就可以定位到真正的實體位址上。

繼續閱讀