虛擬機檢測技術剖析_第1頁
虛擬機檢測技術剖析_第2頁
虛擬機檢測技術剖析_第3頁
虛擬機檢測技術剖析_第4頁
虛擬機檢測技術剖析_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、虛擬機檢測技術剖析作者:riusksk (泉哥)主頁:前言在當今信息安全領域,特別是惡意軟件分析中,經(jīng)常需要利用到虛擬機技術,以提高病毒分析過程的安全性以及硬件資源的節(jié)約性,因此它在惡意軟件領域中是應用越來越來廣泛。這里我們所謂的虛擬機(Virtual Machine)是指通過軟件模擬的具有完整硬件系統(tǒng)功能的、運行在一個完全隔離環(huán)境中的完整計算機系統(tǒng)。通過虛擬機軟件(比如VMware,Virtual PC ,VirtualBox),你可以在一臺物理計算機上模擬出一臺或多臺虛擬的計算機,這些虛擬機完全就像真正的計算機那樣進行工作,例如你可以安裝操作系統(tǒng)、安裝應用程序、訪問網(wǎng)絡資源等等。攻擊者為了

2、提高惡意程序的隱蔽性以及破壞真實主機的成功率,他們都在惡意程序中加入檢測虛擬機的代碼,以判斷程序所處的運行環(huán)境。當發(fā)現(xiàn)程序處于虛擬機(特別是蜜罐系統(tǒng))中時,它就會改變操作行為或者中斷執(zhí)行,以此提高反病毒人員分析惡意軟件行為的難度。本文主要針對基于Intel CPU的虛擬環(huán)境VMware中的Windows XP SP3系統(tǒng)進行檢測分析,并列舉出當前常見的幾種虛擬機檢測方法。方法一:通過執(zhí)行特權指令來檢測虛擬機Vmware為真主機與虛擬機之間提供了相互溝通的通訊機制,它使用“IN”指令來讀取特定端口的數(shù)據(jù)以進行兩機通訊,但由于IN指令屬于特權指令,在處于保護模式下的真機上執(zhí)行此指令時,除非權限允許

3、,否則將會觸發(fā)類型為“EXCEPTION_PRIV_INSTRUCTION”的異常,而在虛擬機中并不會發(fā)生異常,在指定功能號0A(獲取VMware版本)的情況下,它會在EBX中返回其版本號“VMXH”;而當功能號為0x14時,可用于獲取VMware內(nèi)存大小,當大于0時則說明處于虛擬機中。VMDetect正是利用前一種方法來檢測VMware的存在,其檢測代碼分析如下:bool IsInsideVMWare() bool rc = true; _try _asm push edx push ecx push ebx mov eax, 'VMXh' mov ebx, 0 / 將ebx

4、設置為非幻數(shù)VMXH的其它值 mov ecx, 10 / 指定功能號,用于獲取VMWare版本,當它為0x14時用于獲取VMware內(nèi)存大小 mov edx, 'VX' / 端口號 in eax, dx / 從端口dx讀取VMware版本到eax/若上面指定功能號為0x14時,可通過判斷eax中的值是否大于0,若是則說明處于虛擬機中 cmp ebx, 'VMXh' / 判斷ebx中是否包含VMware版本VMXh,若是則在虛擬機中 setz rc / 設置返回值 pop ebx pop ecx pop edx _except(EXCEPTION_EXECUTE_

5、HANDLER) /如果未處于VMware中,則觸發(fā)此異常 rc = false; return rc;測試結果: 圖1如圖1所示,VMDetect成功檢測出VMWare的存在。方法二:利用IDT基址檢測虛擬機利用IDT基址檢測虛擬機的方法是一種通用方式,對VMware和Virtual PC均適用。中斷描述符表IDT(Interrupt Descriptor Table)用于查找處理中斷時所用的軟件函數(shù),它是一個由256項組成的數(shù)據(jù),其中每一中斷對應一項函數(shù)。為了讀取IDT基址,我們需要通過SIDT指令來讀取IDTR(中斷描述符表寄存器,用于IDT在內(nèi)存中的基址),SIDT指令是以如下格式來存

