确定何时在虚拟机中运行

时间:2009-04-22 23:51:13

标签: delphi vmware virtualization virtualbox virtual-pc

应用程序是否有官方方式来确定它是在VMWare还是Virtual PC中运行(或者微软现在正在调用它)?我见过的代码通常是在特定版本的VMWare或Virtual PC中利用一些奇怪的行为副作用的黑客。

理想情况下是Delphi代码,但如果您可以链接到官方解释,那么我相信我可以将其转换。

10 个答案:

答案 0 :(得分:34)

我去年就此撰写了一系列文章,附有源代码。 VMware和Wine检测为here。 Virtual PC为here。所有这三个都具有非常铁的检测,因为有记录的管理程序回调(在Wine的情况下,标准DLL的扩展)。我在评论部分放了一个未经测试的VirtualBox检测器(没有安装它来测试)。使用回调也可以检测到Parallels,但我没有安装它。文档的链接(由于它来自一个专注于漏洞利用的安全研究人员,因此很差)但如果您安装并且感兴趣,请找到here。还有一个PPT here,其中包含有关检测Sandbox,Bochs和Xen的一些信息。不是很多代码,但如果你必须检测它们,它可能会给你一个起点。

答案 1 :(得分:5)

代码项目显示了Detect if your program is running inside a Virtual Machine的一种方式,详细介绍了如何实现它以便更好地理解

答案 2 :(得分:2)

我认为最好的方法是检查硬件配置文件。虚拟化硬件通常使用部分公司名称。如果您在Virtual PC中检查主板描述,您会注意到它是由“Microsoft Corporation”制作的。同样在VMWare中,您的以太网适配器将以VMNet为前缀。

答案 3 :(得分:2)

SysInternals论坛上的

This thread有几个答案(当然是在Delphi中),包括一个IsVM函数。我已经在VMWare XP和Vista上托管的XP和Win2003上进行了测试,效果很好。

答案 4 :(得分:1)

这里有一个WMI方式: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx

我已经在Virtual PC上运行的XP图像中进行了双重检查,他们正在测试的值仍然相同。我不保证其他VM会在这里返回,但是......

我实际上有一个几年前写的Delphi程序来获取一个列表并使用WMI更改默认打印机,而不需要第三方组件或类似的东西。如果您不习惯使用Delphi中的WMI,我可以向您发送一份副本,以便您可以使用它(但它不一定与Unicode兼容,但对我来说升级它应该不会太难如果需要)。

答案 5 :(得分:1)

我使用RedPill方法(翻译成Delphi,但代码并不难理解),这种方法效果相当好。我还使用WMI调用进行了一些额外的检查,以获取网络适配器供应商名称和版权等内容,但这是用于检测特定版本的Virtual PC。

我对RedPill方法的理解是它应该根据其工作方式的性质来工作和检测所有虚拟机。由于Windows 7中的Windows新功能可以配置为在Windows 7中无缝地运行Windows XP副本中的选定程序,因此可能会产生误报。

答案 6 :(得分:1)

我只是看着MAC地址好运,因为所有制造商都给了一个区块,前3个部分是独一无二的。

//look at the MAC address and determine if it's a Virtual Machine
$temp = preg_split("/\s+/",exec("/sbin/ifconfig -a eth0 2>&1 | /bin/grep HWaddr"), -1, PREG_SPLIT_NO_EMPTY);
//Virtual Box MACs all start with '08:00:27:xx:xx:xx'
if (strpos($temp[4], '08:00:27') !== false) $_SESSION['DEVELOPMENT'] = true;  

答案 7 :(得分:1)

确定机器是物理机还是VM

dmidecode | egrep -i 'manufacturer|product'

如果未找到dmidecode命令,则安装相应的rpm。

这是在EXSI,VMWARE和hyperv机器下测试的。

答案 8 :(得分:0)

如果您希望通常检测是否存在任何类型的虚拟化,则最好分析性能特征。采取虚拟化速度明显较慢的东西(例如像炸弹这样的MMU繁重工作负载)并将其与正常的CPU绑定用户空间应用程序对抗。从您可以轻松判断的比例来看。

如果您只关心某些VMM,那么最简单的就是寻找他们的硬件 - 即VMware PCI设备:

00:07.3 Bridge:Intel Corporation 82371AB / EB / MB PIIX4 ACPI(rev 08)     子系统:VMware Inc虚拟机芯片组

15ad:1976

供应商价值为'15ad'

还有一些特定的后门端口可以在各种版本的各种VMM中运行。 SIDT技巧也很好,但是如果VMM不在他的代码正在检查的列表中呢?

答案 9 :(得分:0)

dmidecode -s system-product-name

在VirtualBox上测试,结果:

Virtualbox