Determinar quando executado em uma máquina virtual
-
13-09-2019 - |
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.
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 usei o href="http://www.invisiblethings.org/papers/redpill.html" rel="nofollow noreferrer"> Redpill método (traduzido para Delphi, mas o isn de código' t tão difícil de entender) que funcionou muito bem. Eu também incluiu algumas verificações extras usando WMI chama para fazer as coisas como o nome do fornecedor do adaptador de rede e direitos autorais, mas que foi para a detecção de versões específicas do Virtual PC.
O meu entendimento do método Redpill é que ele deve funcionar e detectar todas as máquinas virtuais com base na natureza de como ele funciona. Existe a possibilidade de que falsos positivos pode ser gerado também como o novo Windows dentro de recurso do Windows do Windows 7 pode ser configurado para executar programas selecionados em uma cópia do Windows XP integra ao Windows 7.
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