虛擬機去虛擬化及檢測技術(shù)攻防_第1頁
虛擬機去虛擬化及檢測技術(shù)攻防_第2頁
虛擬機去虛擬化及檢測技術(shù)攻防_第3頁
虛擬機去虛擬化及檢測技術(shù)攻防_第4頁
虛擬機去虛擬化及檢測技術(shù)攻防_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

3、NSTRUCTION”的異常,而在虛擬機中 并不會發(fā)生異常,在指定功能號0A(獲取VMware版本)的情況下,它會在EBX中返回其版本號“VMXH”;而當(dāng)功能號為0x14時,可用于獲取 VMware內(nèi)存大小,當(dāng)大于0時則說明處于虛擬機中。VMDetect正是利用前一種方法來檢測VMware的存在,其檢測代碼分析如下:代碼:boolIsInsideVMWare() boolrc=true;_try_asmpushedxpushecxpushebxmoveax,VMXhmovebx,0/將 ebx設(shè)置為非幻數(shù)VMXH的其它值movecx,10/指定功能號,用于獲取VMWare版本,當(dāng)它為0x14時

4、用于 獲取VMware內(nèi)存大小movedx,VX/端口號ineax,dx/從端口dx讀取 VMware版本到eax/若上面指定功能號為0x14時,可通過判斷eax中的值是否大于0,若是則說明處于虛擬機 中cmpebx,VMXh/判斷ebx中是否包含VMware版本VMXh,若是則在虛擬機 中setzrc/設(shè)置返回 值popebxpopecxpopedx_except(EXCEPTION_EXECUTE_HANDLER)/ 如果未處于VMware中,則觸發(fā)此異常rc=false;returnrc;測試結(jié)果:圖1如圖1所示,VMDetect成功檢測出VMWare的存在。方法二:利用IDT基址檢測虛

5、擬機 利用IDT基址檢測虛擬機的方法是一種通用方式,對VMware和VirtualPC均適用。中斷描述符表 IDT(InterruptDescriptorTable)用于查找處理中斷時所用的軟件函數(shù),它是一個由256項組成的數(shù)據(jù),其中每一中斷對應(yīng)一 項函數(shù)。為了讀取IDT基址,我們需要通過SIDT指令來讀取IDTR(中斷描述符表寄存器,用于IDT在內(nèi)存中的基址),SIDT指令是以如下格式來存 儲IDTR的內(nèi)容:代碼:typedefstructWORDIDTLimit;/IDT的大小WORDLowIDTbase;/IDT的低位地址WORDHiIDTbase;/IDT的高位地址IDTINFO; 由

6、于只存在一個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,而VirtualPC通常位于0xE8XXXXXX, 而在真實主機上正如圖2所示都位于0x80xxxxxx。Redpill僅僅是通過判斷執(zhí)行SIDT指令后返回的第一字節(jié)是否大于0xD0,若是則說明它 處于虛擬機,否則處于真實

7、主機中。Redpill的源碼甚是精簡,源碼分析如下:代碼:#includeintmain()unsignedcharm2+4,rpill=x0f x01x0dx00x00x00x00xc3;/相當(dāng)于SIDTadrr,其中addr用于保存IDT地址* (unsigned*)&rpill3)=(unsigned)m;/將sidtaddr中的addr設(shè)為m的地 址(void(*)()&rpill)();/執(zhí)行SIDT指令,并將讀取后IDT地址保存在數(shù)組m 中printf(idtbase:%#xn,*(unsigned*)&m2);/由于前2字節(jié)為IDT大 小,因此從m2開始即為IDT地 址if(m5

