如何识别我们正在VM下运行?

时间:2020-03-05 18:46:26  来源:igfitidea点击:

有没有一种方法可以从VM内识别代码是否在VM内运行?

我猜大概有一些简单的方法可以识别特定的VM系统,特别是如果VM已安装了提供程序的扩展名(例如VirtualBox或者VMWare)。但是,是否有一种通用方法可以确定我们不是直接在CPU上运行?

解决方案

回答

在大多数情况下,我们不应该尝试这样做。除非在某些特定情况下,否则我们不必在乎是否有人在VM中运行代码。

如果需要,在Linux中,最常见的方法是查看/ sys / devices / virtual / dmi / id / product_name,它将列出大多数实际系统上的笔记本电脑/主板的名称,以及大多数系统上的管理程序。虚拟系统。 dmidecode | grep Product是另一种常见的方法,但是我认为这需要root访问。

回答

如果VM能够很好地完成工作,则客户端应该看不到正在对其进行虚拟化。但是,可以看看其他线索。

我可以想象,寻找特定于VM环境的已知驱动程序或者软件将是最好的方法。

例如,在运行Windows的VMWare客户端上,vmxnet.sys将是网络驱动程序,显示为VMware加速的AMD PCNet适配器。

回答

一个很好的例子是,显然是在对主板制造商进行WMI查询,如果返回" Microsoft",则表示我们在VM中。以为我相信这仅适用于VMWare。每种VM主机软件可能有不同的判断方法。

本文http://blogs.technet.com/jhoward/archive/2005/07/26/407958.aspx上有一些不错的建议,并提供了一些链接来检测我们是否在VM中(VMWare和VirtualPC位于至少)。

回答

一种更经验的方法是检查已知的VM设备驱动程序。我们可以编写WMI查询来定位,例如,VMware显示适配器,磁盘驱动器,网络适配器等。如果我们只需要担心环境中已知的VM主机类型,那么这将是合适的。这是在Perl中执行此操作的示例,可以将其移植到我们选择的语言中。

回答

通过查看网络连接的MAC地址,我们也许可以识别我们是否在虚拟机中。例如,Xen通常建议使用特定范围的地址00:16:3e:xx:xx:xx。

这不能保证,因为这取决于系统管理员来指定他们喜欢的MAC地址。

回答

我曾经遇到一个汇编代码片段,该片段告诉我们我们是否在VM中。...我用Google搜索,但找不到原始文章。

我确实发现了这一点:检测程序是否在虚拟机中运行。

希望能帮助到你。

回答

关于此的大量研究致力于检测所谓的"蓝色药丸"攻击,即恶意的管理程序正在积极尝试逃避检测。

检测VM的经典技巧是填充ITLB,运行必须虚拟化的指令(当它将对虚拟机管理程序的控制权交给虚拟机时,必须清除此类处理器状态),然后运行更多代码以检测ITLB是否仍在填充。它的第一篇论文位于这里,研究人员的博客和替代Wayback Machine对该博客文章的链接进行了相当丰富的解释(图像已损坏)。

对此的讨论的底线是,总有一种方法可以检测到恶意的虚拟机管理程序,而检测未隐藏的虚拟机管理程序要简单得多。

回答

红帽有一个程序可以检测正在运行哪个(如果有)虚拟化产品:virt-what

从长远来看,使用这种第三方维护的工具比尝试使用自己的检测逻辑(这是更长的眼光(针对更多的虚拟化产品进行测试)等)是一种更好的策略。

回答

这取决于我们所追求的:

  • 如果虚拟机不是故意向我们隐藏的,则可以使用一些已知的钩子。喜欢寻找VmWare驱动程序或者内存中是否存在某些字符串或者某些其他迹象。
  • 如果VM确实希望我们为它做一些特殊的事情,它将有一些明显的挂钩,例如修改处理器的ID或者添加一些我们可以访问以检测它的特殊寄存器。或者在内存中已知位置放置一个特殊设备(假定我们可以原始访问世界的物理内存空间)。注意,IBM Power6和Sun UltraSparc T1 / T2之类的现代机器设计总是设计为运行虚拟机监控程序,而不是直接在原始硬件上运行。操作系统使用的"硬件"接口实际上是虚拟机管理程序软件层的接口,无法绕开它。在这种情况下,检测是微不足道的,因为它是恒定的"是"。对于所有负担得起费用的计算机系统来说,这是未来的可能方向,例如,看一下Freescale QorIQ P4080芯片等最新设计的支持(www.freescale.com/qoriq)。
  • 如果虚拟机是有意试图隐藏的,而我们正在追逐它的存在,那它是一种猫捉老鼠的游戏,其中,虚拟机的定时干扰和不同的性能特征几乎总是会把它丢掉。显然,这取决于VM的实现方式以及体系结构中有多少硬件支持(我认为zSeries大型机比常规的x86更好地隐藏了特定OS下的VM或者VM堆栈的存在)例如,机器)。有关此主题的一些讨论,请参见http://jakob.engbloms.se/archives/97. 可以尝试将其隐藏为VM,但是如果尝试足够的努力,检测很可能总是会获胜。

回答

TrapKIT提供了ScoopyNG(一种用于VMware识别的工具),它试图解决规避技术,但不一定要针对VMware以外的任何虚拟化软件。源代码和二进制文件均可用。