1、物理页属性
物理页属性 = PDE属性 & PTE属性
2、P位控制物理页是否可以访问,P位为0则不可以访问,如上篇我们看到的PDE和PTE最后一位十六进制很多是7,对应二进制111,所以是可以访问的
3、R/W位为读写位,为1表示可读可写,为0表示只读
下面我们来做一个修改C语言中常量区的值的实验来体会一下读写位。
#include <stdio.h>
int main()
{
char* str = "Hello World";
int dwVal;
printf("线性地址:%x", str);
getchar();
dwVal = (int)str;
*(char*)dwVal = 'M';
printf("修改后的值为:%s", str);
return 0;
}
我们首先直接执行该程序报如下错误:
接下来我们修改程序中改地址的R/W位,来看一下结果,首先我们运行程序到如下图停下:
接下来我们用Windbg修改属性位:
! process 0 0
!dd 2dda1004 这里我们看到PDE还是可读可写的,这里就不用改
!dd 2de69080 这里我们看到PTE为可读不可写,所以我们需要把这里改成可读可写,完成我们的写操作
!ed 2de69080 2a30d027
!dd 2de69080
修改并查看是否修改成功
运行虚拟机
切换到虚拟机中回车继续执行程序,得到如下结果,我们的修改成功了:
可见限制我们修改的是PTE属性,并不是VC6