为变量x再映射一个线性地址,并通过这个新的地址读取x的值
// PTEzuoye.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<stdio.h>
#include<windows.h>
int main() {
SetThreadAffinityMask(GetCurrentThread(), 1);
int x = 123;
printf("x的值是%x\n", &x);
//现在申请一个内存将内存的最后三位改成和x的一样,因为最后寻找物理页的时候最后三位是重点
//申请内存的函数VirtualAlloc,这个函数申请的内存是页对齐
int p = (int)VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
memset((int*)p, 0, 0x1000);
//现在将P的线性地址最后3为2改成和x的一样,这里先用与操作将最后三位置于0
p = p & 0xFFFFF000;
//现在将p最后三位改成和x一样,那么首先我们先将x的最后三位取出来
p = p | ((int) & x & 0x00000fff);//到这里就把p最后三位改成和x一样了
//那么接下来就是更改pte,pte需要去windbg里面更改
printf("新的线性地址p:%x\n", p);
getchar();//这里更改pte
//更改玩pte之后这里读取x的值
printf("读取的x的值是:%x\n", *(int*)p);
//这里还要利用新的线性地址进行x的写入
*(int*)p = 123321;
printf("新写入的x的值是:%x\n", x);
getchar();
VirtualFree((int*)p, 0x1000, MEM_DECOMMIT);
return 0;
}