首页
论坛
课程
招聘
[原创]保护模式-分页管理机制
2013-11-4 12:25 17280

[原创]保护模式-分页管理机制

2013-11-4 12:25
17280
如何启用或者禁止分页管理机制
在windows下面可以通过修改系统启动配置文件来实现启用或者禁止分页机制.

在配置文件中加上/nopage的选项,就实现了不启用分页机制.


控制寄存器CR0

PG(Page): 0 : 禁用分页管理机制  1:启用分页管理机制
PE(Protect Mode): 0 : CPU运行实模式  1:CPU运行于保护模式.

分段机制和分页机制
分段机制:实现虚拟地址(由段和偏移构成的逻辑地址)到线性地址的转换
分页机制:分页管理机制实现线性地址到物理地址的转换
要点:80386中,页的大小固定为4K字节,每一页的边界地址必须是4K的倍数

页码
因为分页起始地址是模4K,所以分页的开始地址都是 “XXXXX000H”的形式, XXXXX
就是页码.

线性地址到物理地址的转换
80386把页映射表分为两级。
第一级页表:页目录表(Page Directory Table),缩写:PDT. 大小:4K ,每项4字节,包含二级页表所在物理地址空间页的页码.存在:物理内存中(不能是虚拟机内存,如果是虚拟内存中,那么就递归查找了,不符合逻辑,所以存在于物理地址中)
第二级页表:页表(Page Table Table),缩写:PTT,大小:4K ,每项4字节,包含对应物理空间页的页码.

页目录表=>页表=>物理内存页的对应关系图

页目录表表项(Page Directory Table Entry),缩写:PDE
页表表项(Page Table Entry),缩写:PTE
采用统一的页表格式

物理页码是我们所关心的.

线性地址到物理地址的转换规则
CR3寄存器高20位保存了PDT的物理页码

这样就可以定位到了PDT的起始物理地址了,还缺少页表的索引吧?,对!
‚线性地址(windows下面虚拟地址等价于线性地址例如: ss:0x1012475,0x1012475就相当于是线性地址了),0x1012475转化为二进制0000000100  0000010010  010001110101,高10为就是PDT的索引,0000000100 <=> 4就是PDT中索引了,这样就可以定位到页表了.
PTT页表的下标在哪里呢?别急,线性地址的中间10位就是页表的索引,这样就可以定位到物理内存页的起始地址了,但是偏移存放在哪里呢?线性地址的低12位就是物理内存页的偏移。
示意图:

这样就完成了一个线性地址到物理地址的转化。

查看虚拟地址对应的PDE和PTE

效果:


进程的页目录如何定位?
我们知道CR3里面保存了当前进程页目录表的物理内存页的页号.但是我们如果想编码实现获取页目录的话,不可能整天背个windbg吧,其实微软提供一个KPROCESS的结构来记录每个进程都有一个单独的页目录,用来映射进程所有页表的位置。
KPROCESS.DirectoryTableBase[0]; 

进程切换时,操作系统通过CR3来通知硬件设备新进程页目录所在地址。


定位KPROCESS
KPROCESS被保存在进程环境块的结构中了


可以通过ObReferenceObjectByHandle获得进程对应的EPROCESS。

也可以通过PsGetCurrentProcess来获取当前线程的EPROCESS指针


windbg查看进程的页目录表

这里尝试一下手工定位计算器的入口地址所对应的物理地址

线性地址解01012475  0000000100   0000010010   010001110101
                    PDT索引4    PTT索引18     物理页面偏移0x475

首先通过!process获取计算器进程的页目录表

DirBase(Directory Base)就是页目录表所在物理页面的起始地址0x5e8d7000
!dd 0x5e8d7000查看PDT

!dd 0x18a07000查看PTT

!db 51b18475查看计算器进程的入口点的物理地址处内容

和OD里面显示的一致

修改物理内容的内容,看OD里面显示的虚拟地址处内容跟不跟着改变?

OD里面的第一个字节也变成了0x70,表明转化物理地址正确


文章中箭头不好弄,带箭头和着色更加完整的请参看附件.
附件: 分页管理机制.zip

