虛擬機的系統和程序能判斷出自己是運行在虛擬機上的么?


如果只針對某一款特定的虛擬機,肯定有一些辦法,比如VMWare或者VirtualBox,這些虛擬機都比較好檢查。

但是沒有一種通用的方法。

尤其是那種指令級翻譯的,比如bochs,能在非x86平台模擬x86指令(這類虛擬機可以被稱為emulator),一般的檢查方法就很難檢查到了。

所以,方法肯定有,但通用的肯定沒有,要知道,虛擬機沒有上百種也有幾十種了。(http://en.wikipedia.org/wiki/Comparison_of_platform_virtualization_software)


有一種反破解 叫做虛擬機檢測

忽然發現看雪論壇好像掛了?

上快照吧

【原創】虛擬機檢測技術剖析


須要給它吃紅膠囊!

===============

理論上通用的虛擬機檢測方法是不存在的,只要虛擬做的足夠完美。就是用圖靈機模擬圖靈機而已,本質上不存在差別。一般所說的虛擬機檢測是針對特定虛擬機實現而做的,實際上不只是檢測,利用漏洞直接跳出虛擬機在宿主機執行代碼都是可能的。


可以啊。Anti-VM在malware(惡意軟體)裡面是非常常用的技巧,推薦一下Michael Sikorski和Andrew Honig出的Practical Malware Analysis這本書,第17章全是Anti-VM。匿名用戶的答案里的鏈接也很不錯。如果懶得自己寫的話可以試一下trapkit.de - ScoopyNG 這個軟體……反VM套裝,你值得擁有。


答案是能。

對於full virtualization的硬體虛擬化,eg.KVM/QEMU,惡意軟體檢測虛擬機環境的存在的方法可以分成以下幾種:

1.CPU Semantic Attack:有些指令在物理機上和在虛擬機上執行的結果不同;

2.Timing Attacks:由於虛擬機要模擬物理機,儘管使用了一些硬體加速的方案,仍然與在宿主機上執行有一定的差距,惡意軟體可以通過比較benchmark在實際機器與虛擬機上的運行時間;

3.String Attack:就是樓上@yegle說的「檢測顯卡、網卡的廠商信息」;

對於2.的防禦可以用欺騙虛擬機時鐘的方法,3.就更好防禦了,目前來說最難的是1的防禦,目前學術上有些文章是關於檢測哪些cpu指令導致semantic attack。

參考:https://www.usenix.org/conference/usenixsecurity14


虛擬機也有很多種,paravirtualization就是明顯的「讓內核知道自己是被虛擬的」的類型。

即使是full virtualization,這種虛擬機的主要用途還是工業用,所以必然會留下與宿主機交互的介面,虛擬機內的用戶態程序可以通過這些介面與宿主機進行交互。

常用虛擬機品牌就那麼幾種,想做檢測還是很容易的。最簡單的做法,檢測一下系統網卡、顯卡的驅動廠商,如果是Oracle、VMware,就差不多可以確定了。其次是看網卡Mac地址,如果沒做修改的話可以從MAC地址反查vendor,得到虛擬網卡驅動的廠商。

高端一點的做法就複雜了。比如說測試虛擬機的3D性能(基本很爛,瀏覽器用JS做圖看刷新率),以及看顯示器的顯示解析度(不是800*600之類標準解析度的話很有可能是虛擬機)。這些都是side channel來推測,如果能直接在系統里跑原生程序比如說能跑個java applet那就能幾乎100%確認是不是虛擬機了。


當然能。虛擬機經常會虛擬一個特別的主板。

實際上,Debian在安裝系統的時候,就會發現是否運行在virtualbox里,然後會自動安裝virtualbox的特別驅動。


如果我是一個Java程序,我不用判斷就知道自己運行在虛擬機里


可以,有些Linux會在啟動時檢查是否在虛擬機中,比如我正在用的backbox


推薦閱讀:

Mac OS X Lion 允許在虛擬機中運行多個虛擬 OS X 版本的功能為什麼僅向 Mac OS X Server 開放?
為什麼windows下使用虛擬機裝mac非常卡,而在mac下使用虛擬機裝mac卻非常流暢?
VMware虛擬機的實現是什麼原理?如何理解虛擬這個詞?
VMware Fusion和Parallels Desktop哪個更適合開發人員?

TAG:MicrosoftWindows | Linux | 虛擬機 | VMware威睿 |