8、0xd0)printf(InsideMatrix!n,m5);/當(dāng)IDT基址大于 0xd0xxxxxx時則說明程序處于VMware中elseprintf(NotinMatrix.n);return0;測試結(jié)果如圖2所示: 圖2 利用此IDT檢測的方法存在一個缺陷,由于IDT的值只針對處于正在運行的處理器而言,在單CPU中它是個常量,但當(dāng)它處于多CPU時就可能會受到影響 了,因為每個CPU都有其自己的IDT,這樣問題就自然而然的產(chǎn)生了。針對此問題,OffensiveComputing組織成員提出了兩種應(yīng)對方法, 其中一種方法就是利用Redpill反復(fù)地在系統(tǒng)上循環(huán)執(zhí)行任務(wù),以此構(gòu)造出一張當(dāng)前系統(tǒng)

9、的IDT值變化統(tǒng)計圖,但這會增加CPU負擔(dān);另一種方法就是 windowsAPI函數(shù)SetThreadAffinityMask()將線程限制在單處理器上執(zhí)行,當(dāng)執(zhí)行此測試時只能準(zhǔn)確地將線程執(zhí)行環(huán)境限制在 本地處理器,而對于將線程限制在VM處理器上就可能行不通了,因為VM是計劃在各處理器上運行的,VM線程在不同的處理器上執(zhí)行時,IDT值將會發(fā)生變 化,因此此方法也是很少被使用的。為此,有人提出了使用LDT的檢測方法,它在具有多個CPU的環(huán)境下檢測虛擬機明顯優(yōu)于IDT檢測方法,該方法具體內(nèi)容 參見下節(jié)內(nèi)容。 方法三:利用LDT和GDT的檢測方法 在Intel64andIA- 32Architect

10、ureSoftwareDevelopersManualVolume3A:SystemProgrammingGuide 第二章的Vol.32-5一頁(我的Intel開發(fā)手冊是2008版的)中對于LDT和GDT的描述如下(以下內(nèi)容為個人翻譯):在 保護模式下,所有的內(nèi)存訪問都要通過全局描述符表(GDT)或者本地描述符表(LDT)才能進行。這些表包含有段描述符的調(diào)用入口。各個段描述符都包含有 各段的基址,訪問權(quán)限,類型和使用信息,而且每個段描述符都擁有一個與之相匹配的段選擇子,各個段選擇子都為軟件程序提供一個GDT或LDT索引(與之相 關(guān)聯(lián)的段描述符偏移量),一個全局/本地標(biāo)志(決定段選擇子是指向G

11、DT還是LDT),以及訪問權(quán)限信息。 若想訪問段中的某一字節(jié),必須同時提供一個段選擇子和一個偏移量。段選擇子為段提供可訪問的段描述符地址(在GDT或者LDT中)。通過段描述符, 處理器從中獲取段在線性地址空間里的基址,而偏移量用于確定字節(jié)地址相對基址的位置。假定處理器在當(dāng)前權(quán)限級別(CPL)可訪問這個段,那么通過這種機制 就可以訪問在GDT或LDT中的各種有效代碼、數(shù)據(jù)或者堆棧段,這里的CPL是指當(dāng)前可執(zhí)行代碼段的保護級別。 GDT的線性基址被保存在GDT寄存器(GDTR)中,而LDT的線性基址被保存在LDT寄存器(LDTR)中。 由于虛擬機與真實主機中的GDT和LDT并不能相同,這與使用ID

12、T的檢測方法一樣,因此虛擬機必須為它們提供一個“復(fù)制體”。關(guān)于GDT和LDT的基 址可通過SGDT和SLDT指令獲取。虛擬機檢測工具Scoopysuite的作者TobiasKlein經(jīng)測試發(fā)現(xiàn),當(dāng)LDT基址位于 0x0000(只有兩字節(jié))時為真實主機,否則為虛擬機,而當(dāng)GDT基址位于0xFFXXXXXX時說明處于虛擬機中,否則為真實主機。具體實現(xiàn)代碼如 下: 代碼:#includevoidLDTDetect(void)unsignedshortldt_addr=0;unsignedcharldtr2;_asmsldtldtrldt_addr=*(unsignedshort*)&ldtr);pr

