无论是PDEPTE还是PTE还是PDE在虚拟地址内都有一张线性的表里面存的PTEPDE都是PTE所以说,我们只需要改1024*1024个PTE的属性就行了,属性要改US位和G位才可以实现用户权限访问
#include "stdafx.h"
#include <windows.h>
DWORD dwPTE;
void __declspec(naked) test(){
__asm{
pushad;
pushfd;
//判断如果P位是0就不改
mov eax,[dwPTE];
test eax,1;
jz end;
xor eax,0x6;
and eax,0xeff;
mov [dwPTE],eax;
end:
popfd;
popad;
retf;
}
}
void CallGate(){
char buffer[6] = { 0,0,0,0,0x48,0x0};
//eq 80b99048 0040ec00`00081000
__asm{
call fword ptr[buffer];
}
}
void WriteSysMemory(){
dwPTE = 0xC0000000;
for(int i = 0; i < 0x100000; i++){
CallGate();
dwPTE += 8;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("%x\n",test);
CallGate();
printf("%x %x\n",*(PDWORD)0x80b99400,*((PDWORD)(0x80b99400 + 4)));
system("pause");
return 0;
}