Как определить, что вы работаете под виртуальной машиной? - PullRequest
27 голосов
/ 02 сентября 2008

Есть ли способ определить изнутри ВМ, что ваш код выполняется внутри ВМ?

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

Ответы [ 12 ]

20 голосов
/ 02 сентября 2008

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

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

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

11 голосов
/ 20 сентября 2008

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

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

6 голосов
/ 02 сентября 2008

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

4 голосов
/ 28 сентября 2008

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

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

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

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

2 голосов
/ 02 сентября 2008

Однажды я наткнулся на фрагмент кода сборки, в котором сообщалось, что вы работаете в ВМ .... Я гуглил, но не смог найти оригинальную статью.

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

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

1 голос
/ 20 июня 2018

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

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

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

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

Модель

  • HVM domU
  • Виртуальная машина
  • VirtualBox
  • KVM
  • VMware Virtual Platform

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class OSUtil {
    
    public static final List<String> readCmdOutput(String command) {
        List<String> 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<String> 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
Производитель оборудования: Virtual Box

1 голос
/ 02 сентября 2008

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

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

0 голосов
/ 27 ноября 2013

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

Например, существующий файл / proc / vz / сказать вам, является OpenVZ.

Вот полное руководство по обнаружению среды виртуальной машины под Linux без необходимости "пить таблетки":)

0 голосов
/ 30 июля 2010

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

0 голосов
/ 02 сентября 2008

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

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

...