10-10-12分页
练习1:体验TLB的存在
代码如下:
// TlbCase.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
//定义全局变量
unsigned int g_value=0;
//定义调用门函数
_declspec(naked) void test()
{
__asm
{
push 0x30;
pop fs;
pushad;
pushfd;
mov eax,0x600000;
mov ebx,0xc0000000;
shr eax,0x9;
and eax,0x7ffff8;
//find pte
mov edx,eax;
add edx,ebx;
mov edx,dword ptr ds:[edx];
mov dword ptr ds:[ebx],edx;
//给0地址写入一个值
mov dword ptr ds:[0],0x12345678;
mov eax,0x700000;
mov ebx,0xc0000000;
shr eax,0x9;
and eax,0x7ffff8;
//find pte
mov edx,eax;
add edx,ebx;
mov edx,dword ptr ds:[edx];
mov dword ptr ds:[ebx],edx;
//读取0地址
mov eax,dword ptr ds:[0];
mov g_value,eax;
popfd;
popad;
retf;
}
}
int main(int argc, char* argv[])
{
char buf[]={0,0,0,0,0x48,0};
//申请内存
void * p1 = VirtualAlloc((void*)0x600000,0x1000,MEM_COMMIT | MEM_RESERVE ,PAGE_EXECUTE_READWRITE);
void * p2 = VirtualAlloc((void*)0x700000,0x1000,MEM_COMMIT | MEM_RESERVE ,PAGE_EXECUTE_READWRITE);
if(p1 == NULL)
{
if(p2 != NULL) VirtualFree(p2,0x1000,MEM_COMMIT | MEM_RESERVE);
printf("virtual failed p1\n");
return 0;
}
if(p2 == NULL)
{
VirtualFree(p1,0x1000,MEM_COMMIT | MEM_RESERVE);
printf("virtual failed p2\n");
return 0;
}
*((unsigned int *)p1)=0x100;
*((unsigned int *)p2)=0x200;
printf("%X\n",test);
//eq 8003f048 0040ec00`0008100a
__asm
{
call fword ptr buf;
push 0x3b;
pop fs;
};
printf("%X\n",g_value);
VirtualFree(p1,0x1000,MEM_COMMIT | MEM_RESERVE);
VirtualFree(p2,0x1000,MEM_COMMIT | MEM_RESERVE);
return 0;
}
修改gdt表: