ring0和ring3的區別

2021-08-31 07:55:18 字數 1649 閱讀 1159

現在**核心程式和應用程式之間的本質區別。除了能用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],軟體的**來得簡潔方便,那是破壞與安全對抗的主戰場。

Ring0和Ring3如何進行通訊

可以用這個底層函式建立乙個與ring3進行通訊的控制裝置物件。使用這個函式需要注意,它生成的裝置物件具有預設的安全屬性,需要有管理員許可權的程序才可以開啟這個裝置物件。對於我們用來通訊的控制裝置來說,肯定是需要乙個裝置名稱的,上面我們還提到,裝置名是無法直接被使用者層所開啟的,需要一些特殊的操作,而...

Ring0建立事件Ring3設定事件

同步事件 synchronizationevent 當事件物件為激發時,如遇到kewaitforxx等核心函式,事件物件則自動變回未激發態 通知事件 notificationevent 當事件物件為激發時,如遇到kewaitforxx等核心函式,事件物件則不會自動變回未激發態 ring0 建立事件 ...

Ring0 鍊錶

一般驅動層不使用資料結構,一般ring3層 雙向鍊錶可以將鍊錶形成乙個環.blink指標指向前乙個元素,flink指標指向下乙個元素.typedef struct list entry list entry,plist entry,restricted pointer prlist entry 初始...