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

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

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

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

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

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

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

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

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

    Это зависит от того, что вам нужно:

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

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

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

    Я однажды наткнулся на fragment кода сборки, который сказал вам, если вы были в виртуальной машине … Я искал Google, но не смог найти оригинальную статью.

    Я нашел это, хотя: Обнаруживает, работает ли ваша программа внутри виртуальной машины .

    Надеюсь, поможет.

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

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

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

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

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

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

    В системах Linux вы можете попытаться найти общие файлы в / proc.

    Например, существование / proc / vz / говорит вам, что это OpenVZ.

    Вот полное руководство по обнаружению среды VM под Linux без необходимости «пить таблетки» 🙂

    TrapKIT предоставляет ScoopyNG, инструмент для идентификации VMware – он пытается обойти методы уклонения, но не обязательно нацелен на любое программное обеспечение для виртуализации, отличное от VMware. Доступны как исходные, так и двоичные файлы.

    Вот решение ( java + windows ), чтобы определить, является ли основной компьютер физическим или виртуальным.

    Примеры виртуальных машин:

    производитель

    • Xen
    • Корпорация Майкрософт
    • innotek GmbH
    • Красная Шапка
    • VMware, Inc.

    Модель

    • HVM domU
    • Виртуальная машина
    • VirtualBox
    • KVM
    • Виртуальная платформа VMware

       import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public abstract class OSUtil { public static final List readCmdOutput(String command) { List result = new ArrayList<>(); try { Process p=Runtime.getRuntime().exec("cmd /c " + command); p.waitFor(); BufferedReader reader=new BufferedReader( new InputStreamReader(p.getInputStream()) ); String line; while((line = reader.readLine()) != null) { if(line != null && !line.trim().isEmpty()) { result.add(line); } } } catch (Exception e) { e.printStackTrace(); } return result; } public static final String readCmdOutput(String command, int lineNumber) { List result = readCmdOutput(command); if(result.size() < lineNumber) { return null; } return result.get(lineNumber - 1); } public static final String getBiosSerial() { return readCmdOutput("WMIC BIOS GET SERIALNUMBER", 2); } public static final String getHardwareModel() { return readCmdOutput("WMIC COMPUTERSYSTEM GET MODEL", 2); } public static final String getHardwareManufacturer() { return readCmdOutput("WMIC COMPUTERSYSTEM GET MANUFACTURER", 2); } public static void main(String[] args) { System.out.println("BIOS Serial: " + getBiosSerial()); System.out.println("Hardware Model: " + getHardwareModel()); System.out.println("Hardware Manufacturer: " + getHardwareManufacturer()); } } 

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

    Выход физической машины:

    BIOS Последовательность: 2HC3J12
    Модель оборудования: Inspiron 7570
    Производитель оборудования: Dell Inc.

    Выход виртуальной машины:

    Последовательность BIOS: 0
    Аппаратная модель: Innotec GmBH
    Производитель оборудования: виртуальная коробка

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

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

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

    Давайте будем гением компьютера.