保护模式(五):10-10-12分页(一)
CR3-->PDT|PDE0|-->PTT0|PTE0|-->物理内存
|PDE1| |PTE1|
|PDE2| |PTE2|
将一个线性地址分为10,10,12三部分,分别为PDT,PTT,物理内存的偏移
如果为大页则分为10,22两部分,分别为PDT,物理内存的偏移
CR3-->PDT-->物理内存
实验一:直接修改物理内存
先在操作系统中改为10-10-12分页
修改boot文件中/noexecute=optin为/execute=optin
测试代码
#include "stdafx.h"
#include <windows.h>
//401020
void __declspec(naked)Test(){
__asm{
iretd
}
}
int main(int argc, char* argv[])
{
__asm{
//int 0x20
}
printf("%x\n",*(DWORD*)0x401020);
getchar();
printf("%x\n",*(DWORD*)0x401020);
getchar();
return 0;
}
//401020
//0000 0000 01 1*4
//00 0000 0001 1*4
//0000 0010 0000 20
查看CR3
!process 0 0
查看PDT
查看PTT
kd> !dd 030a3000+4 //067为PDE属性
查看物理内存
修改物理内存
!ed c5c0020 ffffffff
实验二:为0地址挂物理页
测试代码
#include "stdafx.h"
#include <windows.h>
//401020
void __declspec(naked)Test(){
__asm{
iretd
}
}
int main(int argc, char* argv[])
{
__asm{
//int 0x20
}
getchar();
printf("%x\n",*(DWORD*)0x0);
getchar();
return 0;
}
0的PTE为0
挂一个物理页,这里用的401020处的