13、intf(LDTBaseAddr:0x%xn,ldt_addr);if(ldt_addr=0x0000)printf(NativeOSn);elseprintf(InsideVMwaren);voidGDTDetect(void)unsignedintgdt_addr=0;unsignedchargdtr4;_asmsgdtgdtrgdt_addr=*(unsignedint*)&gdtr2);printf(GDTBaseAddr:0x%xn,gdt_addr);if(gdt_addr24)=0xff)printf(InsideVMwaren);elseprintf(NativeOSn);in

14、tmain(void)LDTDetect();GDTDetect();return0;測試結(jié)果如圖3所示: 圖3方法四:基于STR的檢測方法 在保護模式下運行的所有程序在切換任務(wù)時,對于當(dāng)前任務(wù)中指向TSS的段選擇器將會被存儲在任務(wù)寄存器中,TSS中包含有當(dāng)前任務(wù)的可執(zhí)行環(huán)境狀態(tài),包括 通用寄存器狀態(tài),段寄存器狀態(tài),標(biāo)志寄存器狀態(tài),EIP寄存器狀態(tài)等等,當(dāng)此項任務(wù)再次被執(zhí)行時,處理器就會其原先保存的任務(wù)狀態(tài)。每項任務(wù)均有其自己的 TSS,而我們可以通過STR指令來獲取指向當(dāng)前任務(wù)中TSS的段選擇器。這里STR(Storetaskregister)指令是用于將任務(wù)寄存 器(TR)中的段選擇器存儲

15、到目標(biāo)操作數(shù),目標(biāo)操作數(shù)可以是通用寄存器或內(nèi)存位置,使用此指令存儲的段選擇器指向當(dāng)前正在運行的任務(wù)的任務(wù)狀態(tài) 段(TSS)。在虛擬機和真實主機之中,通過STR讀取的地址是不同的,當(dāng)?shù)刂返扔?x0040xxxx時,說明處于虛擬機中,否則為真實主機。實現(xiàn)代 碼如下:代碼:#includeintmain(void) unsignedcharmem4=0;inti;_asmstrmem;printf(STRbase:0x);for(i=0;i& lt;4;i+)printf(%02x,memi);if(mem0=0x00)& amp;&(mem1=0x40)printf(nINSIDEMATRIX!

16、n);elseprintf(nNativeOS!n);return0;測試結(jié)果如圖4所示:圖4方法五:基于注冊表檢測虛擬機 在windows虛擬機中常常安裝有VMwareTools以及其它的虛擬硬件(如網(wǎng)絡(luò)適配器、虛擬打印機,USB集線器),它們都會創(chuàng)建任何程序 都可以讀取的windows注冊表項,因此我們可以通過檢測注冊表中的一些關(guān)鍵字符來判斷程序是否處于虛擬機之中。關(guān)于這些注冊表的位置我們可以通過在注 冊表中搜索關(guān)鍵詞“vmware”來獲取,下面是我在VMware下的WinXP中找到的一些注冊表項:項名:HKEY_CLASSES_ROOTApplicationsVMwareHostOpen

17、.exe項名:HKEY_CLASSES_ROOTInstallerProductsC2A6F2EFEC940B2B12CF170FEProductName鍵值“VMwareTools”項名:HKEY_CLASSES_ROOTInstallerProductsC2A6F2EFEC940B2B12CF170FESourceListPackageName鍵值:VMwareTools.msi項名:HKEY_CURRENT_USERPrintersDeviceOld鍵值:_#VMwareVirtualPrinter,winspool,TPVM:項名:HKEY_LOCAL_MACHINEHARDWARED

18、EVICEMAPScsiScsiPort0ScsiBus0TargetId0LogicalUnitId0Identifier鍵值:VMwareVirtualIDEHardDrive項名:HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPScsiScsiPort1ScsiBus0TargetId0LogicalUnitId0Identifier鍵值:NECVMWarVMwareIDECDR10項名:HKEY_LOCAL_MACHINESOFTWAREClassesInstallerProductsC2A6F2EFEC940B2B12CF170FEProductName鍵值:V

