Вы можете использовать пользовательские события, но пользовательские события должны быть отправлены сначала для автоматического завершения. Если имя события не указано в списке автозаполнения, вы можете ввести имя и нажать Enter.
Многие исследования по этому вопросу посвящены обнаружению так называемых «синих таблеток», то есть злонамеренного гипервизора, который активно пытается избежать обнаружения.
Классический трюк для обнаружения виртуальной машины - это заполнение ITLB, запуск команды, которая должна быть виртуализирована (которая обязательно очищает такое состояние процессора, когда она дает управление гипервизору), а затем запускает еще один код для определить, заполняется ли ITLB. Первая статья о ней находится здесь и довольно красочное объяснение из блога исследователя и альтернативного Wayback Machine ссылки на статью блога (изображения сломаны) .
В нижней части обсуждения этого вопроса всегда есть способ обнаружения вредоносного гипервизора, и гораздо проще обнаружить тот, который не пытается скрыть.
Хорошим примером является то, что, по-видимому, делает запрос WMI для производителя материнской платы, и если он возвращает «Microsoft», вы находитесь в виртуальной машине. Думаю, я считаю, что это только для VMWare. Вероятно, для каждого программного обеспечения хоста VM могут быть разные способы.
Эта статья здесь http://blogs.technet.com/jhoward/archive/2005/07/26/407958.aspx имеет несколько хороших предложений и ссылок на несколько способов определить, находитесь ли вы в виртуальной машине (VMWare и VirtualPC по крайней мере).
TrapKIT предоставляет ScoopyNG, инструмент для идентификации VMware - он пытается обойти методы уклонения, но не обязательно нацелен на какое-либо программное обеспечение для виртуализации, отличное от VMware. Доступны как исходные, так и двоичные файлы.
В системах Linux вы можете попытаться найти общие файлы на /proc.
Например, existente of / proc / vz / сообщает вам, что OpenVZ.
Вот полное руководство по обнаружению среды VM под Linux без необходимости «пить таблетки»:)
Я однажды наткнулся на фрагмент кода сборки, который сказал вам, что вы были в виртуальной машине ... Я искал Google, но не смог найти оригинальную статью.
Я нашел это, хотя: Определите, работает ли ваша программа внутри виртуальной машины .
Надеюсь, что это поможет.
Это зависит от того, что вы после:
У Red Hat есть программа, которая обнаруживает, какой (если есть) продукт виртуализации работает под: virt-what
.
Использование стороннего инструмента, это лучшая стратегия на долгое время, чем попытка опрокинуть собственную логику обнаружения: больше глаз (тестирование против продуктов виртуализации) и т. д.
Если VM хорошо выполняет работу, она должна быть невидимой для клиента, что она виртуализована. Тем не менее, можно взглянуть на другие подсказки.
Я бы предположил, что поиск известных драйверов или программного обеспечения, специфичных для среды VM, будет наилучшим возможным способом.
Например, на Клиент VMWare, работающий под управлением Windows, vmxnet.sys будет сетевым драйвером, отображаемым как ускоренный VMware адаптер AMD PCNet.
Вот решение ( java + windows ), чтобы определить, является ли основной компьютер физическим или виртуальным.
Примеры виртуальных машин:
Производитель
g13]Модель
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 Производитель: Виртуальная коробка
Более эмпирический подход заключается в проверке известных драйверов устройств VM. Вы можете написать WMI-запросы, чтобы найти, скажем, адаптер отображения VMware, дисковод, сетевой адаптер и т. Д. Это было бы удобно, если бы вы знали, что вам нужно беспокоиться только о известных типах хостов VM в вашей среде. Вот пример этого в Perl , который можно портировать на выбранный вами язык.
Возможно, вы сможете определить, находитесь ли вы на виртуальной машине, просматривая MAC-адрес вашего сетевого соединения. Например, Xen обычно рекомендует использовать определенный диапазон адресов 00: 16: 3e: xx: xx: xx.
Это не гарантируется, так как администратор системы должен указать, какой MAC-адрес они как.
В большинстве случаев вы не должны пытаться. Вам все равно, если кто-то запускает ваш код в виртуальной машине, за исключением нескольких конкретных случаев.
Если вам нужно, в Linux наиболее распространенным способом является просмотр /sys/devices/virtual/dmi/id/product_name
, который будет укажите имя ноутбука / материнской платы на большинстве реальных систем и гипервизор на большинстве виртуальных систем. dmidecode | grep Product
- еще один распространенный метод, но я думаю, что для этого нужен root-доступ.