用于内存内省和逆向工程的虚拟机监控程序

这是一篇关于基于 Rust 的虚拟机监控程序设计与实现的文章,用于 Windows 系统的内存检查和逆向工程,主要内容总结如下:

  • 介绍:介绍了两个项目 - illusion-rs(基于 UEFI 的虚拟机监控程序)和 matrix-rs(基于 Windows 内核驱动的虚拟机监控程序),两者都利用扩展页表(EPT)实现隐秘的控制流重定向,且不修改客户机内存。还介绍了影子页、EPT 挂钩等概念。
  • illusion-rs 详解

    • 初始化与设置:通过拦截IA32_LSTARMSR 来确定 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 进行重定向,处理断点异常,通过跳板逻辑返回原始函数。
  • 挂钩重定向技术:比较了INT3VMCALLJMP三种挂钩重定向技术,INT3引入两次 VM 退出,JMP可减少 VM 退出但代码较大,Matrix 支持JMP钩子但默认使用INT3
  • 虚拟机监控程序检测向量:列举了一些已知的虚拟机监控程序检测方法,包括写检查、RDTSC定时检查等。
  • 附录

    • 客户机辅助挂钩模型:早期illusion-rs实现过客户机辅助挂钩模型,但后来被更简单的 EPT 阴影和MTF单步恢复模型取代。比较了matrix-rs(共享 EPT 跨所有逻辑处理器)和illusion-rs(每个逻辑处理器的 EPT 与 MTF)的优缺点。
  • 结论:展示了如何使用 EPT 实现隐秘的内核检查和函数挂钩,两种虚拟机监控程序示例均为开源且可用于实验,还提到了一些相关的文章、工具和研究参考。

总体而言,文章提供了基于 Rust 的虚拟机监控程序的实践示例和技术细节,探讨了 EPT 挂钩在内存检查和逆向工程中的应用及相关技术挑战。

阅读 13
0 条评论