19、MwareTools項 名:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstaller UserDataS-1-5-18ProductsC2A6F2EFEC940B2B12CF170FEInstallPropertiesDisplayName鍵值:VMwareTools項名:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionReinstall0002DeviceDesc鍵值:VMwareSVGAII項名:HKEY_LOCAL_MACHINESOFTWAREMic

20、rosoftWindowsNTCurrentVersionNetworkCards2Description鍵值:VMwareAcceleratedAMDPCNetAdapter項名:HKEY_LOCAL_MACHINESOFTWAREVMware,Inc.VMwareTools項名:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass4D36E968-E325-11CE-BFC1-08002BE103180000DriverDesc鍵值:VMwareSVGAII項名:HKEY_LOCAL_MACHINESYSTEMControlSet001Cont

21、rolClass4D36E968-E325-11CE-BFC1-08002BE103180000ProviderName鍵值:VMware,Inc.項名:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass4D36E972-E325-11CE-BFC1-08002bE103180001DriverDesc鍵值:VMwareAcceleratedAMDPCNetAdapter項名:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass4D36E97B-E325-11CE-BFC1-08002BE103180

22、000DriverDesc鍵值:VMwareSCSIController項名:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlPrintMonitorsThinPrintPrintPortMonitorforVMWare補充另外一處 具體代碼如下:cppview plaincopy1. BOOLDetectVM()2. 3. HKEYhKey;4. 5. charszBuffer64;6. 7. unsignedlonghSize=sizeof(szBuffer)-1;8. 9. if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,HA

