保护模式阶段测试

第一题

#include <cstdio>
#include <windows.h>
DWORD gPDE = 0;
DWORD gPTE = 0;
char segment[] = {
    0,0,0,0,0x48,0 };

一个获取线性地址PDE和PTE的裸函数,利用带一个参数的调用门

void _declspec(naked) _stdcall
MyReadMemory() {
   
	_asm {
   
		int 3
		mov ecx,[esp+8]
		push 0x30
		pop fs
		pushad
		pushfd
		xor eax,eax
		mov eax,ecx
		shr eax,0x14
		and eax,0xffc
		sub eax,0x3fd00000
		mov eax,[eax]
		mov gPDE,eax
		xor eax,eax
		mov eax,ecx
		shr eax,0xa
		and eax,0x3ffffc
		sub eax,0x40000000
		mov eax,[eax]
		mov gPTE,eax
		popfd
		popad
		retf 4
	}
}

题目函数实现,其实没什么难度,就是在拷贝内存前判断一下地址是否,无效地址直接提示后返回即可,判断依据是PDE和PTE的低2位有效位,即P位和R/W位

BOOL ReadVirtualMemory(PVOID lineaddr, PVOID outbuf, UINT32 size) {
   
	DWORD PageOffset = (DWORD)lineaddr & 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值