.586
.model flat, stdcall
option casemap:none
include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\user32.inc
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
include C:\masm32\INCLUDE\advapi32.inc ; reg
includelib C:\masm32\LIB\advapi32.lib ; reg
.data
MsgCaption db "Iczelion's tutorial no.2",0
MsgBoxText db "Win32 Assembly is Great!",0
VM db "VM Detected",0
szTestKey db "software\VMWare, Inc.\VMware tools",0
hKey db "InstallPath",0
.code
start:
FindVM:
rdtsc
mov ebx,eax
rdtsc
sub eax,ebx
push eax
cmp eax,1 ; infrequent some CPUs return the value 1,
jz FindVM ; which seems to be a bug! in this case we try again.
pop eax
cmp eax,0200h ; time returned
;jb Not_VM
jb VM_Reg
jmp ExitPrg ; inside VM
VM_Reg:
invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szTestKey, 0, KEY_WRITE or KEY_READ, addr hKey
.if eax == ERROR_SUCCESS
jmp ExitPrg ;INSIDE VM
.else
jmp RunMe ;NO VM
.endif
RunMe: ;NO VM
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
ExitPrg:
invoke ExitProcess,NULL
end start