Определить при запуске на виртуальной машине

33

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

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

  • 1
    Просто любопытно, в чем смысл знать, что вы находитесь на ВМ? Я всегда рассматривал одно из основных преимуществ ВМ, которое (в идеале) вам не нужно знать, используете ли вы физическое оборудование или нет.
  • 0
    Любопытство действительно. Сотрудник спросил, и я вспомнил, что читал об этом, но не был уверен, что лучший путь. Хотя я мог видеть желание ограничить работу вашего приложения в виртуальной машине из соображений безопасности, но это было бы действительно раздражающим для ваших пользователей. Я знаю, что Virtual PC не позволит вам работать в VMWare (по крайней мере, когда я пытался).
Теги:
vmware
virtualization
virtualbox
virtual-pc

10 ответов

34
Лучший ответ

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

  • 0
    Это были статьи, которые я вспомнил, читая об этом. Спасибо! Код даже в Delphi.
  • 2
    Следует отметить, что он не использует какую-либо официально документированную схему для обнаружения присутствия VirtualPC. Он использует инструкции, которые должны быть недействительными на реальном оборудовании, которые VPC использует для связи с внешним миром. Ничто не говорит о том, что эти инструкции не могут измениться в будущем или что Intel не может выпустить процессор, который затем использует эти «неиспользуемые» инструкции.
5

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

  • 1
    Я смотрел на эту ссылку раньше, но, так как ей было 4 года, я не нашел никаких источников, поэтому я не был уверен, что она все еще действительна. Программное обеспечение для виртуализации сильно изменилось с тех пор.
  • 0
    он сильно изменился, но этот пример проверяет регистр, который гипервизор использует для прерываний, и будучи человеком, который знает некоторую информацию о гипервизорах, эта часть еще не изменилась
Показать ещё 3 комментария
2

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

2

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

1

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

dmidecode | egrep -i 'manufacturer|product'

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

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

  • 0
    Похоже, что dmidecode требует разрешения root.
1

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

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

  • 1
    Проблема с RedPill и аналогичными методами, такими как начальный scoopy_doo, заключается в том, что он выдает ложные срабатывания при работе на многоядерных системах. Google для "NoPill" для получения дополнительной информации.
  • 0
    Кроме того, другие методы устарели или дают ложные срабатывания: charette.no-ip.com:81/programming/2009-12-30_Virtualization/…
Показать ещё 1 комментарий
1

Здесь есть WMI-способ: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx

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

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

  • 0
    Существует также Virtualbox, и VMWare среди других.
  • 0
    Правильно, именно здесь все немного ненадежно, если вы тоже хотите это проверить - вам нужно посмотреть информацию об оборудовании, предоставленную этими другими виртуальными машинами, чтобы увидеть, какое специальное значение вы можете там найти. Тем не менее, вопрос требует VPC, и этот код обрабатывает его. Я бы сказал, что WMI, независимо от виртуальной машины, является лучшим выбором для унифицированного способа получения необходимой информации, так как все, что вам нужно изменить, - это запрос и имя поля, которое вы проверяете.
0
dmidecode -s system-product-name

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

Virtualbox
0

Мне посчастливилось просто взглянуть на 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;  
  • 0
    Также имейте в виду, что большинство программ виртуализации позволит вам изменить MAC-адрес по своему вкусу. Таким образом, этот метод не является надежным.
0

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

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

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

15ad: 1976

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню