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阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 最近开始想稍微深入一点地学习Linux内核,主要参考内容是《深入理解Linux内核》和《深入理解Linux内核架构...
    ice_camel阅读 1,732评论 0 2
  • CPU Rings, Privilege, and Protection 原文地址:http://duartes....
    houchen阅读 1,812评论 0 1
  • 转眼来到科锐学习已经超过一年的时间了,眼看三阶段已经进入尾声,内核的学习也快要结束,记录一下笔记和心得,也给刚接触...
    五行猫阅读 1,019评论 0 0
  • 昨晚、我梦到我的画画完了、不是窗前有很多画、而是就一支大花在整个画板上、我还纳闷为什么会变成了一支大画 我还梦到了...
    叉叉蹦阅读 174评论 0 0
  • uooivg
    ABC沉浮001阅读 114评论 0 0