出處:
最近在網絡上看到有人提出一個有趣的問題:程序能否知道自己是在虛擬機中運行的?如果能虛擬機加載exe文件教程,是怎么做到的?
之前并沒有深入考慮過這個問題 , 不過我知道這確實是可能的 。比如說,國內比較有知名度的深度操作系統在安裝時就會檢查自己所在的運行環境,如果發現是從虛擬機運行的,就會主動關閉一些比較消耗資源的動畫與特效 。
除此之外,也聽說過這樣一種說法:對于某些來源不明、可能攜帶病毒或有流氓行為 , 但仍然有用處的軟件,部分高級用戶會在虛擬機里安裝它們 , 以防止它們影響實際的系統 。后來這些流氓軟件的開發者也學乖了,如果發現自己是從虛擬機中運行的,就可以推斷出系統用戶可能屬于那種警覺性比較高的人,也有可能通過一些技術手段去觀測程序的行為 , 所以這些流氓軟件在虛擬機中反而表現得比較“老實” 。當然,這只是聽說,我并沒有實際驗證過 。
既然知道這是可行的 , 接下來的問題就是:如何辦到?我們已經看到深度操作系統有檢查虛擬機的功能,并且它也是開源的,我們不妨看看它是如何實現的 。
【如何檢測程序運行在虛擬機中?】

文章插圖

文章插圖
一番查找之后,我在 — 項目中發現了具體代碼:
這個方法非常簡單,相信你即便不熟悉 C++ 或者 Qt 也很容易看明白:運行 cat /proc/,輸出結果如果包含字樣,就說明程序是運行在虛擬機中 。顯然這是一個系統級別的虛擬文件,也就是說 , Linux 已經幫助我們實現了這個功能 。你可以去命令行自己運行一下試試看 。因為輸出內容很長,要防止看花眼虛擬機加載exe文件教程 , 最好用期望的結果去過濾一下:
cat /proc/cpuinfo | grep hypervisor以上是檢測虛擬機最簡單、不需要其他外部依賴的辦法 。當然,除此之外還有很多其他方法,總體說來 , 不外乎這么幾種思路:
如果你不喜歡前述方法的話,這里有一篇老外寫的較為全面的文章 , 總結了判斷虛擬機的 10 種不同方法 。這些方法大多走的用硬件信息的路子,其中有些依賴于特定的系統命令,在實際使用中應該結合 Linux 發行版的具體情況來選擇 。如果你仔細看過上面的代碼注釋 , 應該會發現深度的開發者也考慮到了調用外部命令(以及 virt-what 都是該文章提到過的方法),但最終還是選擇了第一種方式 。當然 , 這個實現以后也可能會改變 。
本文到此結束,希望對大家有所幫助 。
- 如何判斷自己的電腦是否有病毒?
- 面對一個習慣說謊的人,該如何與之溝通?如何才能讓他不說謊?
- 大學生如何建立社交形象?學會這三點人際交往不再困難
- 從心理學角度探討如何進行因材施教?
- 如何做好孩子心理疏導教育?
- 如何看待買了Mac,卻給Mac安裝了Windows這種行為?
- Win10學院:如何修復0xC000021A藍屏錯誤
- 如何幫助孩子戰勝焦慮和恐懼?
- 如何穩定新入園幼兒的情緒?
- 多核系統、虛擬機監控程序和多核框架
