




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在当今信息安全领域, 特别是恶意软件分析中, 经常需要利用到虚拟机技术, 以 提高病毒分析过程的安全性以及硬件资源的节约性, 因此它在恶意软件领域中是 应用 越来越来广泛。 这里我们所谓的虚拟机 (Virtual Machine )是指通过软件 模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算 机系 统。通过虚拟机软件(比如 VMware, Virtual PC ,VirtualBox),你可以在一台物理计算机上模拟出一台或多台虚拟的计算机, 这些虚拟机完全就像真正的 计算机那样进行工作, 例如你可以安装操作系统、 安装应用程序、 访问网络资源 等等。攻击者为了提高恶意程序的隐
2、蔽性以及破坏真实主 机的成功率,他们都 在恶意程序中加入检测虚拟机的代码, 以判断程序所处的运行环境。 当发现程序 处于虚拟机(特别是蜜罐系统)中时,它就会改变操作行为或者 中断执行,以 此提高反病毒人员分析恶意软件行为的难度。 本文主要针对基于 Intel CPU 的虚 拟环境VMware中的Windows XP SP3系统 进行检测分析,并列举出当前常见的 几种虚拟机检测方法。方法一:通过执行特权指令来检测虚拟机Vmware 为真主机与虚拟机之间提供了相互沟通的通讯机制, 它使用“ IN 指令来读取特定端口的数据以进行两机通讯,但由于 IN 指令属于特权指令,在 处于保护模式下的真机上执行
3、此指令时,除非权限允许,否则将会触发类型为“ EXCEPTION_PRIV_INSTRUCflON异常,而在虚拟机中并不会发生异常,在指定功能号0A (获取VMware版本)的情况下,它会在 EBX中返回其版本号“VMXH ;而当功能号为0x14时,可用于获取VMware内存大小,当大于0时 则说明处于虚拟机中。VMDetect正是利用前一种方法来检测 VMware的存在,其 检测代码分析如下:代码:bool IsInsideVMWare() bool rc = true; _try _asm push edx push ecx push ebx mov eax, 'VMXh'
4、 mov ebx, 0 /将 ebx 设置为非幻数' VMX'H 的其它值mov ecx, 10 /指定功能号,用于获取VMWar版本,当它为0x14时用于 获取VMware内存大小 mov edx, 'VX' /端口号 in eax, dx /从端口 dx 读取VMware版本到eax/若上面指定功能号为0x14时,可通过判断eax中的值是 否大于 0,若是则说明处于虚拟机 中 cmp ebx, 'VMXh' /判断 ebx中是否包含VMware版本VMXh,若是则在虚拟机 中setz rc /设置返回值pop ebxpop ecx pop e
5、dx _except(EXCEPTION_EXECUTE_HANDLER)如保未处于 VMware中,则触发此异 常 rc = false; return rc;测试结果:图1如图1所示,VMDetect成功检测出 VMWar的存在。方法二:利用IDT基址检测虚拟机利用IDT基址检测虚拟机的方法是一种通用方式,对 VMware和 Virtual PC 均适用。中断描述符表 IDT ( Interrupt Descriptor Table )用于 查找处理中断时所用的软件函数,它是一个由256项组成的数据,其中每一中断对应一 项函数。为了读取IDT基址,我们需要通过SIDT指令来读取IDTR(中
6、 断描述符表寄存器,用于IDT在内存中的基址),SIDT指令是以如下格式来存 储 IDTR的内容: 代码:typedef struct WORD IDTLimit; / IDT的大小 WORD LowlDTbase; / IDT的低位地址 WORD HiIDTbase; / IDT的高位地址 IDTINFO;由于只存在一个IDTR,但又存在两个操作系统,即虚拟机系统和真主机 系统。为了防止发生冲突,VMM虚拟机监控器)必须更改虚拟机中的IDT地址, 利用真主机与虚拟机环境中执行sidt指令的差异即可用于检测虚拟机是否存 在。著名的“红丸” (redpill )正是利用此原理来检测 VMware
7、的。Redpill 作者在VMware上发现虚拟机系统上的IDT地址通常位于OxFFXXXXX,而 Virtual PC 通常位于0xE8XXXXX,而在真实主机上正如图2所示都位于 0x80xxxxxx。Redpill仅仅是通过判断执行SIDT指令后返回的第一字节是否大 于0xD0,若是则说明它 处于虚拟机,否则处于真实主机中。Redpill的源码甚是精简,源码分析如下: 代码:#include <stdio.h>int main () unsigned char m2+4, rpill = "x0f x01x0dx00x00x00x00xc3" /相当于 S
8、IDTadrr,其中 addr 用于保 存 IDT 地址 * (unsigned*)&rpill3) = (unsigned)m; / 的 addr 设为 m的地 址(void(*)()&rpill)(); / 取后IDT地址保存在数组m中 printf ("idt base: %#xn", *(u nsig ned*)&m2); /为IDT大小,因此从m2开始即为IDT地址 if (m5>OxdO) printf ("Inside Matrix!n", m5); /将 sidtaddr中执行SIDT指令,并将读由于前2字节
9、当IDT基址大于OxdOxxxxxx时则说明程序处于VMware 中 else printf ("Not in Matrix.'n"); return 0;测试结果如图2所示:;童 Wi n d yivs XP SP3 - HMvrare 谢i;j; Windows XP 5P3EfeS X图2利用此IDT检测的方法存在一个缺陷,由于IDT的值只针对处于正在运行 的处理器而言,在单CPU中它是个常量,但当它处于多CPU时就可能会受到影响 了,因为每个CPU都有其自己的IDT,这样问题就自然而然的产生了。针对此问 题,Offensive Computing 组织成员提
10、出了两种应对方法,其中一种方法就是利用Redpill反复地在系统上循环执行任务,以此构造出一张当前系统的IDT值变化统计图,但这会增加 CPU负担;另一种方法就是 windows API函数 SetThreadAffi ni tyMask() 将线程限制在单处理器上执行,当执行此测试时只能 准确地将线程执行环境限制在本地处理器,而对于将线程限制在VM处理器上就 可能行不通了,因为VM是计划在各处理器上运行的,VM线程在不同的处理器上 执行时,IDT值将会发生变 化,因此此方法也是很少被使用的。为此,有人提 出了使用LDT的检测方法,它在具有多个CPU勺环境下检测虚拟机明显优于IDT 检测方法,
11、该方法具体内容 参见下节内容。J QD®© 超场血 石总® Q|固回壓MiS方法三:利用LDT和 GDT勺检测方法在In tel? 64 and IA-32 Architecture SoftwareDeveloper 'sManual Volume 3A: Syst em Programming Guide 第二章的 Vol.3 2-5 一页(我的 Intel 开发手册是2008版的)中对于LDT和GDT勺描述如下(以下内容为个人翻译):在 保护模式下,所有的内存访问都要通过全局描述符表(GDT或者本地描述符表(LDT才能进行。这些表包含有段描述符的调用
12、入口。各 个段描述符都包含有 各段的基址,访问权限,类型和使用信息,而且 每个段描述符都拥有一个与之相匹配的段选择子, 各个段选择子都为软 件程序提供一个GDT或 LDT索引(与之相关联的段描述符偏移量), 一个全局/本地标志(决定段选择子是指向 GDT还是LDT),以及访问 权限信息。若想访问段中的某一字节, 必须同时提供一个段选择子和一个偏 移量。段选择子为段提供可访问的段描述符地址 (在 GDT 或者 LDT 中)。 通过段描述符, 处理器从中获取段在线性地址空间里的基址,而偏移 量用于确定字节地址相对基址的位置。 假定处理器在当前权限级别 (CPL) 可访问这个段,那么通过这种机制 就
13、可以访问在GDT或LDT中的各种 有效代码、数据或者堆栈段,这里的CPL是指当前可执行代码段的保护 级别。GDT 的线性基址被保存在 GDT寄存器(GDTR中,而LDT的线性 基址被保存在 LDT寄存器(LDTR中。由于虚拟机与真实主机中的 GDT和LDT并不能相同,这与使用 IDT的检测方法一样,因此虚拟机必须为它们提供一个“复制体”。关 于GDT和LDT的基 址可通过SGDT和SLDT指令获取。虚拟机检测工具Scoopy suite 的作者Tobias Klein 经测试发现,当LDT基址位于0x0000 (只有两字节)时为真实主机,否则为虚拟机,而当GDT基址位于0xFFXXXXX时说明
14、处于虚拟机中,否则为真实主机。具体实现代码 如下:代码:#i nclude <stdio.h>void LDTDetect(void) un sig ned short ldt_addr = 0; un sig ned char ldtr2; _asm sldt ldtr ldt_addr = *( un sig ned short *)&ldtr); prin tf("LDT BaseAddr: 0x%xn", ldt_addr); i f(ldt_addr = 0x0000) prin tf("Native OSn"); else
15、printf("Inside VMwaren");void GDTDetect(void) unsigned int gdt_addr = 0; un sig ned char gdtr4; _asm sgdt gdtr gdt_ addr = *(unsigned int *)&gdtr2); printf("GDT BaseAddr:0x%xn", gdt_addr); if(gdt_addr >> 24) = 0xff) prin tf("I nsideVMware'n"); elseprintf(&
16、quot;Native OSn");int main(void) LDTDetect(); GDTDetect(); return 0;测试结果如图3所示:在.:f筈件旧-扁静E,宣胃剁恤 局 处目E叩9 £曾巒S3 1*C:FilesWicrosoft Visu方法四:基于STR的检测方法在保护模式下运行的所有程序在切换任务时,对于当前任务中指向TSS的段选择器将会被存储在任务寄存器中,TSS中包含有当前任务的可执行环境状 态,包括 通用寄存器状态,段寄存器状态,标志寄存器状态,EIP寄存器状态等等,当此项任务再次被执行时,处理器就会其原先保存的任务状态。 每项任务 均有
17、其自己的TSS,而我们可以通过STR指令来获取指向当前任务中TSS的段选 择器。这里STR(Store task register)指令是用于将任务寄存 器(TR)中的段选择器存储到目标操作数,目标操作数可以是通用寄存器或内存位置,使用此指令存储的段选择器指向当前正在运行的任务的任务状态段(TSS)。在虚拟机和真实主机之中,通过 STR读取的地址是不同的,当地址等于 0x0040xxxx时, 说明处于虚拟机中,否则为真实主机。实现代码如下:代码:#i nclude <stdio.h>i nt main (void) un sig ned char mem4 = 0; int i;
18、_asm str mem; print f (" STR base: 0x"); for (i=0; i<4; i+) prin tf("%02x",memi); if ( (mem0=0测试结x00) & amp ;& (mem1=0x40)prin tf("n INSIDE MATRIX!n"); elseprin tf("n Native OS!n"); return 0;果如图4所示:口 Windows XP SP3 -YVcrkstation:!-l+'Fj喘有亡 童
19、晋x 卤i!机山:于且E茴口,V帮叫H,| 30邑迴墮楚卫它回口MUMWindows XP 5P3屈命令鶴示符C: XDocutments and Setting£Adinini£t*atop-面兀md号“匚t STH base: 0x00400600"SIDE MAIBIK!*G; xDocuunents and 輕咅用凹松松1国图4方法五:基于注册表检测虚拟机在windows虚拟机中常常安装有 VMware Tools以及其它的虚拟硬件(如 网络适配器、虚拟打印机,USE集线器,),它们都会创建任何程序都可以 读取的 windows 注册表项,因此我们可以通过
20、检测注册表中的一些关键字符来判 断程序是否处于虚拟机之中。关于这些注册表的位置我们可以通过在注 册表中 搜索关键词“ vmware"来获取,下面是我在 VMwareT的WinXP中找到的一些注 册表项:项名: HKEY_CLASSES_ROOTApplicationsVMwareHostOpen.exe项名:HKEY_CLASSES_ROOTInstallerProductsC2A6F2EFE6910124C940B2B12CF170FE ProductName键值“ VMware Tools ”项名:HKEY_CLASSES_ROOTInstallerProductsC2A6F2E
21、FE6910124C940B2B12CF170FE SourceListPackageName键值: VMware Tools.msi项名: HKEY_CURRENT_USERPrintersDeviceOld键值: _#VMwareVirtualPrinter,winspool,TPVM:项名:HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPScsiScsi Port 0Scsi Bus 0Tar get Id 0Logical Unit Id 0Identifier键值: VMware Virtual IDE Hard Drive项名:HKEY_LOCAL_MACHI
22、NEHARDWAREDEVICEMAPScsiScsi Port 1Scsi Bus 0Tar get Id 0Logical Unit Id 0Identifier键值: NECVMWar VMware IDE CDR10项名:HKEY_LOCAL_MACHINESOFTWAREClassesInstallerProductsC2A6F2EFE69101 24C940B2B12CF170FEProductName键值: VMware Tools项 名: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserD
23、ataS-1-5-18ProductsC2A6F2EFE6910124C940B2B12CF170FEInstallP ropertiesDisplayName键值: VMware Tools项名: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionReinstal l0002DeviceDesc键值:VMware SVGA II项名:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionNetwo rkCards2Description键值: VMware Accel
24、erated AMD PCNet Adapter项名: HKEY_LOCAL_MACHINESOFTWAREVMware, Inc.VMware Tools 项名:HKEY_LOCAL_MACHINESYSTEMCo ntrolSet001Co ntrolClass4D36E968-E325- 11CE-BFC1-08002BE103180000DriverDesc键值:VMware SVGA II项名:HKEY_LOCAL_MACHINESYSTEMCo ntrolSet001Co ntrolClass4D36E968-E325- 11CE-BFC1-08002BE103180000Prov
25、iderName键值:VMware, Inc.项名:HKEY_LOCAL_MACHINESYSTEMCo ntrolSet001Co ntrolClass4D36E972-E325-11CE-BFC1-08002bE103180001DriverDesc键值:VMware Accelerated AMD PCNet Adapter项名:HKEY_LOCAL_MACHINESYSTEMCo ntrolSet001Co ntrolClass4D36E97B-E325-11CE-BFC1-08002BE103180000DriverDesc键值:VMware SCSI Controller项名:HK
26、EY_LOCAL_MACHINESYSTEMCo ntrolSet001Co ntrol'Pri ntMo nitors'Thi nPr int Print Port Mon itor for VMWare补充另外一处 具体代码如下:cpp view pla in copy1. BOOL DetectVM() 2.2. HKEY hKey;4.3. char szBuffer64;6.4. unsigned long hSize= sizeof(szBuffer) - 1;8.5. if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "HARD
27、WAREWDESCRIPTIONWSystemWBIOS", 0, KEY_READ, & hKey )=ERROR_SUCCESS ) 10.6. RegQueryValueEx( hKey, "SystemManufacturer", NULL, NULL, (unsigned char *)szBuffer, & hSize );12.7. if( strstr( szBuffer, "VMWARE" ) 14.8. RegCloseKey( hKey );16.9. return TRUE;18.20.21. RegCl
28、oseKey( hKey );22.22. 24.23. return FALSE;26.24. 除以上这些表项之外,还有很多地方可以检测,特别是虚拟机提供的虚 拟化软硬件、服务之类,比如文件共享服务,VMware物理磁盘助手服 务,VMware Ethernet Adapter Driver ,VMware SCSI Controller 等等的这些信息 都可作为检测虚拟机的手段。这里我们就以其中某表项为例编程举例一下,其它表项检测方法同理,具体代码如下:代码:.386.model flat, stdcallopti on casemap:none in clude wi ndows.i n
29、c in clude user32.i nc in clude kernel32.i nc in clude advapi32.i ncin cludelib user32 .lib in cludelib kern el32.lib in cludelib adva pi32.lib.dataszCapti on db "VMware Detector ",0szI nsidedb"In side VMware!",0szOutsidedb "Native OS!",0szSubKeydb "software'VM
30、Ware, I nc.'VMware tools",0hKeydd?.codestart: i nvoke RegOpe nKeyEx, HKEY_LOCAL_MACHINE, addr szSubKey, 0,KEY_WRITE or KEY_READ, addr hKey .if eax = ERROR_SUCCESS in voke MessageBox, NULL,addr szln side, addr szCaptio n, MB _OK .else inv oke MessageBox, NULL,addr szOutside, addr szCapti on,
31、 M B_OK .en dif in voke RegCloseKey,hKey in voke ExitProcess,NULLe nd sta rt测试结果如图5所示:g| Windows XP SP3 -"vMSSreWbrEEtFlt.Fi -miEj/ J雷U他A起始页我g Vlvar e B et e cl o rl礦解 )0出 Window? XP SP3询定方法六:基于时间差的检测方式本方法通过运行一段特定代码,然后比较这段代码在虚拟机和真实主机之中的相对运行时间,以此来判断是否处于虚拟机之中。这段代码我们可以通过RDTSC旨令来实现,RDTSC旨令是用于将计算机启动
32、 以来的CPU运行周期数存放到 EDX EAX里面,其中EDX是高位,而EAX 是低位。下面我们以xchg ecx, eax一句指令的运行时间为例,这段指令在我的真实主机 windows 7系统上的运行时间为0000001E,而该指令在虚拟机 WinXP下的运行时间为00000442,如图7所示:宜 Windt>vs召 V/nk审件f 怖e 直旨j 劉冋如叵9 It 0 ® B締起胎页re眾?轄丁确足vaJu*:00000442Winduws XP5P3图7两者之间的运行时间明显差别很多,在虚拟机中的运行速度远不如真实主机的, 一般情况下,当它的运行时间大于 OxFF时,就可以
33、确定它处于虚拟机之中了, 因此不难写出检测程序,具体实现代码如下:代码:.586p.model flat, stdcallopti on casemap:nonein eludewi ndows.i ncin eludekernel32.i ncin eludeuser32.i nci ncludelib kernel32.libi ncludelib user32.lib .dataszTitle db "VMDetect Wi th RDTSC", OhszI nsideVM db "In side VMware!", OhszOutsideVM d
34、b "Native OS!", Oh.codestart: RDTSC xchg ecx, eax RDTSC sub eax, ecx cmp eax, OFFh jg Detected inv oke MessageBox,0, offset szOutsideVM, offset szTitle, O ret Detected: i nvoke Me ssageBox, O, offset szln sideVM, offset szTitle, O rete nd start 测试结果如图8所示:图8方法七:利用虚拟硬件指纹检测虚拟机利 用虚拟硬件指纹也可用于检测虚
35、拟机的存在,比如VMware默认的网卡MAC地址前缀为“ OO-O5-69,OO-OC-29或者OO-5O- 56”,这前3节是由VMware分配的唯一标识符OUI,以供它的虚拟化适配器使用。在我的VMWareWinX下的MAC地址为 00-0C-29-5B- D7-67 ,如图9所示:P件F 尿涓旧 亘看 勒呱 X 扌旦面口 利路H,讥、Window XPSP3祎起航X#L图9但由于这些可经过修改配置文件来绕过检测。另外,还可通过检测特定的硬件控制器,BIOS, USBg制器,显卡,网卡等特征字符串进行检测,这些在前 面使用注册表检测方法中已有所涉及。另外之前在看雪论坛上也有朋友提到通过检测
36、硬盘Model Number是否含有“vmware或“ virtual ”等字样来实现检测虚拟机的功能,具体转载如下:cpp view pla in copy1. 小试 anti vmware2. 今天偶然看到一款绿色版的硬盘专业工具,突然发现可以利用其中的一项功能来实现anti vmware 。3. 今日事今日毕,那就在今晚12 : 00之前把这个想法实现吧,let's go!4. 我的想法就是检测硬盘的modelnumber,具体什么是modelnumber自己网上搜吧,反正不是硬盘序列号。难点就是在多种操作系统下都要能起到anti vmware 的效果。程序在xp、2k、2003
37、下都可以检测到 vmware的运行。5. 直接贴代码了,如果看不懂也没关系,我也是逆了人家的代码写出来的。Delphi也可以当汇编语言开发工具用,难道不是吗?6. unit Unit1;7. interface8. uses9. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,10. Dialogs, StdCtrls, Buttons;11. type12. TForm1 = class(TForm)13. BitBtn1: TBitBtn;14. procedure BitBtn1Click
38、(Sender: TObject);15. procedure FormClose(Sender: TObject; var Action: TCloseAction);16. private17. Private declarations 18. public19. Public declarations 20. end;21.22. var23. Form1: TForm1;24. hDeviceHandle:Thandle;25.26. implementation27.25. $R *.dfm29.30. procedure TForm1.BitBtn1Click(Sender: TO
39、bject);31. var32. InBuffer: array0.$8f of byte;33. cb:Cardinal;34. tmp:Pchar;35. begin36. hDeviceHandle:=CreateFile('.PHYSICALDRIVE0',$C0000000,$3,nil,OPEN_ EXISTING,$8000000,0);37. ZeroMemory(InBuffer,sizeof(InBuffer);38. asm39. pushad40. lea ebx,InBuffer41. xor ecx,ecx42. mov al,$2c43. MOV
40、 ebx,al44. MOV EAX,$200c000045. MOV ebx+4, eax46. mov al,$0147. MOV ebx+8,al48. mov al,$4049. MOV ebx+$c,al50. MOV EAX,$0001a5E051. MOV ebx+$10, eax52. mov al,$3053. MOV ebx+$18,al54. mov al,$12MOV ebx+$1c,almov al,$40MOV ebx+$20,aladd ecx,ebxadd ecx,$50MOV ebx+$14, ecx popadend;if DeviceloControl(h
41、DeviceHandle,$4D014,lnBuffer,$50,lnBuffer,$50,cb ,nil) thenbeginasmpushadlea ebx,InBufferadd ebx,$58mov tmp,ebxpopadend; /asmif (pos('vmware',LowerCase(tmp)>0) or (pos('virtual',LowerCase(tmp)>0) thenshowmessage('检测到 VMware Workstation!')elseshowmessage('请在 VMware 中
42、测试!');end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); beginclosehandle(hDeviceHandle);end;end.代码很短,但是效果不错。截图几张,留作纪念!C+代码实现如下:9.90.cppview pla in copy#.#.1.通过 IOCTL S
43、TORAGE QUERY PROPERTY#.3. typedef enum _STORAGE_QUERY_TYPE PropertyStandardQuery = 0,PropertyExistsQu ery,PropertyMaskQuery,PropertyQueryMaxDefined STORAGE_QUERY_TYPE, *PSTORAGE _QUERY_TYPE;4.5. typedef enum _STORAGE_PROPERTY_ID StorageDeviceProperty = 0,StorageAdapterP roperty STORAGE_PROPERTY_ID,
44、*PSTORAGE_PROPERTY_ID;6.7. typedef struct _STORAGE_PROPERTY_QUERY 8.9.STORAGE_PROPERTY_ID PropertyId;10.11. STORAGE_QUERY_TYPE QueryType;12.13. UCHAR AdditionalParameters1;7. STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;18.19. typedef struct _STORAGE_DEVICE_DESCRIPTOR 20.21. ULONG Vers
45、ion;22.23. ULONG Size;24.25. UCHAR DeviceType;26.27. UCHAR DeviceTypeModifier;28.26. BOOLEAN RemovableMedia;30.31. BOOLEAN CommandQueueing;32.33. ULONG VendorIdOffset;34.35. ULONG ProductIdOffset;36.37. STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;1. #define IOCTL_STORAGE_QUERY_P
46、ROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, ME THOD_BUFFERED, FILE_ANY_ACCESS)#.6.bool IsSandboxed()0.HANDLE hPhysicalDriveIOCTL = 0;51.int j = 0,k = 0;52.53.54.char szModel128,szBuffer128;55.56.char *szDrives = 57.58."qemu",59.60."virtual",61."vmware&qu
47、ot;,62.63.64.NULL8.69.hPhysicalDriveIOCTL = CreateFile (".PhysicalDrive0", 0,FILE_SHARE READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING, 0, NULL);70.71.72.if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)73.74.75.STORAGE_PROPERTY_QUERY query;76.77.DWORD cbBytesReturned = 0;78.79.80.me
48、mset (void *) & query, 0, sizeof (query);81.82.query.PropertyId = StorageDeviceProperty;83.84.memset (szBuffer, 0, sizeof (szBuffer);85.memset (szModel, 0, sizeof (szModel);00019.1
49、23.if (DeviceIoControl(hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERT Y,& query,sizeof (query),& szBuffer,sizeof (szBuffer),& cbBytesReturned, NUL L)STORAGE_DEVICE_DESCRIPTOR *descrip = (STORAGE_DEVICE_DESCRIPTOR* )&szBuffer;int pos = descrip->ProductIdOffset;int m =
50、 0;for(int g = pos;szBufferg != '0'g+)szModelm+ = szBufferg;CharLowerBuff(szModel,strlen(szModel);for (int i = 0; i < (sizeof(szDrives)/sizeof(LPSTR) - 1; i+ ) if (szDrivesi0 != 0) if(strstr(szModel,szDrivesi)return TRUE;CloseHandle (hPhysicalDriveIOCTL);return FALSE;总结国外SANS安全组织的研究人员总结出当
51、前各种虚拟机检测手段不外乎以下四类: 搜索虚拟环境中的进程,文件系统,注册表; 搜索虚拟环境中的内存 搜索虚拟环境中的特定虚拟硬件 搜索虚拟环境中的特定处理器指令和功能因 为现代计算系统大多是由文件系统,内存,处理器及各种硬件组件构成的, 上面提到的四种检测手段均包含了这些因素。 纵观前面各种检测方法, 也均在此 四类当 中。除此之外,也有人提出通过网络来检测虚拟机,比如搜索 ICMP和 TCP数据通讯的时间差异,IP ID数据包差异以及数据包中的异常头信息等等。 随着 技术研究的深入,相信会有更多的检测手段出现,与此同时,虚拟机厂商 也会不断进化它们的产品, 以增加 anti-vmware
52、的难度,这不也正是一场永无休 止的无烟战争!anti VM 的解决方法对于上边 方法一二三四六的解决方案是 :在本机BIOS的CPU设置中开启VT(虚拟化)选项。注意要先做这一步以后 才 能安装VM顺序错了只能把VM完全卸载重新安装。1. 新建虚拟机 在CPU设置如下图设置:主要目的是为了关闭二进制优化开启虚拟机的VT虚拟化。2. 关闭一些虚拟机的设置 用记事本打开VMX文件这个文件是VM的配置文件 如类似地址"C:VM MachinesWindows 7 (32 位)Windows 7 (32 位).vmx",在 文本末尾加入cpp view pla in copy1.
53、isolation.tools.getPtrLocation.disable = "TRUE"2. isolation.tools.setPtrLocation.disable = "TRUE"3. isolation.tools.setVersion.disable = "TRUE"4. isolation.tools.getVersion.disable = "TRUE"5. monitor_control.disable_directexec = "TRUE"6. monitor_cont
54、rol.disable_chksimd = "TRUE"7. monitor_control.disable_ntreloc = "TRUE"8. monitor_control.disable_selfmod = "TRUE"9. monitor_control.disable_reloc = "TRUE"10. monitor_control.disable_btinout = "TRUE"11. monitor_control.disable_btmemspace = "TRUE
55、"12. monitor_control.disable_btpriv = "TRUE"13. monitor_control.disable_btseg = "TRUE"14. monitor_control.restrict_backdoor = "TRUE"这样一来就实现了开启VT虚拟化关闭二进制优化关闭各种后门然 后安装VM中的系统如WIN7安装好后在VM WIN冲运行方法一二三四六的检 测全部通过了。方法七的解决方案就是修改硬件信息,这里的 VM特征硬件信息有很多,这里只 说网卡的,直接下载一个 mac地址修改器,
56、修改mac这样一来mac地址就不是 VM特有的了,从而达到过方法七的效果。方法五,很多商业软件都是用这个方法来验证,原因很简单不管是在驱动还是在应用层都可以很方便的读取注册表,只要保护开发人员自己安装一个VM就能提取里边特征注册码,这个解决方案就是搜索注册表的“VMware "virtual"等字段,把能修改的都修改了,然后导出注册表,以便重启系统后导入,因为重启 VM后有些注册表信息会还原。实例如下:环境:VM虚拟机 WIN7 32 位,光盘镜像名称 XBL_GHOST_WIN7_SP1_07ZJB.iso原理:修改注册表中的“VMware修改为了“test123 ”注册
57、表:cpp view pla in copy1. Windows Registry Editor Version 5.002.2. HKEY_LOCAL_MACHINESYSTEMControlSetOO1ControlSystemlnformation3. "BIOSVersion"="6.00"4. "BIOSReleaseDate"="O7/O2/2O12"5. "SystemManufacturer"="test123, Inc."6. "SystemPro
58、ductName"="test123 test123 Platform"7. "InformationSource"=dword:0000000110. HKEY_LOCAL_MACHINEHARDWAREDESCRIPTIONSystemBIOS11. "BiosMajorRelease"=dword:0000000412. "BiosMinorRelease"=dword:0000000613. "ECFirmwareMajorRelease"=dword:0000000014. "ECFirmwareMinorRelease"=dword:0000000015. "BaseBoardManufacturer"="Intel Corporation"16. "BaseBoardProduc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重大危险源辨识方案
- 健康生活服务软件开发合作协议
- 农业综合开发投资合作框架协议
- 云灾备服务协议
- 实验动物饲养技术服务协议
- 农民合作种植技术交流与服务协议
- 农民互助合作社种植技术合作协议
- 农民技术培训与知识普及服务合同
- 产品推广及服务合作协议范本下载
- 绿色建筑100万平米绿色商业综合体建设可行性研究报告
- 2024年国家电投集团黄河公司招聘笔试参考题库含答案解析
- 航海英语会话(一)
- 道路工程安全技术交底
- 高三数学备课组高考数学经验总结
- 鼎捷T100-V1.0-票据资金用户手册-简体
- 城乡规划管理与法规系列讲座城乡规划的监督检查
- 第一单元知识盘点(含字词、佳句、感知、考点) 四年级语文上册 (部编版有答案)
- 钻井工程钻柱课件
- 小学硬笔书法课教案(1-30节)
- 周口市医疗保障门诊特定药品保险申请表
- 校园物业考评表
评论
0/150
提交评论