1. 程式人生 > 其它 >6、程式碼間的跳轉--Windows核心學習筆記

6、程式碼間的跳轉--Windows核心學習筆記

1、程式碼間的跳轉(段間跳轉、非呼叫門值類的)

1、同時修改CSEIP的指令
	JMP FAR/CALL FAR/RETF/INT/IRETED
	
2、只改變EIP的指令
	JMP/CALL/JCC/RET
	
3JMP 0x20:0x004183D7 CPU如何執行這行程式碼?
	-首先JMP後面跟了6個位元組,分別是0020004183D7
	-0x0020是兩個位元組,0x004183D7是第四個位元組
	-如果是這樣的話 JMP 0x004183D7,CPU直接修改EIP的值,不需要查表
	
	-JMP 0x20:0x004183D7對於這種指令我們稱之為常跳轉,這種指令需要進入零環,需要查表,查那一張表是由指令本身決定的
	
	-第一步、段選擇子拆分
		0x20
對應二進位制形式 0000 0000 0010 0000 Index = 二進位制0000 0000 0010 0 = 4:說明查詢GDT表中下標為4的項 TI = 二進位制0 = 0 RPL = 二進位制00 = 0 -第二步、查表得到段描述符(通過0x20找到對應的段) TI = 0:說明需要查詢GDT表 Index = 4:找到對應的段描述符 段描述符只有四種情況可以跳轉:程式碼段、呼叫們、TSS任務段、任務門、(如果0x20對應的是資料段,那麼跳轉失敗) -第三步、段許可權檢查 如果是非一直程式碼段,要求 CPL == DPL && RPL <= DPLCPL是當前CPU的特級許可權) 如果是一直程式碼段,要求 CPL
>= DPL -第四步、載入段描述符 通過上面的許可權檢查後,CPU會將段描述符載入到CS段暫存器中 -第五步、執行程式碼 CPUCS.Base + Offset(偏移的值)的值寫入EIP,然後執行CSEIP處的程式碼,段間跳轉結束

在這裡插入圖片描述
RPL 我以什麼樣的許可權訪問你
在這裡插入圖片描述
DPL 如果你要訪問我,你需要具備什麼樣的許可權

拓展、
	有點不明白,就算用0x20限制了,我直接JMP 0x004183D7就可以訪問任何地址啊,還要這個段間跳轉有什麼用呢?
	
		答:保護模式是保護記憶體,主要通過段機制和頁機制來保護。當我們啟動OD時,
發現段暫存器中的值(除了FS
)起始位置和界限沒有區別, 但是 WORD Attribute //屬性 段描述符高四位元組的第8位開始 到第23位結束 是有區別的 例如:一個地址是0x12345678當用段地址A修飾的時候,這個地址可以訪問 當用段地址B修飾的時候,這個地址就不可以訪問。這就是段的作用 -段的作用主要是保護GDT表和IDT表,GDT一張表是記憶體,有保護

在這裡插入圖片描述

實驗、
	1、我修改段描述符的base後無法執行,例如:0x00cffb00:0x0001ffff
	2、在JMP far成功後,在OD中發現CS段的base和Limit永遠都是0
	3、高許可權的如何訪問低許可權的段?
	4、記住以上的流程