[注意] 欢迎加入看雪团队!base上海,招聘CTF安全工程师,将兴趣和工作融合在一起!看雪20年安全圈的口碑,助你快速成长!

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (21)
雪    币: 40
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
catface 活跃值 2013-11-4 12:43
2
0
第一个图是windows操作 进行分页设置
第二个图 是一个汇编教程CHM的某一章节
后面的就是WINDBG 操作文档和WRK吧
雪    币: 2554
活跃值: 活跃值 (1137)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
安于此生 活跃值 34 2013-11-4 12:47
3
0
恩,楼上正解!
雪    币: 40
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
catface 活跃值 2013-11-4 12:48
4
0
要是来一个 原理转化为数据结构 代码中实际操作 那就更好了
雪    币: 2554
活跃值: 活跃值 (1137)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
安于此生 活跃值 34 2013-11-4 12:50
5
0
这是半年前整理的, 有时间我试试你的想法
雪    币: 174
活跃值: 活跃值 (44)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Hacksign 活跃值 2013-11-4 14:29
6
0
配图不错~~顶一个。
雪    币: 100
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
a糊涂虫 活跃值 2013-11-4 14:35
7
0
这样的贴子才优秀,我越来越难分辨优秀和精华的界限了,有些精华让我费解,有些优秀让我更费解,心情好时精的几率高?
雪    币: 71
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mumaren 活跃值 2013-11-4 17:17
8
0
不错
继续努力
雪    币: 0
活跃值: 活跃值 (24)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2013-11-5 09:24
9
0
很棒,我也认为可以得精
雪    币: 253
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
游人啊k 活跃值 2013-11-5 11:43
10
0
分析的不错。。这个chm我好像也看过。。
雪    币: 2554
活跃值: 活跃值 (1137)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
安于此生 活跃值 34 2013-11-5 12:39
11
0
保护模式的经典之作
雪    币: 41
活跃值: 活跃值 (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
markro 活跃值 2013-11-5 15:15
12
0
好贴。。。。
雪    币: 25
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
squallqz 活跃值 2013-11-6 15:53
13
0
印象中这个我也看过,一本彩页的电子书吧,具体的忘了,不过希望楼主能厚道点用Viso重新做一个图吧,太模糊了……
雪    币: 2554
活跃值: 活跃值 (1137)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
安于此生 活跃值 34 2013-11-6 16:13
14
0
见附件,附件中附带高清版
雪    币: 524
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnppk 活跃值 2013-11-12 11:45
15
0
标记一下,慢慢看
雪    币: 39
活跃值: 活跃值 (413)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iceway 活跃值 2014-1-16 22:21
16
0
为什么会这样

PROCESS 8618ac18  SessionId: 0  Cid: 02e8    Peb: 7ffdf000  ParentCid: 03bc
    DirBase: 06d80200  ObjectTable: e1343258  HandleCount: 138.
    Image: wmiprvse.exe

0: kd> .process 8618ac18  
Implicit process is now 8618ac18
WARNING: .cache forcedecodeuser is not enabled
0: kd> dd 06d80200  
06d80200  ???????? ???????? ???????? ????????
06d80210  ???????? ???????? ???????? ????????
06d80220  ???????? ???????? ???????? ????????
06d80230  ???????? ???????? ???????? ????????
06d80240  ???????? ???????? ???????? ????????
06d80250  ???????? ???????? ???????? ????????
06d80260  ???????? ???????? ???????? ????????
06d80270  ???????? ???????? ???????? ????????
雪    币: 106
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jxzhxch 活跃值 2014-5-14 13:45
17
0
使用!dd
雪    币: 143
活跃值: 活跃值 (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zylyy 活跃值 2014-6-9 11:22
18
0
标记一下,直接修改物理内存,
雪    币: 120
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wmhnq 活跃值 2014-7-23 14:07
19
0
怎么我照葫芦画瓢,找到的物理地址全是00呢?
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kxzb 活跃值 2014-7-23 17:21
20
0
写的不错,鼓掌
雪    币: 57
活跃值: 活跃值 (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
HelloWorldPc 活跃值 2020-3-20 15:59
21
0
老师您那个驱动教材有没有整套做完的呢,看了您前面几节课感觉讲的很好,
雪    币: 202
活跃值: 活跃值 (375)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xshacry 活跃值 2020-6-6 13:46
22
0
那32bit win10怎么设置分页模式呢?都是讲xp,那win10怎么弄呢?
游客
登录 | 注册 方可回帖
返回