6、儲IDTR的內(nèi)容:typedef struct WORD IDTLimit;/ IDT的大小 WORD LowIDTbase;/ IDT的低位地址 WORD HiIDTbase;/ IDT的高位地址 IDTINFO;由于只存在一個IDTR,但又存在兩個操作系統(tǒng),即虛擬機系統(tǒng)和真主機系統(tǒng)。為了防止發(fā)生沖突,VMM(虛擬機監(jiān)控器)必須更改虛擬機中的IDT地址,利用真主機與虛擬機環(huán)境中執(zhí)行sidt指令的差異即可用于檢測虛擬機是否存在。著名的“紅丸”(redpill)正是利用此原理來檢測VMware的。Redpill作者在VMware上發(fā)現(xiàn)虛擬機系統(tǒng)上的IDT地址通常位于0xFFXXXXXX,而Vir

7、tual PC通常位于0xE8XXXXXX,而在真實主機上正如圖2所示都位于0x80xxxxxx。Redpill僅僅是通過判斷執(zhí)行SIDT指令后返回的第一字節(jié)是否大于0xD0,若是則說明它處于虛擬機,否則處于真實主機中。Redpill的源碼甚是精簡,源碼分析如下:#include <stdio.h>int main () unsigned char m2+4, rpill = "x0fx01x0dx00x00x00x00xc3"/相當于SIDTadrr,其中addr用于保存IDT地址 *(unsigned*)&rpill3) = (unsigned)m;

8、/將sidtaddr中的addr設為m的地址 (void(*)()&rpill)();/執(zhí)行SIDT指令,并將讀取后IDT地址保存在數(shù)組m中 printf ("idt base: %#xn", *(unsigned*)&m2); /由于前2字節(jié)為IDT大小,因此從m2開始即為IDT地址 if (m5>0xd0) printf ("Inside Matrix!n", m5); /當IDT基址大于0xd0xxxxxx時則說明程序處于VMware中 else printf ("Not in Matrix.n"); re

9、turn 0;測試結果如圖2所示: 圖2利用此IDT檢測的方法存在一個缺陷,由于IDT的值只針對處于正在運行的處理器而言,在單CPU中它是個常量,但當它處于多CPU時就可能會受到影響了,因為每個CPU都有其自己的IDT,這樣問題就自然而然的產(chǎn)生了。針對此問題,Offensive Computing組織成員提出了兩種應對方法,其中一種方法就是利用Redpill反復地在系統(tǒng)上循環(huán)執(zhí)行任務,以此構造出一張當前系統(tǒng)的IDT值變化統(tǒng)計圖,但這會增加CPU負擔;另一種方法就是windows API函數(shù)SetThreadAffinityMask()將線程限制在單處理器上執(zhí)行,當執(zhí)行此測試時只能準確地將線程執(zhí)

10、行環(huán)境限制在本地處理器,而對于將線程限制在VM處理器上就可能行不通了,因為VM是計劃在各處理器上運行的,VM線程在不同的處理器上執(zhí)行時,IDT值將會發(fā)生變化,因此此方法也是很少被使用的。為此,有人提出了使用LDT的檢測方法,它在具有多個CPU的環(huán)境下檢測虛擬機明顯優(yōu)于IDT檢測方法,該方法具體內(nèi)容參見下節(jié)內(nèi)容。方法三:利用LDT和GDT的檢測方法在 Intel® 64 and IA-32 Architecture Software Developers Manual Volume 3A: System Programming Guide第二章的Vol.3 2-5 一頁(我的Intel

11、開發(fā)手冊是2008版的)中對于LDT和GDT的描述如下(以下內(nèi)容為個人翻譯):在保護模式下,所有的內(nèi)存訪問都要通過全局描述符表(GDT)或者本地描述符表(LDT)才能進行。這些表包含有段描述符的調用入口。各個段描述符都包含有各段的基址,訪問權限,類型和使用信息,而且每個段描述符都擁有一個與之相匹配的段選擇子,各個段選擇子都為軟件程序提供一個GDT或LDT索引(與之相關聯(lián)的段描述符偏移量),一個全局/本地標志(決定段選擇子是指向GDT還是LDT),以及訪問權限信息。若想訪問段中的某一字節(jié),必須同時提供一個段選擇子和一個偏移量。段選擇子為段提供可訪問的段描述符地址(在GDT 或者LDT 中)。通過

