2009-04-22 20 views
33

¿Hay un formulario oficial para que una aplicación determine si se está ejecutando en VMWare o en Virtual PC (o como lo llame Microsoft ahora)? El código que he visto suele ser un truco que aprovechó algunos efectos secundarios de comportamiento extraños en una versión específica de VMWare o Virtual PC.Determine cuándo se ejecuta en una máquina virtual

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

+1

Sólo por curiosidad, ¿cuál es el caso de uso para saber que uno está en la máquina virtual? Siempre consideré uno de los principales beneficios de VM que (idealmente) no necesita saber si tiene hardware físico o no. –

+0

Curiosidad realmente. Un compañero de trabajo me preguntó y yo había recordado haber leído sobre él, pero no estaba seguro de la mejor manera. Aunque pude ver el deseo de restringir su aplicación para que no se ejecute en una VM por razones de seguridad, pero eso sería REALMENTE MOLESTO para sus usuarios. Sé que Virtual PC no te permitirá correr en VMWare (al menos cuando lo intenté). –

Respuesta

34

Escribí una serie de artículos el año pasado sobre esto, con el código fuente. La detección de VMware y Wine es here. Virtual PC es here. Los tres tienen una detección bastante resistente porque existen devoluciones documentadas para el hipervisor (en el caso de Wine, una extensión de una DLL estándar). Puse un detector VirtualBox no probado (no lo tengo instalado para probar) en la sección de comentarios. Parallels puede 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 que se centra en exploits) pero se encuentra en here si lo tiene instalado y le interesa. También hay un PPT here que contiene información sobre la detección de Sandbox, Bochs y Xen. No tiene mucho código, pero podría darle un punto de partida si tiene que detectarlos.

+0

Estos fueron los artículos que recordé haber leído al respecto. ¡Gracias! El código está incluso en Delphi. –

+2

Cabe señalar que no está utilizando algún esquema oficialmente documentado para detectar la presencia de VirtualPC. Está utilizando instrucciones que no deberían ser válidas en el hardware real, que VPC utiliza para comunicarse con el exterior.Nada es decir que esas instrucciones no pueden cambiar en el futuro, o que Intel no pudo lanzar una CPU que luego usa esas instrucciones "sin usar". –

5

Proyecto de código muestra una forma de Detect if your program is running inside a Virtual Machine que va en muchos detalles sobre cómo llevar a cabo para darle una buena comprensión

+1

Había mirado ese enlace antes, pero dado que tenía 4 años y realmente no había localizado ninguna fuente, no estaba seguro de si aún era válido. El software de virtualización ha cambiado mucho desde entonces. –

+0

ha cambiado mucho, pero ese ejemplo verifica el registro que el hipervisor usa para interrupciones y es una persona que conoce información sobre hipervisores, esa parte aún tiene que cambiar – TStamper

+0

OK, voy a probar estos en las máquinas virtuales más recientes. ¡Gracias! –

1

hay una manera de WMI publicadas aquí: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx

He doble registré una imagen de XP que se ejecuta en Virtual PC, y el valor que están probando sigue siendo el mismo. Sin embargo, no garantizaré qué otras máquinas virtuales vuelven aquí ...

Tengo un programa Delphi que escribí hace un par de años para obtener una lista y cambiar la impresora predeterminada usando WMI, sin necesidad de 3er. componentes del partido o algo por el estilo. En caso de que no estés acostumbrado a trabajar con WMI desde Delphi, puedo enviarte una copia para que tengas algo en que trabajar (no es necesariamente compatible con Unicode, pero no debería ser demasiado difícil para actualizarlo). si es necesario).

+0

También hay virtualbox y VMWare entre otros. –

+0

Correcto, que es donde todo se torna un poco dudoso si también quieres comprobarlo. Debes consultar la información de hardware proporcionada por estas otras máquinas virtuales para ver qué valor especial puedes buscar allí. Sin embargo, la pregunta pide VPC, y ese código lo maneja. Argumentaría que WMI es, independientemente de VM, la mejor opción para una forma unificada de obtener la información requerida, sin embargo, como todo lo que necesita cambiar es la consulta y el nombre de campo que está revisando. –

2

Creo que el mejor enfoque para esto es verificar los perfiles de hardware. El hardware virtualizado usualmente usa parte del nombre de la compañía. Si revisa la descripción de la placa base mientras está en Virtual PC, verá que está hecha por "Microsoft Corporation". Del mismo modo, en VMWare, su adaptador de ethernet tendrá el prefijo VMNet.

2

This thread 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.

1

Utilicé 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í algunos controles 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 Virtual PC.

Mi comprensión del método RedPill es que debería funcionar y detectar todas las máquinas virtuales según la naturaleza de cómo funciona. Existe la posibilidad de que también se generen falsos positivos ya que la nueva característica Windows de Windows 7 se puede configurar para ejecutar programas seleccionados en una copia de Windows XP sin problemas dentro de Windows 7.

+1

El problema con RedPill y técnicas similares, como el scoopy_doo inicial, es que produce falsos positivos cuando se ejecuta en sistemas multi-core. Google para "NoPill" para detalles adicionales. –

+0

Además, otras técnicas son obsoletas o producen falsos positivos: http://charette.no-ip.com:81/programming/2009-12-30_Virtualization/index.html – tobsen

+0

@skamradt: ¿Has visto esto? -> http://blog.assarbad.net/20061105/redpill-getting-colorless/ – 0xC0000022L

0

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

más fácil en términos de esfuerzo si sólo se preocupan por cierto VMM es la búsqueda de sus dispositivos PCI en hardware es decir, VMware:

00: 07.3 Puente: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08) subsistema: VMware Inc chipset virtual Machine

15ad: 1976 valor

El vendedor es '15ad'

, hay adaptaciones específicas de puerta trasera que funcionan en diferentes VMM en diversas versiones s. El truco de SIDT también es bueno, pero ¿qué sucede si un VMM no está en la lista que su código está verificando?

0

He tenido buena suerte con solo mirar la dirección MAC ya que todos los fabricantes tienen un bloque y las 3 primeras 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; 
+0

También tenga en cuenta que la mayoría del software de virtualización le permitirá modificar la dirección MAC a cualquier cosa que desee. Por lo tanto, esta técnica no es confiable. –

1

Para determinar la máquina es físico o máquina virtual

dmidecode | egrep -i 'manufacturer|product' 

Si el comando no se encuentra dmidecode instalar el respectivo rpm.

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

+0

'dmidecode' parece necesitar permiso de root. – Raedwald

0
dmidecode -s system-product-name 

probado en VirtualBox, resultado:

Virtualbox 
Cuestiones relacionadas