Intel VT学习笔记(九)—— EPT应用示例

本文介绍了如何利用Intel VT技术中的EPT(Extended Page Tables)进行内存保护,通过设置EPT页表禁止对特定物理地址的读写,仅允许执行。在遇到EPT violation VM-Exit事件时,根据退出码和访问权限动态替换页面,实现对Guest行为的监控。通过示例代码展示了如何分配假页面并在读/写时替换,以及在执行时恢复真实页面。
摘要由CSDN通过智能技术生成

Intel VT学习笔记(九)—— EPT应用示例

内存保护

描述:尝试使用EPT将一块特定的物理内存保护起来。

先来选择一块物理地址,那么这里就跟周壑老师一样,选择「Page Fault」函数所在的物理地址。

首先使用PCHunter看一下虚拟地址是多少:
在这里插入图片描述
然后用WinDbg直接查看对应的物理地址:
在这里插入图片描述
可以看到「Page Fault」函数的物理地址是0x541450,即所属的物理页为0x541000。

那么,能不能让Guest能够执行它,但是不能够对它读写呢?

这个是不能随便设置的,需要看系统是否支持。(通过检测IA32_VMX_EPT_VPID_CAP MSR,具体参考Intel手册卷3附录A.10)
在这里插入图片描述
只有当这个IA32_VMX_EPT_VPID_CAP MSR的第0位为1时,才支持将EPT物理页面设置为可执行,但不可读写的权限(在笔者的环境中是支持的)。
在这里插入图片描述

代码实现

if (0x541000 == *ept_PT & 0xfffff000)   //寻找Page Fault函数所在的物理页
{
    *ept_PT &= 0xfffffff4;      //去除可读、可写的权限
}

运行结果
在这里插入图片描述
此时能够成功开启VT,并且系统能够正常运行。

那么来查看「Page Fault」函数的反汇编试试:
在这里插入图片描述
在这里插入图片描述
产生了一个VM-Exit事件,退出码为0x30,对应的含义为「EPT violation」,表示EPT不允许Guest访问该页面。

EPT violation

描述:当EPT模式下访问物理内存(读、写、执行)失败时,会导致VM-Exit,退出码为0x30,即EPT violation。

可以在Host中获取具体的信息,然后进行相应的处理。

EPT violation的具体信息包含的含义如下(参考Intel开发手册卷3表27-7):
在这里插入图片描述
可以通过该退出码检测Guest的行为,如果是读/写的时候,返回一个假页面给Guest;如果是执行时,返回一个真页面。

代码实现

//ept.c
...
ULONG64 fake_page_PA;				//假页面
ULONG64* hook_ept_PT;				//用于替换页面

static void AllocateFakePage()
{
    PVOID page = AllocateOnePage();
    fake_page_PA = MmGetPhysicalAddress(page).QuadPart;
}
...
if (0x541000 == (*ept_PT & 0xfffff000))   //寻找Page Fault函数所在的物理页
{
    AllocateFakePage();					//分配一个假页面
    *ept_PT &= 0xfffffff4;      //真页面去除可读、可写的权限
    hook_ept_PT = ept_PT;
}
...
//exithandler.c
...
extern ULONG64 fake_page_PA;
extern ULONG64* hook_ept_PT;

void HandleEptViolation()
{
	ULONG ExitQualification;

	ExitQualification = Vmx_VmRead(EXIT_QUALIFICATION);

	//判断访问权限,如果是读/写,就给一个假页面,如果是执行,就给一个真页面
	if (ExitQualification & 3)   // 读/写
	{
		*hook_ept_PT = fake_page_PA | 0x33;	//给假页面,权限为读/写
	}
	else     // 执行
	{
		*hook_ept_PT = 0x541000 | 0x34;		//给真页面,权限为执行
	}
}
...
case EXIT_REASON_EPT_VIOLATION:
		ExitInstructionLength = 0;		//将指令长度改为0,表示不跳过指令
		HandleEptViolation();					//处理
		break;
...

运行结果
在这里插入图片描述
可以看到,此时读取「Page Fault」函数的具体代码时,返回的内容全是0,因为在读/写时,Host挂入了一个假页面。

并且PCHunter将这个页面的所有函数都认定为被Inline Hook了:
在这里插入图片描述
那么我们的目的也就达到了。

关于VT,笔者暂时先学习到这里,不得不说收获了很多知识,感觉VT能做的事情远不止如此,等有时间再深入研究一番。

参考资料

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Intel VT-x/EPT是英特尔虚拟化技术的一种扩展,它为处理器提供了硬件级别的虚拟化支持。 VT-x代表Virtualization Technology,它是一种硬件支持的虚拟化技术。在没有VT-x之前,虚拟化需要依赖于软件实现,因此效率较低。引入VT-x后,处理器能够直接支持虚拟化,从而提供更高的执行效率和更低的开销。VT-x能够支持将物理计算机分为多个虚拟机,并使其各自独立运行,互不干扰。虚拟机可以共享硬件资源,同时也能够在一台计算机上实现运行多个不同操作系统的功能。这种虚拟化技术广泛应用于云计算、服务器虚拟化等领域。 EPT代表Extended Page Tables,它是在VT-x的基础上的一种扩展,提供了更好的虚拟内存支持。在传统的虚拟化中,为了实现每个虚拟机拥有独立的内存空间而不互相干扰,需要利用软件在虚拟地址和物理地址之间进行转换,这会带来一定的性能开销。EPT通过引入一个额外的表格结构,将虚拟地址和物理地址的映射关系缓存在处理器的硬件内存管理单元中,从而实现了更快速的地址转换,提高了虚拟机的性能。 总之,Intel VT-x/EPT是一种基于硬件的虚拟化技术,它通过在处理器级别支持虚拟化,提供了更高效、更低开销的虚拟机运行环境。EPT则进一步优化了虚拟内存的管理,提高了虚拟机的性能。这些技术的应用使得虚拟化技术更加成熟和普及,并在云计算、服务器虚拟化等领域发挥着重要作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值