Pergunta

Existe um maneira oficial de um aplicativo para determinar se ele está sendo executado em VMWare ou Virtual PC (ou o que a Microsoft está chamando-o agora)? O código que eu tenho visto é geralmente um hack que se aproveitou de alguns efeitos colaterais comportamentais estranho em uma versão específica do VMWare ou Virtual PC.

código Idealmente Delphi, mas se você pode conectar-se a uma explicação oficial, então estou certo que posso convertê-lo.

Foi útil?

Solução

Eu escrevi uma série de artigos no ano passado sobre este assunto, com o código fonte. VMware e detecção Wine são aqui . Virtual PC é aqui . Todos os três destes têm detecção muito ferro-folheados porque não são documentados retornos de chamada para o hypervisor (no caso do vinho, uma extensão para um DLL padrão). I colocar um detector VirtualBox não testado (não tê-lo instalado para teste com) na seção de comentários. Parallels pode ser detectável usando um callback também, mas eu não tê-lo instalado. O link para a documentação (que é pobre, já que é a partir de um pesquisador de segurança com foco em exploits) mas localizado aqui se tiver instalado e estiver interessado. Há também um PPT aqui que tem algumas informações sobre como detectar Sandbox, Bochs, e Xen. Não um monte de código nele, mas pode dar-lhe um ponto de partida se você tem que detectar os.

Outras dicas

projeto de código mostra uma maneira de Detectar se o seu programa está sendo executado em uma máquina virtual que vai em muitos detalhes sobre como realizá-lo para dar uma boa compreensão

Eu acho que a melhor abordagem para isso é verificar os perfis de hardware. hardware virtualizado geralmente usa parte do nome empresas. Se você verificar a descrição da placa-mãe, enquanto no Virtual PC, você vai notar que é feita por "Microsoft Corporation". Da mesma forma, em VMWare, o adaptador ethernet será prefixado com vmnet.

Este fio nos fóruns SysInternals tem um casal de respostas (em Delphi, é claro), incluindo uma única função IsVM. Eu testei no XP e Win2003 hospedado em ambos XP e Vista em VMWare com bons resultados.

Há uma maneira WMI postado aqui: http://blogs.msdn.com/virtual_pc_guy/archive/ 2005/10 / 27 / 484479.aspx

Eu dobro verificado em uma imagem XP em execução no Virtual PC, e o valor que eles estão testando ainda é o mesmo. Eu não vai garantir que outras retorno VMs aqui, embora ...

Eu realmente tenho um programa Delphi eu escrevi um par de anos atrás, para obter uma lista de e alterar a impressora padrão usando WMI, sem a necessidade de componentes 3rd party ou qualquer coisa assim. No caso de você não está acostumado a trabalhar com o WMI da Delphi, posso enviar-lhe uma cópia assim que você tem algo para trabalhar off (não é necessariamente Unicode compatível, embora, mas não deve ser muito difícil para mim para atualizá-lo se necessário).

Eu tive sorte com apenas olhando para o endereço MAC como todos os fabricantes recebem um bloco e as 3 primeiras peças são exclusivas para eles.

//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 a máquina é física ou VM

dmidecode | egrep -i 'manufacturer|product'

Se o comando dmidecode não encontrado instalar o respectivo rpm.

Este é testado sob EXSI, VMware e máquinas Hyper-V.

Se você quiser detectar geralmente a presença de qualquer tipo de virtualização, que são melhores características de análise de desempenho. Tomar algo que é significativamente mais lento em virtualização (como MMU pesada carga de trabalho como um fork-bomba) e tempo-lo contra um limite CPU aplicativo de espaço do usuário normal. A partir da razão você pode facilmente dizer.

mais fácil em termos de esforço, se você só se preocupam com certa VMMs é olhar para os seus hardware ou seja, dispositivos VMware PCI:

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

15ad: 1976

O valor fornecedor é '15ad'

Há também portas backdoor específicas que funcionam em vários VMMs em várias versões. SIDT truque é muito bom, mas o que se um VMM não está na lista que seu código está verificando?

dmidecode -s system-product-name

Testado em VirtualBox, resultado:

Virtualbox
scroll top