72 votes

Détecter le système d'exploitation virtualisé à partir d'une application?

J'ai besoin de détecter si ma demande est en cours d'exécution au sein d'un système d'exploitation virtualisé instance ou non.

J'ai trouvé un article avec quelques informations utiles sur le sujet. Le même article apparaît dans plusieurs endroits, je ne suis pas sûr de la source d'origine. VMware met en œuvre un particulier non valide d'instructions x86 pour retourner des informations sur lui-même, tandis que VirtualPC utilise un nombre magique et port d'e/S avec une instruction.

C'est réalisable, mais semble être sans-papiers comportement dans les deux cas. Je suppose qu'une future version de VMWare ou VirtualPC peut changer le mécanisme. Est-il un meilleur moyen? Est-il un mécanisme de prise en charge pour l'un des produits?

De même, est-il un moyen de détecter Xen ou VirtualBox?

Je ne suis pas préoccupé par les cas où la plateforme est délibérément essayer de se cacher. Par exemple, les "pots de miel" utilisation de la virtualisation, mais parfois occulter les mécanismes de logiciels malveillants qui pourraient utiliser pour le détecter. Je n'aime pas que mon application pourrait penser qu'il n'est pas virtualisé dans ces "pots de miel", je suis à la recherche d'un "meilleur effort" de la solution.

L'application est principalement Java, même si je m'attends à utiliser du code natif, plus JNI pour cette fonction particulière. Windows XP/Vista de soutien qui est le plus important, bien que les mécanismes décrits dans l'article référencé sont caractéristiques génériques de x86 et ne comptez pas sur un OS installation.

75voto

Sven Points 7277

Avez-vous entendu parler de la pilule bleue, la pilule rouge?. C'est une technique utilisée pour voir si vous exécutez l'intérieur d'une machine virtuelle ou non. L'origine du terme provient de la matrice de film où Neo est offert un bleu ou un rouge de la pilule (pour rester à l'intérieur de la matrice = bleu, ou pour entrer dans le "monde réel" = rouge).

Voici un code qui permet de détecter si vous êtes en cours d'exécution à l'intérieur de la "matrice" ou pas:
(code emprunté à partir de ce site , qui contient aussi quelques belles d'informations sur le sujet à portée de main):

 int swallow_redpill () {
   unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
   *((unsigned*)&rpill[3]) = (unsigned)m;
   ((void(*)())&rpill)();
   return (m[5]>0xd0) ? 1 : 0;
 }

La fonction retourne 1 lorsque vous exécutez l'intérieur d'un virutal de la machine, et 0 sinon.

En fait le sujet de cette question appartient à est vraiment intéressant d'un point de vue sécurité, et certains des meilleurs morceaux de l'information peuvent y être trouvés.

24voto

michaelbn Points 1388

Sous Linux, j'ai utilisé la commande: dmidecode ( je l'ai à la fois sur CentOS et Ubuntu )

de l'homme:

dmidecode est un outil de dumping d'une ordinateur DMI (certains disent SMBIOS) tableau contenu dans un format lisible par l'homme.

J'ai donc cherché à la sortie et a trouvé sa probablement de Microsoft Hyper-V

Handle 0x0001, DMI type 1, 25 bytes
System Information
    Manufacturer: Microsoft Corporation
    Product Name: Virtual Machine
    Version: 5.0
    Serial Number: some-strings
    UUID: some-strings
    Wake-up Type: Power Switch


Handle 0x0002, DMI type 2, 8 bytes
Base Board Information
    Manufacturer: Microsoft Corporation
    Product Name: Virtual Machine
    Version: 5.0
    Serial Number: some-strings

Une autre façon est de chercher à le fabricant d'origine de l'adresse MAC de eth0 est liée à: http://www.coffer.com/mac_find/

Si le retour de Microsoft, vmware, etc.. alors c'est probablement un serveur virtuel.

14voto

David Points 596

VMware est un des Mécanismes pour déterminer si le logiciel est exécuté dans une machine virtuelle VMware article de base de Connaissances qui a un peu de code source.

Microsoft a également une page sur "Déterminer Si l'Hyperviseur Est Installé". MS sorts de cette exigence d'un hyperviseur dans le IsVM TEST" de leur "Validation de Virtualisation de Serveur de Test" document

VMware et MS docs à la fois mention de l'aide de l'instruction CPUID pour vérifier l'hyperviseur-présent (bit 31 du registre ECX)

La RHEL bugtracker a un pour "doit définir ISVM bits (ECX:31) pour CPUID feuille 0 x 00000001" régler le bit 31 du registre ECX sous le noyau Xen.

Donc, sans entrer dans le fournisseur de détails, il semble que vous pouvez utiliser le CPUID vérifier pour savoir si vous êtes en cours d'exécution virtuellement ou pas.

12voto

jakobengblom2 Points 2873

Je pense qu'à l'avenir, en s'appuyant sur des astuces comme l'cassé SIDT la virtualisation n'est pas vraiment de l'aide que le matériel de bouchons tous les trous que l'étrange et le désordre architecture x86 ont quitté. Le mieux serait de faire pression sur les Vm des fournisseurs pour un standard façon de dire que vous êtes sur une machine virtuelle -- au moins pour le cas lorsque l'utilisateur a explicitement autorisé. Mais si nous considérons que nous sommes en autorisant explicitement la VM pour être détecté, on peut tout aussi bien placer des marqueurs visibles dans il y, droite? Je dirais juste la mise à jour du disque sur votre Vm avec un fichier vous indiquant que vous êtes sur une machine virtuelle -- un petit fichier texte à la racine du système de fichiers, par exemple. Ou d'inspecter les MAC de ETH0, et de spécifier une chaîne connue.

12voto

Kirk Strauser Points 12087

Non, cela est impossible à détecter avec une précision complète. Certains systèmes de virtualisation, tels que QEMU , émulent une machine entière jusqu'aux registres matériels. Retournons ceci: qu'est-ce que tu essayes de faire? Peut-être que nous pouvons aider avec ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X