15 页的机制-------10-10-12分页

1.物理地址
有如下指令:
mov eax,dword ptr ds:[0x12345678]
其中0x12345678为有效地址
ds.base + 0x12345678 为线性地址
通常情况下base都为0,这时的有效地址跟线性地址是一致的。
当我们执行上面的指令时,CPU会将线性地址转换为物理地址,然后找到真正的物理地址取出数据。其转换方式有两种,一种是10-10-12分页方式,一种是2-9-9-12方式。
2.设置我们虚拟机的系统为10-10-12分页方式并重启
进入我们虚拟机的C盘下有一个boot.ini的隐藏文件(如果有只读属性改不了先去掉只读属性),用记事本打开。将我们调试的启动项中的noexcute=optin中的noexcute去掉no,例如原为:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=“Microsoft Windows XP Professional” /noexecute=optin /fastdetect /noexecute=alwaysoff /debug /debugport=COM1: /baudrate=115200
改为:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=“Microsoft Windows XP Professional” /execute=optin /fastdetect /noexecute=alwaysoff /debug /debugport=COM1: /baudrate=115200
然后重启即可。
3.下面我们通过一个实验来了解如何通过一个线性地址找到一个物理地址
首先我们在虚拟机中打开记事本,然后在记事本中写入字符串"Hello World",如下图:
在这里插入图片描述
我们这个Hello World一定在这个记事本的4G虚拟地址空间中,我们要首先找到它在虚拟地址空间中的地址,这时我们需要借助一个免费开源工具来搜索字符串的虚拟地址,工具下载地址:https://www.cheatengine.org/ 安装太简单就不说了,使用如下图搜索:
在这里插入图片描述
我们区分不出哪个是,可以改一下值,然后再看哪个字变了,来确定地址,如将H改为a,如下图:
在这里插入图片描述
这样我们就能确定这里的地址是:
0x000AA970
接下来我们将这个地址转换成二进制:
0000 0000 0000 1010 1010 1001 0111 0000
接下来我们将其按10-10-12拆分得:
高十位:0000 0000 00
中间十位:00 1010 1010
底十二位:1001 0111 0000
每个进程都有一个CR3的值,CR3指向一个物理页一共4096字节,如下图:
在这里插入图片描述
我们拆完以后CPU首先去找CR3寄存器,CR3寄存器是一个唯一存储物理地址的寄存器,CR3中存了一个值,这个值指向一个物理页,这个也有4096个字节,也就是他的第一级,第一部分分的高十位就是确定这个地址在第一级的哪个位置,第二个十位就是确定在第二级的哪个位置,最后12位就是确定在4096个字节的哪个地址,4096 = 2 ^ 12;第一级中每个成员是4个字节,4096个字节可以存放1024 = 2 ^ 10个地址,同样第二级也是一样。
接下来我们在WinDbg中用!process 0 0找到notepad.exe的CR3值如下图:
在这里插入图片描述
接下来我们用!dd 2ccc9000 + 0查看该地址在第一级中的值
在这里插入图片描述
由于第一级中的地址后12位是属性位,且一个元素4个字节,所以我们查看第二级指令为!dd 2caeb000+AA*4(2A8),如下图:

在这里插入图片描述
最后在物理页中偏移后12位的值即970,用!db 2c9f6000+970命令查看该处内存如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/86650807
今日推荐