每个进程拥有4G的空间是假的 不是真实存在的 当你使用某个空间的时候 操作系统会把你的数据存储到物理内存中
- 物理地址
指令
Mov eax,dword ptr ds:[0x12345678]
其中 0x12345678是有效地址
Ds.base+0x12345678是线性地址
通常情况下 有效地址 == 线性地址 因为ds.base是0
当cpu执行如上指令的时候 会把线性地址转换成物理地址
32位cpu 10 10 12 分页
从2 9 9 12 转换成10 10 12 cmd运行
BCDEdit /set PAE ForceDisable
BCDEdit /set NX AlwaysOff
在重启电脑
测试程序
拖到虚拟机里运行 此地址为线性地址 需转换成物理地址
0x010b7b30 拆分成10-10-12这种形式
页目录表索引(第一级):00 0000 0100
页表索引(第二级):00 1011 0111
页索引(物理页):1011 0011 0000
Cr3寄存器 是唯一一个存储了物理地址的寄存器
找哪个进程的物理地址 就要找哪个进程的CR3 我们使用windbg 加载 符号之后,通过!process命令能够查看进程得信息 DirBase就是cr3的地址
查看此时的cr3还是系统进程的 需要切换到我们的进程
.process /i 86761d40 可以将当前的环境切换到这个进程
切换进来之后,才能够看到这个地址中的数据。
此时的cr3才是我们进程的cr3
页目录表索引(第一级):0000000100(4)
页表索引(第二级):00 1011 0111(b7)
页索引(物理页):1011 0011 0000(b30)
查看页目录表 查找第四项 公式48c49000(数组首地址) + 4(下标)*4(类型)
而0x4863a867 的前20位才是页目录项地址偏移 也就是0x4863a000
0x4863a000+b7*4也就找到了物理页的偏移的地址
0x5b30b025前20位 0x5b30b000 + b30
Cr3指向页目录表(PDT) 大小为4096(4kb)个字节 每个成员是4字节 也就是说有1024个成员这1024个成员叫PDE 他又指向页表(PTT)大小也是4096(4kb)个字节 也有1024个成员 每个成员叫PTE 他又指向一个物理页 大小也是4096(4kb)字节 才是真正存储数据的
为什么虚拟地址要分成10-10-12????
是因为页目录表和页表大小为4kb(4096字节) 1024个成员 需要2的10次方二进制位才能表示(因为有下标即可) 物理页4096大小则需要2的12次方
- PTE可以没有物理页,且只能对应一个物理页
- 多个PTE页可指向同一个物理页
PDE 和 PTE的属性
物理页的属性=PDE属性& PTE属性
P位:是否有效位
注意:当PDE或PTE中有一个的属性P=0时,物理页就是无效的
R/W位:读写位
R/W=0:只读
R/W=1:可读可写
U/S位:权限位
U/S=0:特权用户
U/S=1:普通用户
PS位:PDE特有
PS == PageSize
PS=1:PDE直接指向物理页,低22位=页内偏移,偏移最大值为4MB,俗称"大页"
PS=0:PDE指向PTE
A位:访问位
A=1:该PDE/PTE被访问过
A=0:该PDE/PTE未被访问过
D 位 – 是否被写入,CPU 会在写入页面时将该位置 1,但不会清除,只有软件可以将 D 位复位
PWT – 页表缓冲写入机制,为 0 表示 write-back 模式,更新页表缓冲区时,只标记为已更新,不同步写内存,只有被新进入的数据取代时才更新到内存,为 1 表示 write-through 模式,更新页表缓冲区时,同步写内存,保证缓冲区与内存一致
32位cpu 2 9 9 12 分页
10-10-12分页方式物理地址最多可达4GB,无法满足要求,所以设计了新的分页方式也就是2-9-9-12分页方式 又称PAE(物理地址扩展)分页
10-10-12 改为 2-9-9-12
BCDEdit /set PAE ForceEnable
BCDEdit /set NX AlwaysOn
PDPTE
结构图:
P位:第0位,有效位 永远为1
Avail:这部分供操作系统软件随意使用,CPU不使用
第一部分:高四字节32~35位
第二部分:低4字节12~31位
这两部分加起来共24位,后12位补0
灰色部分:保留位
PDE
结构图:
PAT位:页属性表
只有当PS=1时,PAT位才是有意义的(页属性表只针对页)
具体含义这里不作介绍,感兴趣的同学可以查阅资料
PTE
结构图:
注意:
- PTE中12~35位是物理页基址,低12位补0
- 物理页基址+12位页内偏移指向具体数据
找到字符串
A17BD8 拆分二进制
00 0 0000 0101 0 0001 0111 1011 1101 1000
PDPTE:0
PDE:5
PTE:17
物理页:BD8
使用!process 0 0遍历进程
指令 .process /i 0x87d0f030切换到我们的进程 直接运行 再查看cr3是否相等
通过指令!dq cr3+8*0查看PDPTE
通过指令!dq 5ed38000+8*5查看PDE
通过指令!db 45cfc000+BD8查看物理页