12、段描述符,處理器從中獲取段在線性地址空間里的基址,而偏移量用于確定字節(jié)地址相對基址的位置。假定處理器在當前權限級別(CPL)可訪問這個段,那么通過這種機制就可以訪問在GDT 或LDT 中的各種有效代碼、數(shù)據(jù)或者堆棧段,這里的CPL是指當前可執(zhí)行代碼段的保護級別。GDT的線性基址被保存在GDT寄存器(GDTR)中,而LDT的線性基址被保存在LDT寄存器(LDTR)中。 由于虛擬機與真實主機中的GDT和LDT并不能相同,這與使用IDT的檢測方法一樣,因此虛擬機必須為它們提供一個“復制體”。關于GDT和LDT的基址可通過SGDT和SLDT指令獲取。虛擬機檢測工具Scoopy suite的作者Tobi

13、as Klein經(jīng)測試發(fā)現(xiàn),當LDT基址位于0x0000(只有兩字節(jié))時為真實主機,否則為虛擬機,而當GDT基址位于0xFFXXXXXX時說明處于虛擬機中,否則為真實主機。具體實現(xiàn)代碼如下:#include <stdio.h>void LDTDetect(void) unsigned short ldt_addr = 0; unsigned char ldtr2; _asm sldt ldtr ldt_addr = *(unsigned short *)&ldtr); printf("LDT BaseAddr: 0x%xn", ldt_addr); if

14、(ldt_addr = 0x0000) printf("Native OSn"); else printf("Inside VMwaren");void GDTDetect(void) unsigned int gdt_addr = 0; unsigned char gdtr4; _asm sgdt gdtr gdt_addr = *(unsigned int *)&gdtr2); printf("GDT BaseAddr:0x%xn", gdt_addr); if(gdt_addr >> 24) = 0xff)

15、printf("Inside VMwaren"); else printf("Native OSn");int main(void) LDTDetect(); GDTDetect(); return 0;測試結果如圖3所示: 圖3方法四:基于STR的檢測方法在保護模式下運行的所有程序在切換任務時,對于當前任務中指向TSS的段選擇器將會被存儲在任務寄存器中,TSS中包含有當前任務的可執(zhí)行環(huán)境狀態(tài),包括通用寄存器狀態(tài),段寄存器狀態(tài),標志寄存器狀態(tài),EIP寄存器狀態(tài)等等,當此項任務再次被執(zhí)行時,處理器就會其原先保存的任務狀態(tài)。每項任務均有其自己的TSS,而我們

16、可以通過STR指令來獲取指向當前任務中TSS的段選擇器。這里STR(Store task register)指令是用于將任務寄存器 (TR) 中的段選擇器存儲到目標操作數(shù),目標操作數(shù)可以是通用寄存器或內(nèi)存位置,使用此指令存儲的段選擇器指向當前正在運行的任務的任務狀態(tài)段 (TSS)。在虛擬機和真實主機之中,通過STR讀取的地址是不同的,當?shù)刂返扔?x0040xxxx時,說明處于虛擬機中,否則為真實主機。實現(xiàn)代碼如下:#include <stdio.h>int main(void) unsigned char mem4 = 0; int i; _asm str mem; printf