23、RDWAREDESCRIPTIONSystemBIOS,0,KEY_READ,&hKey)=ERROR_SUCCESS)10. 11. RegQueryValueEx(hKey,SystemManufacturer,NULL,NULL,(unsignedchar*)szBuffer,&hSize);12. 13. if(strstr(szBuffer,VMWARE)14. 15. RegCloseKey(hKey);16. 17. returnTRUE;18. 19. 20. 21. RegCloseKey(hKey);22. 23. 24. 25. returnFALSE;26. 27. 除

24、以上這些表項之外,還有很多地方可以檢測,特別是虛擬機提供的虛擬化軟硬件、服務(wù)之類,比如文件共享服務(wù),VMware物理磁盤助手服 務(wù),VMwareEthernetAdapterDriver,VMwareSCSIController等等的這些信息都可作為檢測虛擬機的 手段。這里我們就以其中某表項為例編程舉例一下,其它表項檢測方法同理,具體代碼如下:代碼:.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludeuser32.incincludekernel32.incincludeadvapi32.incincludelibu

25、ser32.libincludelibkernel32.libincludelibadvapi32.lib.dataszCaptiondbVMwareDetector,0szInsidedbInsideVMware!,0szOutsidedbNativeOS!,0szSubKeydbsoftwareVMWare,Inc.VMwaretools,0hKeydd?.codestart:invokeRegOpenKeyEx,HKEY_LOCAL_MACHINE,addrszSubKey,0,KEY_WRITEorKEY_READ,addrhKey.ifeax=ERROR_SUCCESSinvokeM

26、essageBox,NULL,addrszInside,addrszCaption,MB_OK.elseinvokeMessageBox,NULL,addrszOutside,addrszCaption,MB_OK.endifinvokeRegCloseKey,hKeyinvokeExitProcess,NULLendstart測試結(jié)果如圖5所示:圖5方法六:基于時間差的檢測方式 本方法通過運行一段特定代碼,然后比較這段代碼在虛擬機和真實主機之中的相對運行時間,以此來判斷是否處于虛擬機之中。這段代碼我們可以通過RDTSC指 令來實現(xiàn),RDTSC指令是用于將計算機啟動以來的CPU運行周期數(shù)存放到

27、EDX:EAX里面,其中EDX是高位,而EAX是低位。下面我們以 xchgecx,eax一句指令的運行時間為例,這段指令在我的真實主機windows7系統(tǒng)上的運行時間為E,如圖6所 示: 圖6而該指令在虛擬機WinXP下的運行時間為,如圖7所示:圖7兩者之間的運行時間明顯差別很多,在虛擬機中的運行速度遠不如真實主機的,一般情況下,當(dāng)它的運行時間大于0xFF時,就可以確定它處于虛擬機之中了,因此不難寫出檢測程序,具體實現(xiàn)代碼如下: 代碼:.586p.modelflat,stdcalloptioncasemap:noneincludewindows.incincludekernel32.incin

28、cludeuser32.incincludelibkernel32.libincludelibuser32.lib.dataszTitledbVMDetectWithRDTSC,0hszInsideVMdbInsideVMware!,0hszOutsideVMdbNativeOS!,0h.codestart:RDTSCxchgecx,eaxRDTSCsubeax,ecxcmpeax,0FFhjgDetectedinvokeMessageBox,0,offsetszOutsideVM,offsetszTitle,0retDetected:invokeMessageBox,0,offsetszIn

29、sideVM,offsetszTitle,0retendstart測試結(jié)果如圖8所示:圖8 方法七:利用虛擬硬件指紋檢測虛擬機利 用虛擬硬件指紋也可用于檢測虛擬機的存在,比如VMware默認的網(wǎng)卡MAC地址前綴為“00-05-69,00-0C-29或者00-50-56”,這 前3節(jié)是由VMware分配的唯一標(biāo)識符OUI,以供它的虛擬化適配器使用。在我的VMWareWinXP下的MAC地址為00-0C-29-5B- D7-67,如圖9所示:圖9 但由于這些可經(jīng)過修改配置文件來繞過檢測。另外,還可通過檢測特定的硬件控制器,BIOS,USB控制器,顯卡,網(wǎng)卡等特征字符串進行檢測,這些在前面使用注冊表

30、檢測方法中已有所涉及。另外之前在看雪論壇上也有朋友提到通過檢測硬盤ModelNumber是否含有“vmware”或“virtual”等字樣來實現(xiàn)檢測虛擬機的功能,具體轉(zhuǎn)載如下:cppview plaincopy1. 小試antivmware2. 今天偶然看到一款綠色版的硬盤專業(yè)工具,突然發(fā)現(xiàn)可以利用其中的一項功能來實現(xiàn)antivmware。3. 今日事今日畢,那就在今晚12:00之前把這個想法實現(xiàn)吧,letsgo!4. 我的想法就是檢測硬盤的modelnumber,具體什么是modelnumber自己網(wǎng)上搜吧,反正不是硬盤序列號。難點就是在多種操作系統(tǒng)下都要能起到antivmware的效果。程

31、序在xp、2k、2003下都可以檢測到vmware的運行。5. 直接貼代碼了,如果看不懂也沒關(guān)系,我也是逆了人家的代碼寫出來的。Delphi也可以當(dāng)匯編語言開發(fā)工具用,難道不是嗎?6. unitUnit1;7. interface8. uses9. Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,10. Dialogs,StdCtrls,Buttons;11. type12. TForm1=class(TForm)13. BitBtn1:TBitBtn;14. procedureBitBtn1Click(Se

32、nder:TObject);15. procedureFormClose(Sender:TObject;varAction:TCloseAction);16. private17. Privatedeclarations18. public19. Publicdeclarations20. end;21. 22. var23. Form1:TForm1;24. hDeviceHandle:Thandle;25. 26. implementation27. 28. $R*.dfm29. 30. procedureTForm1.BitBtn1Click(Sender:TObject);31. va

33、r32. InBuffer:array0.$8fofbyte;33. cb:Cardinal;34. tmp:Pchar;35. begin36. hDeviceHandle:=CreateFile(.PHYSICALDRIVE0,$C,$3,nil,OPEN_EXISTING,$,0);37. ZeroMemory(InBuffer,sizeof(InBuffer);38. asm39. pushad40. leaebx,InBuffer41. xorecx,ecx42. moval,$2c43. MOVebx,al44. MOVEAX,$200c000045. MOVebx+4,eax46

34、. moval,$0147. MOVebx+8,al48. moval,$4049. MOVebx+$c,al50. MOVEAX,$0001a5E051. MOVebx+$10,eax52. moval,$3053. MOVebx+$18,al54. moval,$1255. MOVebx+$1c,al56. moval,$4057. MOVebx+$20,al58. addecx,ebx59. addecx,$5060. MOVebx+$14,ecx61. popad62. end;63. 64. 65. ifDeviceIoControl(hDeviceHandle,$4D014,InB

35、uffer,$50,InBuffer,$50,cb,nil)then66. begin67. asm68. pushad69. leaebx,InBuffer70. addebx,$5871. movtmp,ebx72. popad73. end;/asm74. 75. if(pos(vmware,LowerCase(tmp)0)or(pos(virtual,LowerCase(tmp)0)then76. showmessage(檢測到VMwareWorkstation!)77. else78. showmessage(請在VMware中測試!);79. 80. end;81. end;82.

36、 83. procedureTForm1.FormClose(Sender:TObject;varAction:TCloseAction);84. begin85. closehandle(hDeviceHandle);86. end;87. 88. end.89. 90. 代碼很短,但是效果不錯。截圖幾張,留作紀(jì)念! C+代碼實現(xiàn)如下:cppview plaincopy1. 通過IOCTL_STORAGE_QUERY_PROPERTY2. 3. typedefenum_STORAGE_QUERY_TYPEPropertyStandardQuery=0,PropertyExistsQuery,

37、PropertyMaskQuery,PropertyQueryMaxDefinedSTORAGE_QUERY_TYPE,*PSTORAGE_QUERY_TYPE;4. 5. typedefenum_STORAGE_PROPERTY_IDStorageDeviceProperty=0,StorageAdapterPropertySTORAGE_PROPERTY_ID,*PSTORAGE_PROPERTY_ID;6. 7. typedefstruct_STORAGE_PROPERTY_QUERY8. 9. STORAGE_PROPERTY_IDPropertyId;10. 11. STORAGE_

38、QUERY_TYPEQueryType;12. 13. UCHARAdditionalParameters1;14. 15. 16. 17. STORAGE_PROPERTY_QUERY,*PSTORAGE_PROPERTY_QUERY;18. 19. typedefstruct_STORAGE_DEVICE_DESCRIPTOR20. 21. ULONGVersion;22. 23. ULONGSize;24. 25. UCHARDeviceType;26. 27. UCHARDeviceTypeModifier;28. 29. BOOLEANRemovableMedia;30. 31. B

39、OOLEANCommandQueueing;32. 33. ULONGVendorIdOffset;34. 35. ULONGProductIdOffset;36. 37. STORAGE_DEVICE_DESCRIPTOR,*PSTORAGE_DEVICE_DESCRIPTOR;38. 39. 40. 41. #defineIOCTL_STORAGE_QUERY_PROPERTYCTL_CODE(IOCTL_STORAGE_BASE,0x0500,METHOD_BUFFERED,FILE_ANY_ACCESS)42. 43. 44. 45. boolIsSandboxed()46. 47.

40、48. 49. HANDLEhPhysicalDriveIOCTL=0;50. 51. intj=0,k=0;52. 53. charszModel128,szBuffer128;54. 55. char*szDrives=56. 57. qemu,58. 59. virtual,60. 61. vmware,62. 63. NULL64. 65. ;66. 67. 68. 69. hPhysicalDriveIOCTL=CreateFile(.PhysicalDrive0,0,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL

41、);70. 71. if(hPhysicalDriveIOCTL!=INVALID_HANDLE_VALUE)72. 73. 74. 75. STORAGE_PROPERTY_QUERYquery;76. 77. DWORDcbBytesReturned=0;78. 79. memset(void*)&query,0,sizeof(query);80. 81. query.PropertyId=StorageDeviceProperty;82. 83. memset(szBuffer,0,sizeof(szBuffer);84. 85. memset(szModel,0,sizeof(szMo

42、del);86. 87. if(DeviceIoControl(hPhysicalDriveIOCTL,IOCTL_STORAGE_QUERY_PROPERTY,&query,sizeof(query),&szBuffer,sizeof(szBuffer),&cbBytesReturned,NULL)88. 89. STORAGE_DEVICE_DESCRIPTOR*descrip=(STORAGE_DEVICE_DESCRIPTOR*)&szBuffer;90. 91. intpos=descrip-ProductIdOffset;92. 93. intm=0;94. 95. for(int

43、g=pos;szBufferg!=0;g+)96. 97. szModelm+=szBufferg;98. 99. 100. 101. CharLowerBuff(szModel,strlen(szModel);102. 103. for(inti=0;i(sizeof(szDrives)/sizeof(LPSTR)-1;i+)104. 105. if(szDrivesi0!=0)106. 107. if(strstr(szModel,szDrivesi)108. 109. returnTRUE;110. 111. 112. 113. 114. 115. 116. 117. CloseHand

44、le(hPhysicalDriveIOCTL);118. 119. 120. 121. returnFALSE;122. 123. 總結(jié)國外SANS安全組織的研究人員總結(jié)出當(dāng)前各種虛擬機檢測手段不外乎以下四類:搜索虛擬環(huán)境中的進程,文件系統(tǒng),注冊表;搜索虛擬環(huán)境中的內(nèi)存搜索虛擬環(huán)境中的特定虛擬硬件搜索虛擬環(huán)境中的特定處理器指令和功能因 為現(xiàn)代計算系統(tǒng)大多是由文件系統(tǒng),內(nèi)存,處理器及各種硬件組件構(gòu)成的,上面提到的四種檢測手段均包含了這些因素??v觀前面各種檢測方法,也均在此四類當(dāng) 中。除此之外,也有人提出通過網(wǎng)絡(luò)來檢測虛擬機,比如搜索ICMP和TCP數(shù)據(jù)通訊的時間差異,IPID數(shù)據(jù)包差異以及數(shù)據(jù)包

45、中的異常頭信息等等。隨著 技術(shù)研究的深入,相信會有更多的檢測手段出現(xiàn),與此同時,虛擬機廠商也會不斷進化它們的產(chǎn)品,以增加anti-vmware的難度,這不也正是一場永無休 止的無煙戰(zhàn)爭!=anti VM的解決方法對于上邊方法一二三四六的解決方案是 :1.在本機BIOS的CPU設(shè)置中開啟VT(虛擬化)選項。 注意要先做這一步以后 才能安裝VM 順序錯了只能把VM完全卸載重新安裝。2.新建虛擬機 在CPU設(shè)置如下圖設(shè)置:主要目的是為了 關(guān)閉二進制優(yōu)化 開啟虛擬機的VT虛擬化。3.關(guān)閉一些虛擬機的設(shè)置 用記事本打開 VMX 文件 這個文件是VM的配置文件 如類似地址C:VM MachinesWind

46、ows 7 (32位)Windows 7 (32位).vmx,在文本末尾加入cppview plaincopy1. isolation.tools.getPtrLocation.disable=TRUE2. isolation.tools.setPtrLocation.disable=TRUE3. isolation.tools.setVersion.disable=TRUE4. isolation.tools.getVersion.disable=TRUE5. monitor_control.disable_directexec=TRUE6. monitor_control.disable_chksimd=TRUE7. monitor_control.disable_ntreloc=TRUE8. monitor_control.disable_selfmod=TRUE9. monitor_control.disable_reloc=TRUE10. monitor_control.disable_btinout=TRUE11. monitor_control.disable_btmemspace=TRUE1

溫馨提示

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

評論

0/150

提交評論