2012-02-28 223 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