遇見你我該如何逃避你——反虛擬機技術概述

遇見你,我該如何逃避你?實際上我並想認識你。

“惡意代碼”是一個非常神祕的人,他最不想的就是被別人發現和了解,而“調試”和“虛擬機”是“惡意代碼”最不喜歡的倆個人,因爲他們總是能認出“惡意代碼”,並且還可以走進他的內心,瞭解“惡意代碼”行爲的原因。

“惡意代碼”不想他們倆個人認出來,所以就想,遇見他們該如何躲開他們,保護自己神祕的形象,基於這些原因,他練出了自己逃避方法——反虛擬機技術。

他的作戰計劃是這個樣子的:
如果“惡意代碼”檢測到自己遇見了“虛擬機”(在虛擬機裏運行),他就會裝作自己不是惡意代碼,例如去執行其他行爲啊,或者乾脆就不動了,停止運行。
這個計劃確實也有效果,“虛擬機”更難以去分析“惡意代碼”了。

“惡意代碼”和“虛擬機”的愛恨情仇,躲躲藏藏一直很精彩,可惜“虛擬機”同樣有着最普通主機的弱點,這意味着他也有被“惡意代碼”攻擊的意義。同時隨着虛擬化技術的發展,“虛擬機”更是垂垂老矣,出戰的機會更加少了。但之前和“惡意代碼”的故事還是非常精彩的,下面介紹相關的反虛擬機技術。

一、虛擬機的痕跡

“惡意代碼”善於隱藏,“虛擬機”善於發現他,但是“虛擬機”卻不善於隱藏自己,因此經常被“惡意代碼”發現,從而失去機會。

1.MAC地址:
虛擬網卡MAC地址的配置,前三個字節一般爲00:0C:29,一般情況下,可以查看虛擬網卡的MAC地址是否在WMware屬性範圍內。
2.基於主板序列號、主機型號、系統盤所在磁盤名稱等其他硬件信息
一般這些信息中包含虛擬機的信息。
3.根據當前進程信息
當進程中是否有Vmware的進程VMwareService.exe、VMwareTray.exe和VMwareUser、exe。
4.特定的文件夾或文件信息
通過查找磁盤中是否存在特定的文件夾或文件,判斷當前是否在虛擬機中。VMware虛擬機中通常會有路徑C:\ProgramFiles\VMware\VMware Tools\;VirtualBox 虛擬機中通常會有路徑 C:\Program
Files\Oracle\VirtualBox Guest Additions\。
5.註冊表痕跡
通過讀取主機具有虛擬機特性的註冊表位置來判斷是否處於虛擬機環境中。針對VMware可以判斷註冊表項HKEY_CLASSES_ROOT\Applications\VMwareHostOpen.exe;針對VirtualBox可以判斷註冊表項HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBoxGuest Additions。當然,註冊表中能被檢測出的位置很多,這裏只是舉個例子。
6.根據特定服務名
通過獲取主機當前具有VMware特性的服務信息,判斷當前主機是否爲虛擬機。在VMware中通常會存在VMware物理磁盤助手服務和VMware Tools服務等;在VirtualBox中通常會存在VirtualBox Guest Additions Service服務等。
7.根據時間差
由於在虛擬機中,代碼的運行速度通常不如真實主機。所以惡意代碼通過運行一段特定的代碼來比較這段代碼在虛擬機和真實主機之中的相對運行時間,以此來判斷是否處於虛擬機之中。

二、查找漏洞指令

“虛擬機”本身存在非常多的弱點(漏洞),這些弱點常常被“惡意代碼利用”。

虛擬機監視器監視虛擬機的運行,它運行在宿主操作系統,併爲客戶機操作系統提供一個完整的虛擬平臺。與此同時,虛擬機監視器也存在一些可以被惡意代碼探測到虛擬化的安全缺陷。

