[windows內核]代碼段跳轉流程

代碼段間的跳轉(非調用門之類的)
段間跳轉,有兩種情況,要跳轉的是一致代碼段還是非一致代碼段
同時修改CS和EIP的指令
JMP FAR / CALL FAR / RETF / INT / IRETD

注意
只改變EIP的指令
JMP/CALL/JCC/RET

關於代碼段間跳轉可以在手冊中5.8和5.81中有詳細解釋
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

那麼我們就來簡單的分析一下它的代碼段間跳轉執行流程
舉一個例子
JMP FAR 指令格式:
JMP 0x20:0x004183D7

1.段選擇子拆分
0x20會被拆分成‭ 0000‬ 0000‬ 0000‬ 0010 0000‬
RPL=00
TI=0
INDEX=4

2.查表得到段描述符 [僅限於 代碼段,調用門,TSS任務段,任務門]
TI=0 所以查抄GDT表
INDEX=4 找到GDT表裏對應的段描述符

四種情況可以跳轉:代碼段,調用門,TSS任務段,任務門
這裏在手冊中的5.4章中有說
在這裏插入圖片描述
3.權限檢查

分爲兩種情況
1.非一致代碼段
2.一致代碼段
這兩種情況在手冊的

非一致代碼段5.8.1.1
在這裏插入圖片描述
在這裏插入圖片描述
一致代碼段5.8.1.2
在這裏插入圖片描述
在這裏插入圖片描述
這裏簡單解釋一下就是
如果是非一致代碼段 要求CPL == DPL 並且 RPL <= DPL
如果是一致代碼段,要求CPL>=DPL

爲什麼要區分一致代碼段和非一致代碼段呢
在這裏插入圖片描述
這裏給出了大概的解釋,就是一致性代碼段主要用於數學函數庫和異常處理程序的代碼模塊,這些代碼對應用
程序提供支持,但是並不訪問受保護的系統設施。這些模塊是操作系統或者管理程序的一部分,但是它們可以以更低特權級來執行
也就是一些共享的代碼段或者安全的代碼段可以用一致代碼段修飾,而一些會對系統產生不安全影響的就應該用非一致代碼段修飾

那怎麼能提升CPL權限來調用非一致代碼段呢
直接對代碼段進行JMP 或者CALL 的操作,無論目標是一致代碼段還是非一致代碼段,CPL都不會發生改變
在這裏插入圖片描述
手冊裏說明如果要提升CPL的權限,只能通過調用門

4.加載段描述符
通過上面的權限檢查後,CPU會將段描述符加載到CS段寄存器中

5.代碼執行
CPU將CS.Base + Offset 的值寫入EIP 然後執行CS:EIP處的代碼,段間跳轉結束

最後總結一下:
1.對於一致代碼段:也就是共享的段

特權級別高的程序不允許訪問特權級別低的數據:核心態不允許訪問用戶態的數據;

特權級別低程序可以訪問特權級別高的數據,但特權級不會改變(用戶態還是用戶態);

2.對於普通代碼段(非一致代碼段)

只允許同級訪問;

絕對禁止不同級別的訪問:核心態不能訪問用戶態,用戶態不能訪問核心態;

下次會做個小實驗來加深一下印象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章