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