Определить при запуске на виртуальной машине - PullRequest
36 голосов
/ 23 апреля 2009

Существует ли официальный способ для приложения определить, работает ли оно в VMWare или Virtual PC (или как Microsoft называет это сейчас)? Код, который я видел, обычно является хаком, использующим некоторые странные поведенческие побочные эффекты в конкретной версии VMWare или Virtual PC.

В идеале код Delphi, но если вы можете дать ссылку на официальное объяснение, то я уверен, что смогу преобразовать его.

Ответы [ 10 ]

34 голосов
/ 23 апреля 2009

В прошлом году я написал серию статей на эту тему с исходным кодом. VMware и Wine Detection здесь . Виртуальный ПК здесь . Все три из них имеют довольно железное обнаружение, потому что есть задокументированные обратные вызовы к гипервизору (в случае Wine, расширение стандартной DLL). Я разместил непроверенный детектор VirtualBox (не установлен для тестирования) в разделе комментариев. Parallels также может быть обнаружен с помощью обратного вызова, но у меня его нет. Ссылка на документацию (которая является плохой, так как она от исследователя безопасности, специализирующегося на эксплойтах), но расположена здесь , если она установлена ​​и заинтересована Здесь также есть PPT здесь , в котором есть некоторая информация по обнаружению Sandbox, Bochs и Xen. В нем не так много кода, но он может дать вам отправную точку, если вам придется их обнаруживать.

5 голосов
/ 23 апреля 2009

Code Project показывает способ Определить, работает ли ваша программа внутри виртуальной машины , в которой подробно описывается, как ее выполнить, чтобы дать хорошее понимание

2 голосов
/ 23 апреля 2009

В этой теме на форумах SysInternals есть несколько ответов (конечно же, в Delphi), включая одну функцию IsVM. Я проверил на XP и Win2003, размещенных на XP и Vista в VMWare, с хорошими результатами.

2 голосов
/ 23 апреля 2009

Я думаю, что лучший подход к этому - проверить аппаратные профили. Виртуализированное оборудование обычно использует часть названия компании. Если вы проверите описание материнской платы в Virtual PC, вы заметите, что это сделано корпорацией Microsoft. Аналогично в VMWare ваш сетевой адаптер будет иметь префикс VMNet.

1 голос
/ 20 октября 2010

Для определения физического или виртуального компьютера

dmidecode | egrep -i 'manufacturer|product'

Если команда dmidecode не найдена, установите соответствующие обороты в минуту.

Это проверено на машинах EXSI, VMWARE и HyperV.

1 голос
/ 01 декабря 2009

Мне повезло, что я просто посмотрел на MAC-адрес, поскольку все производители получают блок, а первые 3 части уникальны для них.

//look at the MAC address and determine if it's a Virtual Machine
$temp = preg_split("/\s+/",exec("/sbin/ifconfig -a eth0 2>&1 | /bin/grep HWaddr"), -1, PREG_SPLIT_NO_EMPTY);
//Virtual Box MACs all start with '08:00:27:xx:xx:xx'
if (strpos($temp[4], '08:00:27') !== false) $_SESSION['DEVELOPMENT'] = true;  
1 голос
/ 25 апреля 2009

Я использовал метод RedPill (переведенный на Delphi, но код не так сложен для понимания), который работал довольно хорошо. Я также включил несколько дополнительных проверок, используя вызовы WMI, чтобы получить такие вещи, как имя поставщика сетевого адаптера и авторские права, но это было для обнаружения определенных версий Virtual PC.

Мое понимание метода RedPill состоит в том, что он должен работать и обнаруживать все виртуальные машины в зависимости от характера его работы. Существует вероятность того, что ложные срабатывания могут быть сгенерированы также, поскольку новая функция Windows в Windows Windows 7 может быть настроена для плавного запуска выбранных программ в копии Windows XP в Windows 7.

1 голос
/ 23 апреля 2009

Здесь опубликован способ WMI: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx

Я дважды проверил образ XP, запущенный на Virtual PC, и значение, которое они проверяют, остается прежним. Я не буду гарантировать, что другие ВМ вернутся сюда, хотя ...

У меня фактически есть программа на Delphi, которую я написал пару лет назад, чтобы получить список и изменить принтер по умолчанию с помощью WMI, не требуя сторонних компонентов или чего-либо подобного. В случае, если вы не привыкли работать с WMI из Delphi, я могу отправить вам копию, чтобы у вас было что отработать (хотя она не обязательно совместима с Unicode, но мне не должно быть слишком сложно ее обновить) при необходимости).

0 голосов
/ 17 ноября 2010
dmidecode -s system-product-name

Протестировано на VirtualBox, результат:

Virtualbox
0 голосов
/ 29 мая 2009

Если вы хотите обычно обнаруживать наличие любого типа виртуализации, вам лучше всего проанализировать характеристики производительности. Возьмите что-то, что значительно медленнее в виртуализации (например, тяжелую рабочую нагрузку MMU, например, бомбу-бомбу), и сопоставьте ее с обычным приложением пространства пользователя, связанным с ЦП. Из соотношения можно легко отличить.

Самое простое с точки зрения усилий, если вы заботитесь только об определенных VMM, это искать их оборудование, т.е. устройства VMware PCI:

00: 07.3 Мост: Intel Corporation 82371AB / EB / MB PIIX4 ACPI (версия 08) Подсистема: VMware Inc Чипсет виртуальной машины

15ad: 1976

Значение поставщика - 15ad

Существуют также специальные бэкдор-порты, которые работают в разных VMM в разных версиях. Трюк SIDT тоже хорош, но что если VMM нет в списке, который проверяет его код?

...