2012-02-28 147 views
2

在我上次面试的一次面试中,我被问到一个问题,直到现在我甚至都没有找到解决问题的线索。承认虚拟环境

因为这是非常有趣的问题我想也许这里有人会有一个想法。

退出简单问题: “建议构建应用程序的方法,以便能够识别它是否在虚拟机上运行。” (虚拟机不是指像CLR或JVM之类的东西,而是指可以使用VMware构建的完全虚拟化环境)

任何想法?

+1

您确定这不表示VMware? Java应用程序只能在JVM内部运行(对于C#/ CLR也是如此)。 – Groo 2012-02-28 09:55:27

+0

对不起,我修正了它 – MoShe 2012-02-28 11:16:28

+0

我对你为什么要检测这个问题背后的原因感兴趣。 – CodeCaster 2012-02-28 11:34:37

回答

4

看看Thwarting Virtual Machine Detection,如何做相反的(停止应用程序检测,它是在虚拟机上,以防止恶意程序更改其行为运行)介绍

此演示文稿中列出的许多那通常是用来检测虚拟机环境不同的机制:

  • 看在操作系统(如注册表,文件系统)的“搬弄是非”的迹象,这是一个虚拟机(与VMware引用是一个死亡赠品)
  • Loo k在关键内存结构(例如IDT)被放置在内存中 - 通常情况下,虚拟机上的内存高于物理机器。
  • 寻找特定于虚拟机的虚拟硬件(如网络适配器或USB控制器)
  • 寻找时钟与主机同步的异常情况。
  • 查找特定的VM处理器的功能 - 有些虚拟机引进超出标准的x86指令集的其他机器语言指令(像客人到主机通信的东西)

最终却没有100%可靠以检测您是否在虚拟机上运行 - 如果目标是提供完全无法检测的环境,那么可以“固定”这些机制中的每一个,以便VM完全无法检测到。

+0

我还看到了直接从处理器缓存,分支预测和其他难以虚拟化的信息中获取数据的实例,以便检测指示虚拟化的异常情况。基本上,虚拟化是虚拟化和检测之间的军备竞赛。 – adelphus 2012-02-28 12:54:54