17、(" STR base: 0x"); for (i=0; i<4; i+) printf("%02x",memi); if ( (mem0=0x00) && (mem1=0x40) printf("n INSIDE MATRIX!n"); else printf("n Native OS!n"); return 0;測試結果如圖4所示: 圖4方法五:基于注冊表檢測虛擬機在windows虛擬機中常常安裝有VMware Tools以及其它的虛擬硬件(如網(wǎng)絡適配器、虛擬打印機,USB集線器),它們都

18、會創(chuàng)建任何程序都可以讀取的windows注冊表項,因此我們可以通過檢測注冊表中的一些關鍵字符來判斷程序是否處于虛擬機之中。關于這些注冊表的位置我們可以通過在注冊表中搜索關鍵詞“vmware”來獲取,下面是我在VMware下的WinXP中找到的一些注冊表項:項名:HKEY_CLASSES_ROOTApplicationsVMwareHostOpen.exe項名:HKEY_CLASSES_ROOTInstallerProductsC2A6F2EFE6910124C940B2B12CF170FEProductName鍵值“VMware Tools”項名:HKEY_CLASSES_ROOTInstal

19、lerProductsC2A6F2EFE6910124C940B2B12CF170FESourceListPackageName鍵值:VMware Tools.msi項名:HKEY_CURRENT_USERPrintersDeviceOld鍵值:_#VMwareVirtualPrinter,winspool,TPVM:項名:HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPScsiScsi Port 0Scsi Bus 0Target Id 0Logical Unit Id 0Identifier鍵值:VMware Virtual IDE Hard Drive項名:HKEY

20、_LOCAL_MACHINEHARDWAREDEVICEMAPScsiScsi Port 1Scsi Bus 0Target Id 0Logical Unit Id 0Identifier鍵值:NECVMWar VMware IDE CDR10項名:HKEY_LOCAL_MACHINESOFTWAREClassesInstallerProductsC2A6F2EFE6910124C940B2B12CF170FEProductName鍵值:VMware Tools項名:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstalle

21、rUserDataS-1-5-18ProductsC2A6F2EFE6910124C940B2B12CF170FEInstallPropertiesDisplayName鍵值:VMware Tools項名:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionReinstall0002DeviceDesc鍵值:VMware SVGA II項名:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionNetworkCards2Description鍵值:VMware Accel

22、erated AMD PCNet Adapter項名:HKEY_LOCAL_MACHINESOFTWAREVMware, Inc.VMware Tools項名:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass4D36E968-E325-11CE-BFC1-08002BE103180000DriverDesc鍵值:VMware SVGA II項名:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass4D36E968-E325-11CE-BFC1-08002BE103180000ProviderName

23、鍵值:VMware, Inc.項名:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass4D36E972-E325-11CE-BFC1-08002bE103180001DriverDesc鍵值:VMware Accelerated AMD PCNet Adapter項名:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass4D36E97B-E325-11CE-BFC1-08002BE103180000DriverDesc鍵值:VMware SCSI Controller項名:HKEY_LOCAL_MAC

24、HINESYSTEMControlSet001ControlPrintMonitorsThinPrint Print Port Monitor for VMWare除以上這些表項之外,還有很多地方可以檢測,特別是虛擬機提供的虛擬化軟硬件、服務之類,比如文件共享服務,VMware 物理磁盤助手服務,VMware Ethernet Adapter Driver,VMware SCSI Controller等等的這些信息都可作為檢測虛擬機的手段。這里我們就以其中某表項為例編程舉例一下,其它表項檢測方法同理,具體代碼如下:.386.model flat, stdcalloption casemap:n

25、one include windows.inc include user32.inc include kernel32.inc include advapi32.inc includelib user32.lib includelib kernel32.lib includelib advapi32.lib.dataszCaption db "VMware Detector ",0szInside db "Inside VMware!",0szOutside db "Native OS!",0szSubKey db "sof

26、twareVMWare, Inc.VMware tools",0hKey dd ?.codestart: invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szSubKey, 0, KEY_WRITE or KEY_READ, addr hKey .if eax = ERROR_SUCCESS invoke MessageBox, NULL,addr szInside, addr szCaption, MB_OK .else invoke MessageBox, NULL,addr szOutside, addr szCaption, MB_

27、OK .endif invoke RegCloseKey,hKey invoke ExitProcess,NULLend start測試結果如圖5所示: 圖5方法六:基于時間差的檢測方式本方法通過運行一段特定代碼,然后比較這段代碼在虛擬機和真實主機之中的相對運行時間,以此來判斷是否處于虛擬機之中。這段代碼我們可以通過RDTSC指令來實現(xiàn),RDTSC指令是用于將計算機啟動以來的CPU運行周期數(shù)存放到EDX:EAX里面,其中EDX是高位,而EAX是低位。下面我們以xchg ecx, eax 一句指令的運行時間為例,這段指令在我的真實主機windows 7系統(tǒng)上的運行時間為0000001E,如圖6所

28、示: 圖6而該指令在虛擬機WinXP下的運行時間為00000442,如圖7所示: 圖7兩者之間的運行時間明顯差別很多,在虛擬機中的運行速度遠不如真實主機的,一般情況下,當它的運行時間大于0xFF時,就可以確定它處于虛擬機之中了,因此不難寫出檢測程序,具體實現(xiàn)代碼如下:.586p.model flat, stdcalloption casemap:noneincludewindows.incinclude kernel32.incincludeuser32.incincludelibkernel32.libincludelibuser32.lib.dataszTitledb"VMDetect With RDTSC", 0hszInsideVMdb"Inside VMware!", 0hszOutsi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論