現在探討內核程序和應用程序之間的本質區別。除了能用WDK編寫內核程序和閱讀一部分Windows的內核代碼之外,我們還需要了解它們的本質是什么,它們和我們熟悉的應用程序有什么區別。
Intel的x86處理器是通過Ring級別來進行訪問控制的,級別共分4層,從Ring0到Ring3(后面簡稱R0、R1、R2、R3)。R0層擁有最高的權限,R3層擁有最低的權限。按照Intel原有的構想,應用程序工作在R3層,只能訪問R3層的數據;操作系統工作在R0層,可以訪問所有層的數據;而其他驅動程序位於R1、R2層[多多關注www.hitidc.com],每一層只能訪問本層以及權限更低層的數據。
這應該是很好的設計,這樣操作系統工作在最核心層,沒有其他代碼可以修改它;其他驅動程序工作在R1、R2層,有要求則向R0層調用,這樣可以有效保障操作系統的安全性。但現在的OS,包括Windows和Linux都沒有采用4層權限,而只是使用2層——R0層和R3層,分別來存放操作系統數據和應用程序數據,從而導致一旦驅動加載了,就運行在R0層,就擁有了和操作系統同樣的權限,可以做任何事情,而所謂的rootkit也就隨之而生了。
rootkit在字面上來理解,是擁有“根權限”的工具。實際上,所有的內核代碼都擁有根權限,當然,並不一定它們都叫做rootkit,這要看你用它來做什么。用rootkit技術開發的木馬和病毒正在迅速發展,它們往往極難清除,以往殺毒軟件可以輕松清除掉系統中病毒的時代似乎已經一去不復返了。
大多數指令可以同時使用於R0層和R3層,但有[多多關注www.hitidc.com],些和系統設置相關的指令卻只能在R0層被使用,或者在R3層的使用受到限制,主要有下面這些:
lgdt:加載GDT寄存器
lldt:加載LDT寄存器
ltr:加載任務寄存器
lidt:加載IDT寄存器
mov:加載和存儲控制寄存器、調試寄存器時受限
lmsw:加載機器狀態字
clts:清除cr0中的任務切換標記
invd:緩沖無效,並不寫回
wbinvd:緩沖無效,並寫回
invlpg:無效TLB入口
hlt:停止處理器
rdmsr:讀模式指定寄存器
wrmsr:寫模式指定寄存器
rdpmc:讀取性能監控計數器
rdtsc:讀取時間戳計數器
最后2條指令rdpmc和rdtsc,在cr4的位4(PCE)和位2(TSD)被設置的情況下可以同時被R0層和R3層調用。任何違反上面規定的操作,在Windows下都可能會產生通用保護故障的異常。
另外,還有些所謂的IO敏感指令,包括:
cli:關閉中斷
sti:開啟中斷
in:從硬件端口讀
out:往硬件端口寫
這些指令在R0層可以直接被使用,在R3層被使用的時[多多關注www.hitidc.com],候還要檢查IO許可位圖,綜合判斷是否允許調用。
當然,前面已經聲明我們寫的和研究的代碼都是內核代碼,也就是說,上面這些指令都是可以用的。當然,相應的rootkit技術的病毒和木馬的作者顯然也會明白這一點,所以這並不是讓人很有安全感的一個現狀。
更重要的保護機制是如何保證系統內存空間的讀/寫、可執行屬性,這將在12.2節“保護模式下的分頁內存保護”中詳述。對於病毒和木馬來說,使用硬件機制來實現破壞雖然並非不可能,但是遠不如直接修改內存中的操作系統內核和其他[多多關注www.hitidc.com],軟件的代碼來得簡潔方便,那是破壞與安全對抗的主戰場。
http://www.cnblogs.com/pcajax/archive/2011/03/16/1986407.html