保护模式TLB

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表:
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值