Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
保护模式101012分页机制
在保护模式中,我们都知道,所谓的内存地址是虚拟地址,不是物理地址。
但是,我们是否想过,虚拟地址是随便产生的吗?当然不是,其实一些数字的组合。
可这些数字是什么意思呢?答案:序号。
通过序号查找表,一个序号对应找一张(物理表地址+属性),这样通过连续的序号,我们可以查找最终数据存放的物理地址。
现在,我们了解一下 10-10-12分页方式,即一个32位地址分别拆分成10-10-12位,每位组成一个新的序号。
一、WindowsXp设置以101012分页启动方式
在C:\boot.init(默认为隐藏文件,工具-文件夹选项-显示隐藏文件),将 "nonexecute-optin" 改为 "execute-optin"。
修改完之后重启即可。
二、利用101012分页算法将线性地址转换为物理地址,并从物理页中读出内容
1. 打开记事本,输入"hello world"这个字符;之后使用CheatEngine工具附加,搜索该字符串,找到线性地址
2. 现在我们得到该字符串的线性地址为 000B0C40,拆分成2进制,并按照10-10-12来分:
00 0000 0000 | 00 1011 0000 | 1100 0010 0000 -> 0 | B0 | C40
其相当于三级目录,因此,我们需要获取一级目录的首地址。
该一级目录地址每个进程都存放于CR3寄存器中。
我们通过windbg的 "!process 0 0" 指令,查看每个进程的CR3值(DirBase),如下图。
DirBase(CR3): 1491c000
3. 使用windbg依次查看物理内存
<1>Windbg中 dd表示查看线性内存,而 !dd 表示查看物理内存。
<2>内存地址后三个字节为属性,因此我们查出地址后自动将后三个字节变为零即可。
<3>10-10-12模式表示的是序号,我们知道一个地址转换成四字节,前两级都是地址表,因此需要乘以*4。
0 | B0 | C3B -> 0 | 2C0(B0*4) | C40
1)查看一级地址值
kd> !dd 1491c000
#1491c000 14828067 14833067 14883067 00000000
#1491c010 14807067 00000000 00000000 00000000
2)查看二级地址值应该为二级地址加上额外偏移。0f2c2000+0x2c0
kd> !dd 14828000+2c0
#148282c0 14a05067 14998067 14a09067 149fa067
#148282d0 1497b067 14a6c067 149ed067 1a57b067
3)三级地址其实就是物理页地址,查字节,则不需要再进行扩大。
kd> !db 14a05000+c40
#14a05c40 68 00 65 00 6c 00 6c 00-6f 00 20 00 77 00 6f 00 h.e.l.l.o. .w.o.
#14a05c50 72 00 6c 00 64 00 21 00-21 00 21 00 00 00 00 00 r.l.d.!.!.!....