Подтвердить что ты не робот

Как определить, что вы работаете под виртуальной машиной?

Есть ли способ идентифицировать внутри VM, что ваш код работает внутри VM?

Я думаю, что есть более или менее простые способы идентификации конкретных систем VM, особенно если на виртуальной машине установлены расширения провайдера (например, для VirtualBox или VMWare). Но существует ли общий способ определить, что вы не работаете непосредственно с процессором?

4b9b3361

Ответ 1

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

Классический трюк для обнаружения виртуальной машины - это заполнение ITLB, запуск команды, в которой виртуализируется должна (которая обязательно очищает такое состояние процессора, когда она дает управление гипервизору), а затем запускать некоторые больше кода для определения того, заполняется ли ITLB. Первая статья на нем находится здесь, и довольно красочное объяснение от блог исследователя и альтернативный ссылка Wayback Machine на статью в блоге (изображения сломанные).

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

Ответ 2

В Red Hat есть программа, которая обнаруживает, какой (если есть) продукт виртуализации работает под: virt-what.

Используя поддерживаемый сторонними инструментами такой инструмент, это лучшая стратегия в долгосрочной перспективе, чем попытка опрокинуть собственную логику обнаружения: больше глаз (тестирование против продуктов виртуализации) и т.д.

Ответ 3

Более эмпирический подход заключается в проверке известных драйверов устройств VM. Вы можете написать WMI-запросы, чтобы найти, скажем, адаптер отображения VMware, дисковод, сетевой адаптер и т.д. Это было бы удобно, если бы вы знали, что вам нужно беспокоиться только о известных типах хостов VM в вашей среде. Здесь пример этого в Perl, который можно портировать на выбранный вами язык.

Ответ 4

Это зависит от того, что вы после:

  • Если виртуальная машина не скрывается от вас специально, вы можете использовать какой-то известный крючок. LIke ищет драйверы VmWare или наличие определенных строк в памяти или некоторые другие контрольные признаки.

  • Если виртуальная машина действительно хочет, чтобы вы делали для нее особые вещи, у нее будет некоторый очевидный крючок на месте, например, изменение идентификатора процессора или добавление некоторых специальных регистров, к которым вы можете получить доступ, чтобы обнаружить его. Или специальное устройство в известном месте в памяти (предполагая, что вы можете получить необработанный доступ к физическому пространству памяти вашего мира). NOte, что современные конструкции машин, такие как IBM Power6 и Sun UltraSparc T1/T2, предназначены для ВСЕГО запускать гипервизор и никогда напрямую на необработанное оборудование. Интерфейс к "аппаратным средствам", который использует ОС, на самом деле является интерфейсом программного слоя гипервизора, без возможности обойти его. В этом случае обнаружение тривиально, поскольку оно является постоянным "да". Это вероятное будущее направление для всех компьютерных систем, которые могут позволить себе накладные расходы, посмотрите на поддержку в последних проектах, таких как чип Freescale QorIQ P4080, например (www.freescale.com/qoriq).

  • Если виртуальная машина намеренно пытается скрыть, и вы преследуете ее присутствие, это игра с кошачьей мышью, где временное нарушение и разный профиль производительности виртуальной машины почти всегда будут давать это далеко. Очевидно, что это зависит от того, как реализована виртуальная машина и сколько аппаратной поддержки существует в архитектуре (я думаю, что мэйнфрейм zSeries намного лучше скрывает присутствие виртуальной машины или стека виртуальных машин под вашей конкретной ОС, чем обычный x86 машина, например). См. http://jakob.engbloms.se/archives/97 для обсуждения этой темы. Можно попытаться скрыть как виртуальную машину, но обнаружение, скорее всего, всегда будет побеждать, если он будет достаточно стараться.

Ответ 6

В большинстве случаев вы не должны пытаться. Вам все равно, будет ли кто-то запускать ваш код в виртуальной машине, за исключением нескольких конкретных случаев.

Если вам нужно, в Linux наиболее распространенным способом является просмотр /sys/devices/virtual/dmi/id/product_name, в котором будет указано имя ноутбука/материнской платы на большинстве реальных систем и гипервизор для большинства виртуальных систем. dmidecode | grep Product - еще один распространенный метод, но я считаю, что для этого требуется root-доступ.

Ответ 7

Хорошим примером является то, что, по-видимому, делает запрос WMI для производителя материнской платы, и если он возвращает "Microsoft", вы находитесь в виртуальной машине. Думаю, я считаю, что это только для VMWare. Для каждого программного обеспечения хоста VM могут быть разные способы.

Эта статья здесь http://blogs.technet.com/jhoward/archive/2005/07/26/407958.aspx содержит несколько полезных предложений и ссылок на несколько способов определить, находитесь ли вы в виртуальной машине (VMWare и VirtualPC по крайней мере).

Ответ 8

Возможно, вы сможете определить, находитесь ли вы на виртуальной машине, просматривая MAC-адрес вашего сетевого подключения. Например, Xen обычно рекомендует использовать определенный диапазон адресов 00: 16: 3e: xx: xx: xx.

Это не гарантируется, как администратору системы, чтобы указать, какой MAC-адрес им нравится.

Ответ 11

Если он VM хорошо выполняет работу, он должен быть невидимым для клиента, чтобы он был виртуализирован. Однако можно посмотреть другие подсказки.

Я бы предположил, что поиск известных драйверов или программного обеспечения, специфичных для среды VM, будет наилучшим способом.

Например, на клиенте VMWare, работающем под управлением Windows, vmxnet.sys будет сетевым драйвером, отображаемым как ускоренный VMware адаптер AMD PCNet.