Есть ли официальный способ для приложения определить, работает ли он в VMWare или Virtual PC (или что-то еще, что Microsoft называет его сейчас)? Код, который я видел, обычно является взломом, который воспользовался некоторым нечетным поведенческим побочным эффектом в конкретной версии VMWare или Virtual PC.
В идеале код Delphi, но если вы можете ссылаться на официальное объяснение, я уверен, что смогу его преобразовать.
В прошлом году я написал серию статей с исходным кодом. Обнаружение VMware и Wine здесь. Виртуальный ПК здесь. Все три из них имеют довольно железистое обнаружение, потому что есть документальные обратные вызовы для гипервизора (в случае Wine, расширение для стандартной DLL). Я помещаю в раздел комментариев непроверенный детектор VirtualBox (не проверяя его). Параллели можно обнаружить с помощью обратного вызова, но у меня его нет. Ссылка на документацию (которая неудовлетворительна, поскольку она от исследователя безопасности, ориентированного на эксплойты), но расположена здесь, если вы ее установили и заинтересованы, Там также есть PPT здесь, в котором есть информация об обнаружении Sandbox, Bochs и Xen. В нем не много кода, но это может дать вам отправную точку, если вам нужно их обнаружить.
Code Project показывает способ Обнаруживать, работает ли ваша программа внутри виртуальной машины, которая подробно рассказывает о том, как ее выполнить хорошее понимание
В этом потоке на форумах SysInternals есть несколько ответов (в Delphi, конечно), включая одну функцию IsVM. Я тестировал на XP и Win2003, размещенные как на XP, так и на Vista в VMWare с хорошими результатами.
Я думаю, что лучший подход к этому - проверить аппаратные профили. Виртуализированное оборудование обычно использует часть названия компаний. Если вы проверите описание материнской платы на виртуальном ПК, вы заметите, что это сделано корпорацией Microsoft. Аналогично в VMWare ваш адаптер ethernet будет префикс VMNet.
Чтобы определить, что машина физическая или VM
dmidecode | egrep -i 'manufacturer|product'
Если команда dmidecode не найдена, установите соответствующие обороты.
Это проверено в соответствии с машинами EXSI, VMWARE и hyperv.
dmidecode
требует разрешения root.
Я использовал метод RedPill (переведен на Delphi, но код не так уж трудно понять), который работал достаточно хорошо, Я также включил несколько дополнительных проверок, используя вызовы WMI, чтобы получить такие вещи, как имя и авторские права сетевого адаптера, но это было для обнаружения определенных версий Virtual PC.
Мое понимание метода RedPill заключается в том, что он должен работать и обнаруживать все виртуальные машины, основываясь на характере работы. Существует вероятность того, что ложные срабатывания могут быть сгенерированы также, так как новая ОС Windows в Windows 7 может быть настроена для запуска отдельных программ в копии Windows XP без проблем внутри Windows 7.
Здесь есть WMI-способ: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx
Я дважды проверял изображение XP, работающее на Virtual PC, и значение, которое они тестируют, по-прежнему остается прежним. Я не буду гарантировать, что другие VM вернутся сюда, хотя...
У меня есть программа Delphi, которую я написал пару лет назад, чтобы получить список и изменить принтер по умолчанию с использованием WMI, не требуя сторонних компонентов или чего-либо подобного. Если вы не привыкли работать с WMI из Delphi, я могу отправить вам копию, чтобы у вас было что-то для работы (это не обязательно совместимо с Unicode, но мне не должно быть слишком сложно обновить ее если потребуется).
dmidecode -s system-product-name
Протестировано на VirtualBox, результат:
Virtualbox
Мне посчастливилось просто взглянуть на MAC-адрес, поскольку всем производителям дается блок, и первые 3 части уникальны для них.
//look at the MAC address and determine if it 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;
Если вы хотите вообще обнаружить присутствие любого типа виртуализации, лучше всего анализировать характеристики производительности. Возьмите что-то, что значительно медленнее в виртуализации (например, тяжелая рабочая нагрузка MMU, например, вилка-бомба), и время, затрачиваемое на обычное приложение для пользовательского пространства. Из соотношения, которое вы можете легко сказать.
Самый простой в плане усилий, если вы только заботитесь о некоторых VMM, - это искать их оборудование, то есть устройства VMware PCI:
00: 07.3 Мост: Корпорация Intel 82371AB/EB/MB PIIX4 ACPI (rev 08) Подсистема: набор микросхем виртуальной машины VMware Inc
15ad: 1976
Значение поставщика: "15ad"
Существуют также специальные порты backdoor, которые работают в разных VMM в различных версиях. SIDT трюк тоже хорош, но что, если VMM отсутствует в списке, который проверяет его код?