这是一篇关于基于 Rust 的虚拟机监控程序设计与实现的文章,用于 Windows 系统的内存检查和逆向工程,主要内容总结如下:
- 介绍:介绍了两个项目 - illusion-rs(基于 UEFI 的虚拟机监控程序)和 matrix-rs(基于 Windows 内核驱动的虚拟机监控程序),两者都利用扩展页表(EPT)实现隐秘的控制流重定向,且不修改客户机内存。还介绍了影子页、EPT 挂钩等概念。
illusion-rs 详解:
- 初始化与设置:通过拦截
IA32_LSTAR
MSR 来确定 Windows 内核的物理和虚拟基地址及大小,在KeCompactServiceTable
调用后安装 EPT 挂钩,以确保 SSDT 已初始化。 - EPT 挂钩机制:使用单个 EPT per-logical-processor 来影子和改变客户机执行路径,通过
CPUID
指令触发挂钩安装,manage_kernel_ept_hook
函数管理 EPT 挂钩的安装和移除,包括映射大页、克隆代码、安装内联挂钩、撤销执行权限等步骤。 - 执行追踪与控制:通过用户模式的
CPUID
超调用实时切换内核挂钩,演示了 EPT 挂钩的实际效果,包括在 WinDbg 中的调试输出等。
- 初始化与设置:通过拦截
matrix-rs 详解:
- 初始化与准备:作为 Windows 驱动程序加载,初始化具有全读写执行权限的两个独立 EPT 上下文(主 EPT 和次 EPT),准备挂钩函数并设置陷阱。
- 双 EPT 重映射:配置双 EPT 映射以支持影子执行,在主 EPT 中标记页面为只读,在次 EPT 中标记为只执行,并将页面重映射到包含内联挂钩和跳板逻辑的影子副本。
- 执行流程与处理:当客户机尝试执行标记为不可执行的页面时,触发 EPT 违例,切换到次 EPT 进行重定向,处理断点异常,通过跳板逻辑返回原始函数。
- 挂钩重定向技术:比较了
INT3
、VMCALL
和JMP
三种挂钩重定向技术,INT3
引入两次 VM 退出,JMP
可减少 VM 退出但代码较大,Matrix 支持JMP
钩子但默认使用INT3
。 - 虚拟机监控程序检测向量:列举了一些已知的虚拟机监控程序检测方法,包括写检查、
RDTSC
定时检查等。 附录:
- 客户机辅助挂钩模型:早期
illusion-rs
实现过客户机辅助挂钩模型,但后来被更简单的 EPT 阴影和MTF
单步恢复模型取代。比较了matrix-rs
(共享 EPT 跨所有逻辑处理器)和illusion-rs
(每个逻辑处理器的 EPT 与 MTF)的优缺点。
- 客户机辅助挂钩模型:早期
- 结论:展示了如何使用 EPT 实现隐秘的内核检查和函数挂钩,两种虚拟机监控程序示例均为开源且可用于实验,还提到了一些相关的文章、工具和研究参考。
总体而言,文章提供了基于 Rust 的虚拟机监控程序的实践示例和技术细节,探讨了 EPT 挂钩在内存检查和逆向工程中的应用及相关技术挑战。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。