在內核模式下,VMware使用二進制翻譯技術進行指令的模擬。運行於內核態的某些特權指令被解釋和模擬,所以它們不在物理處理器上運行。
相反,在用戶模式下,代碼直接在處理器上運行,幾乎所有與硬件交互的指令,要麼是特權指令,要麼會產生內核態陷阱指令或中斷指令。

VMware截獲所有中斷並處理它們,以便虛擬機仍然認爲這是一個正常機器。然而在x86體系結構中,一些指令在獲取硬件相關的信息時並不產生異常,如sidt、sgdt、sldt、cpuid等等。爲了正確虛擬這些指令,VMware需要在所有指令上進行二進制翻譯,因此造成巨大的性能損失。

爲了避免執行全指令模擬造成的巨大性能損失,VMware允許一些特定指令在沒有正確虛擬化的前提下運行。最終,這意味着某些指令序列在VMware虛擬機而不是在物理機中運行時返回不同的結果。處理器使用某些關鍵的結構與表,它們會被加載與真實系統不同的偏移量,而這正是未進行全虛擬化的副作用。

中斷描述表(IDT)是CPU內部的一個數據結構,操作系統使用它來確保正確響應中斷和異常。在x86體系結構下,所有的內存獲取,或是通過全局描述表(GDT)獲得,或是通過本地描述表(LDT)獲得。這些表中包含段描述符,它們提供每一個段的詳細存取信息,其中包含段基地址類型、長度,以及存取權限等等。

IDT、GDT和LDT是CPU內部的寄存器,它們分別存放着各自表的基地址和大小。有三條敏感指令(sidt、sgdt和sldt)可以讀取這些表的位置,並且將相應的寄存器存入內存地址。因爲這些指令可以隨時被用戶態代碼調用,且不會產生陷阱,也未被VMware正確虛擬化,所以這些異常都可能被用來探測VMware的存在。

1.Red Pill反虛擬機技術
Red Pill是一種反虛擬機技術,通過運行sidt指令獲取IDTR寄存器的值。虛擬機監視器必須重新定位Guest系統的IDTR,來避免與Host系統的IDTR的衝突。
在虛擬機中運行sidt指令時,虛擬機監視器不會得到通知,所以會返回虛擬機的IDTR,Red Pill通過測試這種差異來探測VMware的使用。
2.No Pill技術
sgdt與sldt指令探測VMware的技術通常被稱爲No Pill。No Pill依賴於LDT結構由處理器分配,而不是由操作系統分配這個事實。
3.查詢IO通信端口
當前最流行的VMware技術當屬查詢IO通信端口。
VMware使用虛擬化IO端口完成宿主系統與虛擬機之間的通信,以便支持諸如複製和粘貼功能。這個端口可以被查詢,然後與一個神祕數進行比較,以便確認VMware的使用。
4.使用str指令
str指令用來從任務起存其中檢索段選擇子,段選擇子指向當前運行任務的任務狀態段(TSS)。
惡意代碼使用str指令探測虛擬機的存在,因爲這條指令返回的值,在虛擬機系統和宿主系統中可能不同。
5.反虛擬機的x86指令
sidt、sgdt、sldt、smsw、str、in(第二個操作數被設置爲VX)、cpuid
6.在IDA Pro中高亮顯示反虛擬機代碼

7.使用ScoopyNG
一種免費的VMware探測工具。

三、調整設置

挫敗VMware探測技術:修補代碼、卸載VMware Tools、修補VMware設置,以及使用多處理器機器。
VMware的.vmx文件中的未文檔化選項被用來戰勝反虛擬機技術。

四、虛擬機逃逸

VMware等軟件中或多或少都存在一些安全漏洞,可以利用這些漏洞使宿主操作系統崩潰或者是在宿主操作系統中運行代碼。當主機系統被感染後,一些公開可用的工具可以用來對VMware等軟件進行攻擊。

總結:
以上都是對於反虛擬機的技術大概介紹,可以讓我們對反虛擬機技術有一個大概的瞭解,知道有哪些反虛擬機技術,但是要想深入還得去看看每一技術的原理和實現。

參考資料:
《惡意代碼分析實戰》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章