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

StackOverflow https://stackoverflow.com/questions/39533

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Это зависит от того, чего вы добиваетесь:

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

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

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

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

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

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

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

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

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

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

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

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

Модель

  • HVM domU
  • Виртуальная машина
  • Виртуальный ящик
  • 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<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
Производитель оборудования:Виртуальный ящик

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top