本文將向讀者介紹一種通過處理器的調試機制來實現Rootkit的隱形的技術。這種技術的特點是,無需利用系統的缺陷,直接處理器的正常功能就能達到隱形的目的。本文將以Linux系統為例來介紹如何實現基于調試寄存器的隱形方法。
一、概述
幾年來,用于在攻陷的機器上實現隱形技術和方法越來越多,讓人目不暇接。其中,有一些直接篡改系統調用表,有一些修改中斷處理程序,凡此種種,在此不再一一列舉。不過,這些方法的共同之處在于,都以可見的形式修改了底層的操作系統,這使得它們很容易被發現。
本文中,筆者利用調試機制這一x86平臺的共同特性,用內核級Rootkit實現了終極的隱形。雖然該方法通用于所有IA-32兼容平臺,但我們這里以Linux操作系統為例,講解如何在不碰鉤子技術的各種“傳統”目標(如系統調用表、中斷處理程序等)的情況下攔截正常執行流程的技術。 實際上,這種隱形技術是如此高超,以至于還沒有人發現我們的存在。
在本文中,當我們說“調試器”時,實際上指的是只能從ring 0訪問的IA-32的調試機制,對于用戶空間的調試程序來說,是無法利用這個機制的,只有某些內核調試工具才能使用這個機制。
二、處理器的調試機制
為了讓開發人員過得更輕松些,Intel公司引入了一個機制來處理調試過程。按照Intel公司的用戶手冊的說法,“IA-32架構提供了大量的調試設施,供調試代碼、監視代碼執行和處理器性能之用。這些設施對調試應用程序軟件、系統軟件和多任務操作系統都是非常重要的 ”。開發人員可以通過一組專用寄存器(稱為調試寄存器,從DR0至DR7)來使用該機制,這樣他們就可以根據內存地址來設置硬件斷點了。一旦執行流到達帶有斷點標記的地址,控制權就會交給調試中斷處理程序(INT 1),該處理程序繼而調用do_debug()函數(定義在/i386/kernel/traps.c文件中)來處理引起異常的實際情況。
可以通過調試寄存器(DB0~DB7)和兩個與模式特定的寄存器(MSR)來訪問這種調試支持。對本文而言,我們只需關心調試寄存器就行了。這些寄存器存放的是內存地址和I/O位置,我們將其稱之為斷點。斷點既可以是用戶在程序中選定的位置(指令斷點),也可以是內存中的數據存儲區(數據斷點),還可以是指定的I/O端口(I/O斷點),程序員或者系統設計人員通常希望程序在這些指定的地方停下來,以便調用調試軟件來檢查處理器的狀態。
當內存或I/O設備訪問某個斷點地址時,就會引起一個調試異常(#DB)。我們可以進一步為斷點規定引起中斷的具體的內存訪問方式或者I/O訪問方式,例如一個內存讀和/或寫操作或者I/O讀和/或寫操作(即以規定之外的方式訪問該斷點時不會引起中斷)。調試寄存器同時支持指令斷點和數據斷點。MSR是從P6系列處理器開始引入IA-32架構的,它用于監視分支、中斷和異常,并記錄下最后分支、中斷或者異常所使用的源地址和目的地址,以及最后中斷或者異常之前發生的分支的源地址和目的地址。
共5頁: 1 [2] [3] [4] [5] 下一頁 | |||||||
|