windows驅動內核編程

image.png

搭建驅動開發環境 sdk10 wdk10
win7平臺 降低警告級別

8086CPU 16位匯編
1982年 intel退出80286處理器,第一次提出保護模式
在保護模式下,段寄存器存儲的段基址,而是段選擇子

X86體系CPU支持三種模式
實模式:兼容16位CPU的模式
保護模式:操作系統所在模式
虛擬8086模式:可以模擬多個8086執行多任務

8086處理器的段寄存器是16位,共四個:
CS,DS,ES,SS
32位處理器內,增加兩個 FS,GS
6個寄存器分為可見部分和不可見部分

不可見部分存放段的基地址,范圍和段屬性,處理器內部使用

段寄存器可見部分存儲的值稱為段選擇子
13位:描述符表索引 1位:TI 2位:RPL
TI=0 全局描述符表GDT TI=1 局部描述符表LDT(windows系統并沒有使用)

88位描述符高速緩存寄存器

描述符表中存放的是段描述符
描述符有效為P位
段限長Limit
粒度G位 0 limit字節 1 limit4KB
基地址字段base
s與TYPE s=0 系統段 1代碼段或數據段
TYPE:
0EWA 數據段 擴展方向 是否可寫 訪問位
1CRA 代碼段 一致性 可讀 訪問位

當前執行指令位置 cs eip決定
普通跨段跳轉
非一致性
cpl==dpl rpl< =dpl
一致性
cpl>=dpl

s = 0,type=110 調用門
中斷門 type=14
陷阱門 15
任務門 5

r gdtr
dp 地址

jmp far 跳轉到同級非一致代碼段
IDT 中斷門描述符 陷阱門描述符 任務門描述符
存放中斷處理函數地址 異常處理函數地址

DPL:描述符特權(Descriptor Privilege Level)
存儲在描述符中的權限位,用于描述代碼的所屬的特權等級,也就是代碼本身真正的特權級。一個程序可以使用多個段(Data,Code,Stack)也可以只用一個code段等。正常的情況下,當程序的環境建立好后,段描述符都不需要改變——當然DPL也不需要改變,因此每個段的DPL值是固定。

RPL:請求特權級RPL(Request Privilege Level)
RPL保存在選擇子的最低兩位。 RPL說明的是進程對段訪問的請求權限,意思是當前進程想要的請求權限。RPL的值由程序員自己來自由的設置,并不一定RPL>=CPL,但是當RPL<CPL時,實際起作用的就是CPL了,因為訪問時的特權檢查是判斷:EPL=max(RPL,CPL)<=DPL是否成立,所以RPL可以看成是每次訪問時的附加限制,RPL=0時附加限制最小,RPL=3時附加限制最大。所以你不要想通過來隨便設置一個rpl來訪問一個比cpl更內層的段。

CPL:當前任務特權(Current Privilege Level)
表示當前正在執行的代碼所處的特權級。CPL保存在CS中的最低兩位,是針對CS而言的。當選擇子成功裝入CS寄存器后,相應的選擇子中的RPL就變成了CPL。因為它的位置變了,已經被裝入到CS寄存器中了,所表達的意思也發生了變——原來的要求等級已經得到了滿足,就是當前自己的等級。

分頁機制
windows是通過頁目錄,頁表(page table)與頁表項(page table entry,pte)這種二級表的結構將虛擬地址轉譯成物理地址
頁目錄表PDT 頁目錄項PDE 頁表PTT 頁表索引PTE

頁目錄索引 頁表索引 字節索引
10 10 12
虛擬頁號

實驗 虛擬地址轉物理地址
查看記事本程序notepad.exe的進程信息
!process 0 0 notepad.exe
利用記事本的進程結構的起始地址,將windbg的當前進程切換到notepad.exe
.process 884ead40
搜索
s -u 0x00000000 L0x01000000 "hello 15pb"
查看位于本進程虛擬地址處的字符串
du 0x007c0bd4
查看一下notepad.exe進程頁目錄0x32303000
!dd 0x32303000
PTE位于0x32103000+0x3c04
!dd 0x32103000+0x3c0
4

X86映射表分兩級
第一級:頁目錄表
第二級:頁表

PTE與物理頁
PTE可以沒有物理頁
PTE與物理頁是多對一的關系

PDE與PTE都是4字節的數據,結構有相似性
P位 存在
R/W位 R/W = 0 只讀 R/W = 1可讀可寫
U/S:0特權用戶才能訪問 1 普通用戶,特權用戶都能訪問
P/S:只對PDE有意義
PS=1的時候 PDE直接指向物理頁無PTE,低22位是頁內偏移,所謂的大頁,一頁4MB
PS=0時,指向下一級頁表
A位:只要被訪問過一個字節,會被置為一
D位:是否被寫過,寫過就置1

PAE 物理擴展模式
PAE模式相比較傳統模式多了一個PDPTE,PAE模式下的PDE與PTE都變成了8字節

驅動編程
進程空間分為用戶空間與內核空間
驅動開發分為三類
NT WDM WDF
nt式驅動程序
1包含ntddk.h文件
2編寫一個DriverEntry入口函數
3編寫一個驅動卸載函數

NTSTATUS DriverEntry(
PDDRIVER_OBJECT driver,//驅動對象
PUNICODE_STRING path//路徑
)
卸載函數
VOID DriverUnload(PDRIEVER_OBJECT driver){}

內核編程基礎
驅動對象 設備對象 IRP io請求包(如同windows應用程序中的MSG)
程序 窗口 消息
設備對象
重要字段
DiverObject 指出設備對象屬于哪個驅動對象
NextDevice 下一個設備對象
AttachedDevice 指向下一層驅動程序的設備對象
CurrentIrp 用來決策當前IRP完成還是掛起等
DeviceExtension 指向LDR鏈指針

設備對象 發送接收 IRP
驅動對象 處理 IRP

指定自己編寫的函數所占內存的屬性

pragma alloc_text(類型,函數名)

類型
INIT 調用完即可釋放
PAGE 位于分頁內存
NONE_PAGE 位于非分頁內存

中斷請求級別 Interrupt Request Level IRQL
dispatch apc passive

字符串表達方式
RTL_CONSTANT_STRING 初始化操作

內核api前綴
IoXX
ExXX
RtlXX
ReXX
ZwXX
NtXX
內存操作
申請內存ExAllocatePool
拷貝內存RtlCopyeMemory
填充內存RtlFillMemory
釋放內存ExFreePool

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 最近開始想稍微深入一點地學習Linux內核,主要參考內容是《深入理解Linux內核》和《深入理解Linux內核架構...
    ice_camel閱讀 1,806評論 0 2
  • CPU Rings, Privilege, and Protection 原文地址:http://duartes....
    houchen閱讀 2,135評論 0 1
  • 轉眼來到科銳學習已經超過一年的時間了,眼看三階段已經進入尾聲,內核的學習也快要結束,記錄一下筆記和心得,也給剛接觸...
    五行貓閱讀 1,121評論 0 0
  • 昨晚、我夢到我的畫畫完了、不是窗前有很多畫、而是就一支大花在整個畫板上、我還納悶為什么會變成了一支大畫 我還夢到了...
    叉叉蹦閱讀 205評論 0 0
  • uooivg
    ABC沉浮001閱讀 117評論 0 0