有没有办法从VM中识别您的代码在VM中运行?
我想有或多或少的简单方法来识别特定的VM系统,特别是如果VM安装了提供程序的扩展(例如VirtualBox或VMWare).但有没有一种通用的方法来确定您没有直接在CPU上运行?
很多关于此的研究致力于检测所谓的"蓝色药丸"攻击,即恶意的管理程序,它正在积极地试图逃避检测.
检测VM的经典技巧是填充ITLB,运行必须虚拟化的指令(当它控制管理程序时必须清除这样的处理器状态),然后再运行一些代码来检测ITLB是否仍然填充.关于它的第一篇论文就在这里,并且从研究人员的博客和另类Wayback Machine链接到博客文章(图像已破碎)的相当丰富的解释.
讨论的底线是始终有一种方法来检测恶意虚拟机管理程序,并且检测一个不想隐藏的虚拟机管理程序要简单得多.
红帽有一个程序,它检测它正在下运行它(如果有的话)的虚拟化产品:virt-what
.
使用第三方维护的工具,这是一个比尝试推出自己的检测逻辑更长远的策略:更多的眼睛(针对更多虚拟化产品进行测试)等.
更经验的方法是检查已知的VM设备驱动程序.您可以编写WMI查询来查找VMware显示适配器,磁盘驱动器,网络适配器等.如果您知道只需要担心环境中已知的VM主机类型,那么这将是合适的.这是在Perl中执行此操作的示例,可以将其移植到您选择的语言中.
这取决于您所追求的:
如果虚拟机不是故意向您隐藏,则可以使用一些已知的挂钩。喜欢寻找VmWare驱动程序或内存中是否存在某些字符串或某些其他迹象。
如果VM确实希望您为它做一些特殊的事情,它将有一些明显的挂钩,例如修改处理器的ID或添加一些您可以访问以检测它的特殊寄存器。或者是位于内存中已知位置的特殊设备(假定您可以原始访问世界的物理内存空间)。注意,诸如IBM Power6和Sun UltraSparc T1 / T2之类的现代机器设计总是设计为运行管理程序,而不是直接在原始硬件上运行。操作系统使用的“硬件”接口实际上是虚拟机管理程序软件层的接口,无法绕开它。在这种情况下,检测是微不足道的,因为它是恒定的“是”。对于所有负担得起的计算机系统来说,这是未来可能的方向,
如果虚拟机是有意试图隐藏的,而您正在追逐它的存在,那它是一种猫捉老鼠的游戏,其中,虚拟机的时序干扰和不同的性能特征几乎总是会把它丢掉。显然,这取决于VM的实现方式以及体系结构中有多少硬件支持(我认为zSeries大型机比常规的x86更好地隐藏了特定OS下的VM或VM堆栈的存在)例如,机器)。有关此主题的一些讨论,请参见http://jakob.engbloms.se/archives/97。可以尝试隐藏为VM,但是如果尝试足够努力,检测很可能总是会获胜。