先說3種方法
代碼:
#include <windows.h>
#include <stdio.h>
BOOL gInVMWARE, gInVirtualPC;
BOOL VMWareTest()
{
BYTE PortValue1,PortValue2;
__try
__asm
{
pushad
pushfd
xor ebx,ebx
mov ecx,0xa
mov eax, 'VMXh' ; EAX=magic //564D5868
mov dx, 'VX' ; DX=magic
in eax, dx ; specially processed io cmd
cmp ebx, 'VMXh' ; also eax/ecx modified (maybe vmw/os ver?)
sete al;
movzx eax, al
mov gInVMWARE, eax;
popfd
popad
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
gInVMWARE=FALSE;
return gInVMWARE;
BOOL VirtualPCTest()
pushad
mov ebx, 0 // Flag
mov eax, 1 // VPC function number
__emit 0Fh
__emit 3Fh
__emit 07h
__emit 0Bh
test ebx, ebx
sete al
mov gInVirtualPC , eax;
gInVirtualPC=FALSE;
return gInVirtualPC;
BOOL VMTest()
ULONG xdt = 0 ;
ULONG InVM = 0;
push edx
sidt [esp-2]
pop edx
nop
mov xdt , edx
printf("idt = %08x\n" , xdt);
if (xdt > 0xd0000000)
//printf("IDT Test :running in vm!\n");
InVM = 1;
else
InVM = 0;
sgdt [esp-2]
printf("gdt = %08x\n" , xdt);
InVM += 1;
InVM += 0;
return InVM;
int main()
if (VMWareTest())
printf("In Vmware !!!");
else if (VirtualPCTest())
printf("In VirtualPC!!!!");
else if (VMTest())
printf("In VM !");
printf("In Host!");
getchar ();
return 1;
OK,這樣VMWare裡面基本都能檢測到
檢測虛拟機,一般來說有3種方法:
1,是猥瑣法,比如系統中有沒有vmware類似的服務,程序等,檢查BIOS的資訊,虛拟裝置的名稱等等,這種方法是很猥瑣的,優點是防不勝防,缺點就是不準确,而且都能修改(注意:BIOS也是能修改的)。
2,是模拟漏洞法,由于虛拟機畢竟不是真機,模拟上面是有一定的漏洞的,上面的VMTest就是漏洞法。優點是準确,基本上100%可以确定,因為是模拟的漏洞,是以不容易修改,缺點基本上沒有。
3,是後門法,虛拟機需要和host進行通訊,利用通訊檢測虛拟機,如上面的那個VMWare.GetVersion的後門。優點是準确,缺點是可以屏蔽掉後門。
是以,一般來說都是用後門法,進階一點用模拟漏洞。
随着硬體虛拟化技術的迅猛發展,模拟的漏洞越來越少,開了VT功能後,使用VMWare 6.0以上基本上滅掉了所有模拟的漏洞,後門法,patch一下主程式和guest的tools。
下面圖是我修改過的開了VT-x的VMWare,用上面的代碼是檢測不出來的

注意紅框,如果修改配置檔案屏蔽後門,vmware tools是無法啟動的。我這裡是Patch了Vmware tools和vmware-vmx.exe的主程式實作的,後來想想,還是避不開猥瑣的校驗。。
能過99%的anti vmware,主要還是靠VT技術,實在太強大了。
由于某些原因,上面的模拟漏洞我隻貼了MJ0011的代碼,還有幾個漏洞(暫時不公開寫出來,當然無法對付VMWare的)可以對付其他幾款虛拟機,比如VBox(開了VT也被檢測)。