Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

//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;  

Чтобы определить, является ли машина физической или виртуальной машиной

dmidecode | egrep -i 'manufacturer|product'

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

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

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

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

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

15 августа 1976 года

Значение поставщика равно "15ad".

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

dmidecode -s system-product-name

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

Virtualbox
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top