軟件如何判斷自己運(yùn)行在虛擬機(jī)中?
時(shí)間:2024-01-02 02:12:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2024-01-02 02:12:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
軟件如何判斷自己運(yùn)行在虛擬機(jī)中?:關(guān)于這個(gè)問(wèn)題可以推薦篇論文
《Towards an Understanding of Anti-virtualization and Anti-debugging Behavior in Modern Malware》
--------PATCH----------
看到評(píng)論里說(shuō)例子太少,稍微補(bǔ)充一點(diǎn)。
首先是兩個(gè)工具
https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/checkvm/checkvm.chttp://www.trapkit.de/tools/scoopyng/checkvm和scoopyNG,都是針對(duì)VMware虛擬機(jī)的檢測(cè)工具。
各個(gè)檢測(cè)方法的例子補(bǔ)充下下面的分類當(dāng)中,不過(guò)有些例子可能只能在舊版本和特定廠商的虛擬機(jī)中起作用。
--------PATCH----------
有很多種不同的方法,我大致回憶一下:
前面就有回答提到過(guò),vbox和vmware這類的軟件都會(huì)在虛擬機(jī)中創(chuàng)建一些特定名稱的device和驅(qū)動(dòng),只要檢測(cè)到這些東西的存在就多半是虛擬機(jī)了。
e.g. 經(jīng)常配置VMware虛擬機(jī)的同學(xué)們肯定會(huì)注意到,安裝了VMware的Host與虛擬機(jī)內(nèi)部都會(huì)多出來(lái)兩個(gè)(虛擬)網(wǎng)卡設(shè)備:一個(gè)是VMnet1,使用Host Only的方式聯(lián)網(wǎng);一個(gè)是VMnet8,采用NAT的方式聯(lián)網(wǎng)。
類似的,還有Bus- Logic BT-958,VMware提供的SCSI驅(qū)動(dòng)報(bào)錯(cuò)中會(huì)出現(xiàn)這個(gè)設(shè)備名稱信息。
由于虛擬機(jī)實(shí)現(xiàn)的問(wèn)題,很多細(xì)節(jié)會(huì)與真實(shí)設(shè)備不同。比如某些特定指令的效果,再比如操作系統(tǒng)中某些特定功能的實(shí)現(xiàn)。
.e.g. IDT(Interrupt Descriptor Table)是Windows處理中斷時(shí)用于查找中斷處理程序的一塊內(nèi)存,為了隔離Host與Guest OS,虛擬機(jī)與宿主機(jī)的IDT在內(nèi)存當(dāng)中的地址是不同的,Red Pill這個(gè)工具就通過(guò)獲取IDT的地址來(lái)進(jìn)行區(qū)分,當(dāng)?shù)刂窞?xff開(kāi)頭時(shí)為真機(jī)、為0xe8開(kāi)頭時(shí)為虛擬機(jī)(32位系統(tǒng)上)。
一些機(jī)器碼中無(wú)效的指令(Invalid Opcode)被虛擬機(jī)使用作為后門(mén)以便于虛擬機(jī)的管理,因此通過(guò)執(zhí)行這些無(wú)效的指令、檢查是否觸發(fā)Exception的方法同樣可以識(shí)別虛擬機(jī)。比如VMware當(dāng)中的IN指令,在真機(jī)上不能在ring3下執(zhí)行,但虛擬機(jī)中可以用于與宿主機(jī)通信。
虛擬機(jī)上可能安裝有一些特定的軟件、運(yùn)行了一些特定的進(jìn)程或服務(wù)(比如VMware的vmtools)。
e.g. 如上面說(shuō)的,檢查VMware tools是否安裝在系統(tǒng)中。可以檢查注冊(cè)表項(xiàng)HKEY_CLASSES_ROOT/Installer/Products/C2A6F2EFE6910124C940B2B12CF170FE/ProductName,其值為"VMware Tools"
軟件模擬CPU執(zhí)行指令和直接硬件執(zhí)行的速度有數(shù)量級(jí)的差距,很有那么一些指令的執(zhí)行速度可以用于判斷是否在虛擬機(jī)中。
e.g. x86指令集中RDTSC這個(gè)指令可以用于獲得cpu啟動(dòng)以來(lái)的運(yùn)行周期數(shù),所以只要RDTSC一下,存結(jié)果,隨便執(zhí)行一個(gè)指令,再RDTSC一下,減一減,你就能獲得一個(gè)大致的指令執(zhí)行周期數(shù)的數(shù)據(jù)。這個(gè)數(shù)字很不精確,但前面已經(jīng)提到,虛擬機(jī)和真機(jī)上的執(zhí)行速度有數(shù)量級(jí)的差距,所以很容易看出區(qū)別——當(dāng)然也很容易弄錯(cuò)。