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

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

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


person Wilson    schedule 02.09.2008    source источник
comment
Вы ищете теоретический ответ (т. Е. Документ или алгоритм, необходимая реализация, обеспечивающий механизм, предназначенный для защиты от маловероятного класса атак) или практический (т. Е. Рабочий код, предназначенный для обработки обычных, не вредоносных случаев)?   -  person Charles Duffy    schedule 25.09.2008
comment
То, что вы делаете, это то, что у вас есть небольшая вещь, которую вы всегда носите с собой, и которую вы никому не позволяете трогать. И если он кажется правильным и ведет себя правильно, значит, вы работаете не на виртуальной машине. (Не удержался. Извините.)   -  person Zarkonnen    schedule 30.07.2010


Ответы (12)


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

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

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

person JawnV6    schedule 02.09.2008
comment
Не уверен, что данный подход будет работать с хостами, использующими NPT / EPT. - person Charles Duffy; 24.09.2008


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

person spoulson    schedule 02.09.2008
comment
мой компьютер - ›свойства -› оборудование - ›диспетчер устройств посмотрите на адаптер дисплея - вы обычно увидите что-то microsoft VM или что-то VMWare ... - person thedrs; 31.05.2009
comment
Системы виртуализации могут и действительно эмулируют реальное оборудование (даже если это часто старое / устаревшее оборудование; если говорить конкретно о видеодрайверах, эмуляция Matrox является обычным явлением, хотя почти никогда не встречается на настольных компьютерах, но их наборы микросхем также используются на серверных наборах микросхем с KVM. удаленного взаимодействия, поэтому они могут происходить и в невиртуализированных ситуациях), или даже могут выполнять сквозную передачу PCI, чтобы предоставить виртуальной машине полный контроль над реальной видеокартой. (Некоторые высокопроизводительные сетевые карты имеют несколько оконечных точек PCI, что позволяет виртуальным машинам передавать полный контроль над подмножеством реальной физической сетевой карты). - person Charles Duffy; 01.06.2018

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

  • Если виртуальная машина не скрывается от вас намеренно, вы можете воспользоваться какой-нибудь известной ловушкой. ПОЖАЛУЙСТА, ищу драйверы VmWare, наличие определенных строк в памяти или другие контрольные признаки.

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

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

person jakobengblom2    schedule 27.09.2008

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

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

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

person Giovanni Galbo    schedule 02.09.2008
comment
Вы думаете о подходе «Красная таблетка» или «Без таблеток». Этот метод больше не работает. (Можно утверждать, что и в 2004 году это не сработало, хотя многопроцессорные и многоядерные системы были менее распространены.) См. charette.no-ip.com:81/programming/2009-12-30_Virtualization/ - person Stéphane; 02.01.2010

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

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

person wvdschel    schedule 02.09.2008

Вот решение (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<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

person Pritesh Mhatre    schedule 20.06.2018
comment
Я бы реализовал это решение и для Linux, но мне понадобится список моделей для самых известных виртуальных систем, где, как вы думаете, я могу найти это - person Lukas Owen; 12.12.2019
comment
Список в ответе охватывает наиболее широко используемое программное обеспечение для виртуализации. - person Pritesh Mhatre; 14.12.2019
comment
@LukasOwen См. Список виртуальных машин: en.wikipedia.org/wiki/ - person Sorry IwontTell; 14.11.2020

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

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

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

person Mythokia    schedule 02.09.2008

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

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

person Adam Haile    schedule 02.09.2008

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

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

person tonylo    schedule 02.09.2008
comment
Кроме того, любая компания, занимающаяся виртуальными машинами, может в любое время зарегистрироваться для получения нового диапазона номеров MAC-адресов. VMWare в настоящее время имеет 4 различных диапазона MAC (согласно поиску на ieee.org по присвоенным номерам). - person Jesse Chisholm; 26.05.2013

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

Например, файл / proc / vz / скажет вам, что это OpenVZ.

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

person m3nda    schedule 26.11.2013

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

person Tim    schedule 30.07.2010
comment
Это был ... довольно скудный ответ, как было написано изначально. - person Charles Duffy; 05.11.2014