Я пытаюсь разработать приложение, которое определяет, запущена ли программа внутри виртуальной машины.
Для 32-битной Windows уже есть методы, описанные по следующей ссылке: http://www.codeproject.com/Articles/9823/Detect-if-your-program-is-running-inside-a-Virtual
Я пытаюсь адаптировать код для обнаружения Virtual PC и VMware в 64-битной операционной системе Windows. Для VMware код может успешно обнаруживаться в 64-разрядной ОС Windows XP. Но программа вылетает, когда я запускаю ее в родной системе (64-разрядная ОС Windows 7).
Я помещаю код в файл .asm и определяю пользовательский этап сборки с помощью файла ml64.exe. Ассемблерный код для 64-битной Windows:
IsInsideVM proc
push rdx
push rcx
push rbx
mov rax, 'VMXh'
mov rbx, 0 ; any value but not the MAGIC VALUE
mov rcx, 10 ; get VMWare version
mov rdx, 'VX' ; port number
in rax, dx ; read port
; on return EAX returns the VERSION
cmp rbx, 'VMXh'; is it a reply from VMWare?
setz al ; set return value
movzx rax,al
pop rbx
pop rcx
pop rdx
ret
IsInsideVM endp
Я вызываю эту часть в файле cpp следующим образом:
__try
{
returnValue = IsInsideVM();
}
__except(1)
{
returnValue = false;
}
Заранее спасибо.