直接上代码
有一个问题,结束后电脑会蓝屏,各位大佬知道的评论区留言呗~~~谢谢哦
#include "stdafx.h"
#include <windows.h>
#include "stdlib.h"
DWORD* pPTE1=NULL;
DWORD* pPTE2=NULL;
DWORD firstValue = 0;
DWORD secondtValue = 0;
DWORD thirdValue = 0;
DWORD isflush = 0;
void __declspec(naked) function()
{
__asm
{
pushfd
pushad
//firstValue
mov eax,0x10000
mov eax,[eax]
mov firstValue,eax
}
//same PDE
//PTE
pPTE1=(DWORD*)(0xC0000000 + 0x1000 * 0 + 0x4 * 0x10);
pPTE2=(DWORD*)(0xC0000000 + 0x1000 * 0 + 0x4 * 0x20);
*pPTE1=*pPTE2;
__asm
{
//secondtValue
mov eax,0x10000
mov eax,[eax]
mov secondtValue,eax
mov eax,isflush
test eax,eax
jz end
//flush TLB
invlpg dword ptr ds:[0x10000]
end :
//thirdValue
mov eax,0x10000
mov eax,[eax]
mov thirdValue,eax
popad
popfd
retf
}
}
int main(int argc, char* argv[])
{
//malloc
LPVOID page1 = VirtualAlloc((LPVOID)0x10000,0x1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
LPVOID page2 = VirtualAlloc((LPVOID)0x20000,0x1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if (page1 == NULL || page2 == NULL)
{
printf("malloc error ~~");
return -1;
}
*(int*)page1 = 0x12345;
*(int*)page2 = 0x67890;
printf("flush TLB 0(false)/1(true)? : \n");
scanf("%d",&isflush);
const char buffer[6] = {0x0,0x0,0x0,0x0,0xb0,0x0};
__asm
{
call fword ptr [buffer]
}
printf("firstValue is : %08x \n",firstValue);
printf("secondtValue is : %08x \n",secondtValue);
printf("thirdValue is : %08x \n",thirdValue);
//free
VirtualFree(page1,0,MEM_FREE);
VirtualFree(page2,0,MEM_FREE);
system("pause");
return 0;
}
结果
不刷新的结果 :
结果
刷新的结果 :