Как скрипт Python обнаруживает, запущен ли он в Virtualbox или какой-либо другой виртуальной машине? [Дубликат]

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

27
задан Wilson 2 September 2008 в 14:39
поделиться

12 ответов

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

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

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

20
ответ дан Andrew Peters 25 August 2018 в 11:22
поделиться
  • 1
    Я не уверен, что данный подход будет работать с хостами с использованием NPT / EPT. – Charles Duffy 24 September 2008 в 04:11

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

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

0
ответ дан Adam Haile 25 August 2018 в 11:22
поделиться

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

0
ответ дан Charles Duffy 25 August 2018 в 11:22
поделиться
  • 1
    Это был ... довольно редкий ответ, как изначально написано. – Charles Duffy 5 November 2014 в 14:34

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

Например, existente of / proc / vz / сообщает вам, что OpenVZ.

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

0
ответ дан erm3nda 25 August 2018 в 11:22
поделиться

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

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

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

2
ответ дан Giovanni Galbo 25 August 2018 в 11:22
поделиться

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

  • Если виртуальная машина не скрывается от вас специально, вы можете использовать какой-то известный крючок. LIke ищет драйверы VmWare или наличие определенных строк в памяти или некоторые другие контрольные признаки.
  • Если виртуальная машина действительно хочет, чтобы вы делали для нее особые вещи, у нее будет некоторый очевидный крючок на месте, например, изменение идентификатора процессора или добавление некоторых специальных регистров, к которым вы можете получить доступ, чтобы обнаружить его. Или специальное устройство в известном месте в памяти (предполагая, что вы можете получить необработанный доступ к физическому пространству памяти вашего мира). NOte, что современные конструкции машин, такие как IBM Power6 и Sun UltraSparc T1 / T2, предназначены для ВСЕГО запускать гипервизор и никогда напрямую на необработанное оборудование. Интерфейс к «аппаратным средствам», который использует ОС, на самом деле является интерфейсом программного слоя гипервизора, без возможности обойти его. В этом случае обнаружение тривиально, поскольку оно является постоянным «да». Это вероятное будущее направление для всех компьютерных систем, которые могут позволить себе накладные расходы, посмотрите на поддержку в последних проектах, таких как чип Freescale QorIQ P4080, например (www.freescale.com/qoriq).
  • Если виртуальная машина намеренно пытается скрыть, и вы преследуете ее присутствие, это игра с кошкой и мышью, где временное нарушение и разный профиль производительности виртуальной машины почти всегда будут давать это прочь. Очевидно, что это зависит от того, как реализована виртуальная машина и сколько аппаратной поддержки существует в архитектуре (я думаю, что мэйнфрейм zSeries намного лучше скрывает присутствие виртуальной машины или стека виртуальных машин под вашей конкретной ОС, чем обычный x86 машина, например). См. http://jakob.engbloms.se/archives/97 для обсуждения этой темы. Можно попытаться скрыть как виртуальную машину, но обнаружение, скорее всего, всегда будет побеждать, если он будет достаточно стараться.
3
ответ дан jakobengblom2 25 August 2018 в 11:22
поделиться

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

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

9
ответ дан Joe 25 August 2018 в 11:22
поделиться

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

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

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

-1
ответ дан Mythokia 25 August 2018 в 11:22
поделиться

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

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

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

g13]
  • Xen
  • Корпорация Microsoft
  • innotek GmbH
  • Red Hat
  • 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 Hardware Производитель: Виртуальная коробка

0
ответ дан Pritesh Mhatre 25 August 2018 в 11:22
поделиться

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

6
ответ дан spoulson 25 August 2018 в 11:22
поделиться
  • 1
    мой компьютер - & gt; свойства - & gt; hardware - & gt; диспетчер устройств посмотрите на адаптер дисплея - вы, как правило, увидите VMware VM или что-то VMWare ... – thedrs 31 May 2009 в 07:19
  • 2
    Системы виртуализации могут и действительно подражать реальному оборудованию (даже если это часто старое / устаревшее оборудование, в частности, с видеодрайверами, эмуляция Matrox распространена, а на настольном ПК ее почти никогда не встречается, но их чипсеты также используются на серверных чипсетах с KVM удаленный доступ, так что они могут произойти и в не виртуализированных ситуациях), или даже сделать пересылку PCI, чтобы обеспечить полный контроль виртуальной видеокарты. (Некоторые высокопроизводительные сетевые карты имеют несколько конечных точек PCI, позволяя виртуальным машинам полностью управлять подмножеством реальной физической сетевой карты). – Charles Duffy 1 June 2018 в 12:09

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

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

0
ответ дан tonylo 25 August 2018 в 11:22
поделиться
  • 1
    Кроме того, любая компания VM может в любое время зарегистрироваться для нового диапазона номеров MAC-адресов. В настоящее время VMWare имеет 4 разных диапазона MAC (в соответствии с поиском в ieee.org для присвоенных номеров). – Jesse Chisholm 26 May 2013 в 15:33

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

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

2
ответ дан wvdschel 25 August 2018 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: