Question

Y at-il un façon officielle pour une application pour déterminer si elle est en cours d'exécution dans VMWare ou Virtual PC (ou quoi que Microsoft appelle maintenant)? Le code que je l'ai vu est généralement un hack qui a profité d'un effet secondaire du comportement étrange dans une version spécifique de VMWare ou Virtual PC.

Idéalement code Delphi, mais si vous pouvez créer un lien vers une explication officielle alors je suis sûr que je peux le convertir.

Était-ce utile?

La solution

J'ai écrit une série d'articles l'année dernière à ce sujet, avec le code source. VMware et la détection de vin sont . Virtual PC est . Tous les trois d'entre eux ont assez de fer détection vêtu parce qu'il sont documentés à l'hyperviseur callbacks (dans le cas du vin, une extension à une DLL standard). Je mets en place un détecteur VirtualBox non testé (ne l'ont pas installé pour tester avec) dans la section des commentaires. Parallels peut être détectable au moyen d'un rappel aussi, mais je ne l'ai pas installé. Le lien pour la documentation (qui est pauvre, car il est d'un chercheur de sécurité en se concentrant sur des exploits) mais situé si vous l'avez installé et que vous êtes intéressé. Il y a aussi un PPT qui a des informations sur la détection Sandbox, Bochs et Xen. Pas beaucoup de code, mais il peut vous donner un point de départ si vous devez détecter ceux-ci.

Autres conseils

Code du projet montre un moyen de détecter si votre programme est en cours d'exécution dans une machine virtuelle qui va dans beaucoup de détails sur la façon de l'accomplir pour donner une bonne compréhension

Je pense que la meilleure approche pour est de vérifier les profils matériels. matériel virtualisé utilise généralement une partie du nom des entreprises. Si vous cochez la description de la carte mère tandis que dans Virtual PC, vous remarquerez qu'elle est faite par « Microsoft Corporation ». De même, dans VMWare, votre adaptateur Ethernet sera préfixé avec VMNet.

Ce fil sur les forums de Sysinternals a quelques réponses (à Delphes, bien sûr), y compris une fonction unique de IsVM. Je l'ai testé sur XP et Win2003 hébergé sur XP et Vista dans VMWare avec de bons résultats.

Il y a une façon WMI posté ici: http://blogs.msdn.com/virtual_pc_guy/archive/ 2005/10/27 / 484479.aspx

Je l'ai vérifié deux fois dans une image XP fonctionnant sur Virtual PC, et la valeur qu'ils testent pour est toujours le même. Je ne vais pas garantir ce que d'autres machines virtuelles retour ici, mais ...

Je l'ai obtenu réellement un programme Delphi j'ai écrit il y a quelques années pour obtenir une liste de changer l'imprimante par défaut en utilisant WMI, sans nécessiter de composants 3ème partie ou quelque chose comme ça. Si vous n'êtes pas habitué à travailler avec WMI de Delphi, je peux vous envoyer une copie afin que vous avez quelque chose à travailler à l'extérieur (ce n'est pas nécessairement compatible Unicode, bien, mais il ne devrait pas être trop difficile pour moi de le mettre à jour le cas échéant).

J'ai utilisé le RedPill méthode (traduit à Delphi, mais le code ISN » t si difficile à comprendre) qui fonctionnait assez bien. Je également quelques contrôles supplémentaires à l'aide WMI appelle pour obtenir des choses comme l'adaptateur réseau nom du fournisseur et les droits d'auteur, mais qui a été pour détecter des versions spécifiques de Virtual PC.

Ma compréhension de la méthode RedPill est qu'il devrait fonctionner et détecter toutes les machines virtuelles basées sur la nature de la façon dont cela fonctionne. Il y a la possibilité que les faux positifs peuvent être générés aussi les nouvelles fenêtres dans la fonctionnalité de Windows de Windows 7 peuvent être configurés pour exécuter des programmes sélectionnés dans une copie de Windows XP de façon transparente dans Windows 7.

J'ai eu bonne chance avec juste regarder l'adresse MAC que tous les fabricants sont données un bloc et les 3 premières parties sont uniques à eux.

//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;  

Pour déterminer la machine est physique ou VM

dmidecode | egrep -i 'manufacturer|product'

Si la commande dmidecode ne trouve pas installer le régime respectif.

Ceci est testé sous les machines EXSi, VMWARE et HyperV.

Si vous voulez détecter généralement la présence de tout type de virtualisation, vous êtes les meilleures performances d'analyse. Prenez quelque chose qui est beaucoup plus lent en matière de virtualisation (comme MMU lourde charge de travail comme une bombe à fourche) et le temps contre une application CPU normale liée de l'espace utilisateur. A partir du rapport, vous pouvez facilement dire.

Easiest en termes d'effort si vous ne vous préoccupez certains est de regarder VMM pour leurs Matériel- à savoir les périphériques PCI VMware:

00: 07.3 Bridge: Intel Corporation 82371AB / EB / MB PIIX4 ACPI (rev 08)     Sous-système: VMware Inc machine virtuelle Chipset

15ad: 1976

La valeur du fournisseur est '15ad'

Il y a aussi des portes dérobées spécifiques qui fonctionnent sur différents dans différentes versions VMM. astuce SIDT est bien aussi, mais si un VMM pas sur la liste que son code vérifie?

dmidecode -s system-product-name

Testé sur VirtualBox, résultat:

Virtualbox
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top