Determinar cuándo se ejecuta en una máquina virtual


¿Existe una forma oficial para que una aplicación determine si se está ejecutando en VMware o Virtual PC (o como sea que Microsoft lo llame ahora)? El código que he visto es por lo general un truco que se aprovechó de algún extraño efecto secundario del comportamiento en una versión específica de VMware o Virtual PC.

Idealmente código Delphi, pero si puedes enlazar a una explicación oficial entonces estoy seguro de que puedo convertirlo.

Author: Jim McKeeth, 2009-04-23

10 answers

Escribí una serie de artículos el año pasado sobre esto, con código fuente. VMware y Wine detection están aquí. El PC virtual está aquí. Los tres tienen una detección bastante estricta porque hay devoluciones de llamada documentadas al hipervisor (en el caso de Wine, una extensión a una DLL estándar). Puse un detector VirtualBox no probado (no lo tengo instalado para probarlo) en la sección de comentarios. Parallels podría ser detectable usando una devolución de llamada también, pero no lo tengo instalado. El enlace para la documentación (que es pobre ya que es de un investigador de seguridad centrado en exploits) pero ubicado aquí si lo tienes instalado y estás interesado. También hay un PPT aquí que tiene alguna información sobre la detección de Sandbox, Bochs y Xen. No hay mucho código en él, pero podría darle un punto de partida si tiene que detectarlos.

 34
Author: Marshall Fryman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-11 04:47:36

El proyecto de código muestra una forma de Detectar si su programa se está ejecutando dentro de una Máquina Virtual que va en mucho detalle sobre cómo lograrlo para dar una buena comprensión

 5
Author: TStamper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 23:55:18

Creo que el mejor enfoque para esto es comprobar los perfiles de hardware. El hardware virtualizado generalmente utiliza parte del nombre de la empresa. Si revisa la descripción de la placa base mientras está en la PC virtual, notará que está hecha por "Microsoft Corporation". Del mismo modo en VMware, su adaptador Ethernet tendrá el prefijo VMNet.

 2
Author: John T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 23:57:14

Este hilo en los foros de SysInternals tiene un par de respuestas (en Delphi, por supuesto), incluyendo una sola función IsVM. He probado en XP y Win2003 alojado en XP y Vista en VMware con buenos resultados.

 2
Author: Bruce McGee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-25 16:03:47

Hay una forma de WMI publicada aquí: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx

He comprobado una imagen XP que se ejecuta en un PC virtual, y el valor que están probando sigue siendo el mismo. Sin embargo, no garantizaré lo que otros VM devuelvan aquí...

En realidad tengo un programa Delphi que escribí hace un par de años para obtener una lista y cambiar la impresora predeterminada utilizando WMI, sin requerir componentes de terceros ni nada por el estilo. En si no está acostumbrado a trabajar con WMI desde Delphi, puedo enviarle una copia para que tenga algo para trabajar (no es necesariamente compatible con Unicode, sin embargo, pero no debería ser demasiado difícil para mí actualizarlo si es necesario).

 1
Author: Michael Madsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-23 00:11:36

Usé el método RedPill (traducido a Delphi, pero el código no es tan difícil de entender) que funcionó bastante bien. También incluí algunas comprobaciones adicionales usando llamadas WMI para obtener cosas como el nombre del proveedor del adaptador de red y los derechos de autor, pero eso fue para detectar versiones específicas de PC Virtual.

Mi comprensión del método RedPill es que debe funcionar y detectar todas las máquinas virtuales en función de la naturaleza de cómo funciona. Existe la posibilidad de que falso también se pueden generar positivos ya que la nueva función Windows dentro de Windows de Windows 7 se puede configurar para ejecutar programas seleccionados en una copia de Windows XP sin problemas dentro de Windows 7.

 1
Author: skamradt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-24 23:45:12

He tenido buena suerte con solo mirar la dirección MAC, ya que todos los fabricantes reciben un bloque y las primeras 3 partes son únicas para ellos.

//look at the MAC address and determine if it's a Virtual Machine
$temp = preg_split("/\s+/",exec("/sbin/ifconfig -a eth0 2>&1 | /bin/grep HWaddr"), -1, PREG_SPLIT_NO_EMPTY);
//Virtual Box MACs all start with '08:00:27:xx:xx:xx'
if (strpos($temp[4], '08:00:27') !== false) $_SESSION['DEVELOPMENT'] = true;  
 1
Author: DAE51D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 01:40:36

Para determinar que la máquina es física o VM

dmidecode | egrep -i 'manufacturer|product'

Si el comando dmidecode no se encuentra, instale el rpm correspondiente.

Esto se prueba en máquinas EXSI, VMWARE e hyperv.

 1
Author: Sampath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 22:40:52

Si desea detectar generalmente la presencia de cualquier tipo de virtualización, lo mejor es analizar las características de rendimiento. Tome algo que es significativamente más lento en virtualización (como una carga de trabajo pesada de MMU como una bomba de bifurcación) y compáselo con una aplicación de espacio de usuario con CPU normal. De la proporción se puede decir fácilmente.

Lo más fácil en términos de esfuerzo si solo se preocupa por ciertas VMM es buscar su hardware, es decir, dispositivos VMware PCI:

00:07.3 Puente: Intel Corporation 82371AB / EB / MB PIIX4 ACPI (rev 08) Subsistema: Chipset de Máquina Virtual VMware Inc

15ad: 1976

El valor del proveedor es '15ad'

También hay puertos backdoor específicos que funcionan en varias VMM en varias versiones. El truco de SIDT también es bueno, pero ¿qué pasa si un VMM no está en la lista que su código está comprobando?

 0
Author: nosatalian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-29 08:45:20
dmidecode -s system-product-name

Probado en VirtualBox, resultado:

Virtualbox
 0
Author: Emilio Hodge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-07 02:35:07