delphi - ventajas - Determinar cuando se ejecuta en una máquina virtual
ventajas y desventajas de una maquina virtual (10)
¿Hay alguna manera oficial de 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.
Idealmente código Delphi, pero si puede vincular a una explicación oficial, entonces estoy seguro de que puedo convertirlo.
Code Project muestra una forma de Detectar si su programa se está ejecutando dentro de una Máquina Virtual que detalla mucho cómo lograrlo para obtener una buena comprensión
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.
El año pasado escribí una serie de artículos con el código fuente. La detección de VMware y Wine está here . Virtual PC está 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 centrado en exploits), pero que se encuentra here si lo tiene instalado y está interesado. También hay un PPT 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.
Hay una forma WMI publicada aquí: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx
He comprobado dos veces una imagen de XP que se ejecuta en Virtual PC, y el valor que están probando sigue siendo el mismo. No voy a garantizar lo que otras máquinas virtuales vuelven aquí, sin embargo ...
De hecho, tengo un programa Delphi que escribí hace un par de años para obtener una lista y cambiar la impresora predeterminada usando WMI, sin requerir componentes de terceros ni nada de eso. 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).
He tenido buena suerte con solo mirar la dirección MAC ya que todos los fabricantes tienen 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;
Para determinar que la máquina es física o VM
dmidecode | egrep -i ''manufacturer|product''
Si el comando dmidecode no encontrado instala las rpm respectivas.
Esto se prueba en máquinas EXSI, VMWARE e hyperv.
Si generalmente desea detectar la 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.
Lo más fácil en términos de esfuerzo si solo le importan ciertos VMM es buscar su hardware, es decir, dispositivos PCI de VMware:
00: 07.3 Bridge: Intel Corporation 82371AB / EB / MB PIIX4 ACPI (rev 08) Subsistema: VMware Inc Virtual Machine Chipset
15ad: 1976
El valor del proveedor es ''15ad''
También hay puertos de puerta trasera específicos que funcionan en varios VMM en varias versiones. 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?
Este hilo en los foros de SysInternals tiene un par de respuestas (en Delphi, por supuesto), incluida una única función de IsVM. He probado en XP y Win2003 alojado en XP y Vista en VMWare con buenos resultados.
RedPill método de 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 de Windows dentro de Windows de Windows 7 se puede configurar para ejecutar programas seleccionados en una copia de Windows XP perfectamente dentro de Windows 7.
dmidecode -s system-product-name
Probado en VirtualBox, resultado:
Virtualbox