低12位是权限位。低2位是RW位,RW=0表示只读,RW=1表示可读可写。
C语言中,修改常量区的字符串是不允许的,原因是物理页不具有写权限。
// PDE_PTE_P_RW.cpp : Defines the entry point for the console application. // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { char *str = "Hello World"; int addr = (int)str; printf("线性地址:0xx, 4*0x%x 4*0x%x 0x%x\n", addr, addr>>22,(addr>>12)&0x000002FF,addr&0x00000FFF); getchar(); // 修改 PDE PTE 的 RW 位为1,使物理页可读可写 str[4] = ' '; printf("修改后:%s\n", str); return 0; }我在代码里已经按10-10-12模式拆好了线性地址,现在只要在windbg中找到PDE和PTE,将低2位改成1即可。
查CR3 !process 0 0 CR3=148af000
查PDE !dd 148af000+4 PDE=19aef067
查PTE !dd 19aef000+4*15 PTE=00c18025
查物理地址 !db 00c18000+818
确定没找错,然后观察发现PTE的RW=0,改成1就好了: !ed 19aef054 00c18027
执行剩下的代码:
修改成功。