Обнаружение 64-битных окон VMware

Я пытаюсь разработать приложение, которое определяет, запущена ли программа внутри виртуальной машины.

Для 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;
}

Заранее спасибо.

9
задан menjaraz 11 April 2012 в 07:19
поделиться