2009-12-11 17 views
1

Je voudrais vérifier si mon application est en cours d'exécution sur VMWare. Existe-t-il un moyen fiable de faire cela en C++?Détecter VMWare par programme

+1

Pourquoi voudriez-vous exactement cela? Je ne peux pas penser à de nombreuses raisons, où un simple "courez-vous sous un VM?" boîte de dialogue ne suffit pas (si même cela est vraiment nécessaire) – viraptor

+0

Duplicaet de http://stackoverflow.com/questions/154163/detect-virtualized-os-from-an-application – saschabeaumont

+0

@viraptor Ce n'est pas parce que vous ne pouvez pas penser à des cas qu'il n'y en a pas. Par exemple, je travaille sur l'identification d'un ordinateur pour les licences et des trucs comme ça, et j'ai besoin de savoir si je suis dans une VM ou non, car cela permettra de déterminer quelles informations sur le matériel je vais utiliser, et de savoir si je suis dans une machine virtuelle, je dois vérifier toutes les machines virtuelles possibles, y compris VM Ware. – Virus721

Répondre

1

Je pense que this link pourrait être en mesure de vous aider. Son dans l'assemblage, pas C++, mais vous pouvez toujours créer un bloc d'assemblage dans votre C++ ...

//////////////////////////////////////////////////////////////////////////////// 
// 
// Simple VMware check on i386 
// 
// Note: There are plenty ways to detect VMware. This short version bases 
// on the fact that VMware intercepts IN instructions to port 0x5658 with 
// an magic value of 0x564D5868 in EAX. However, this is *NOT* officially 
// documented (used by VMware tools to communicate with the host via VM). 
// 
// Because this might change in future versions - you should look out for 
// additional checks (e.g. hardware device IDs, BIOS informations, etc.). 
// Newer VMware BIOS has valid SMBIOS informations (you might use my BIOS 
// Helper unit to dump the ROM-BIOS (http://www.bendlins.de/nico/delphi). 
// 
function IsVMwarePresent(): LongBool; stdcall; // platform; 
begin 
    Result := False; 
{$IFDEF CPU386} 
    try 
    asm 
      mov  eax, 564D5868h 
      mov  ebx, 00000000h 
      mov  ecx, 0000000Ah 
      mov  edx, 00005658h 
      in  eax, dx 
      cmp  ebx, 564D5868h 
      jne  @@exit 
      mov  Result, True 
    @@exit: 
    end; 
    except 
    Result := False; 
    end; 
{$ENDIF} 
end; 

Comme tout code de l'Internet, il faut faire attention simplement copier & coller et attendre qu'il fonctionne parfaitement .

+0

Cela semble provoquer un plantage sur le serveur Win2k8 et peut-être Windows 7 OS 32 bits malheureusement –

+1

Vous avez probablement besoin de l'envelopper dans un gestionnaire d'exception "structuré" Win32. Si vous obtenez une exception d'instruction non valide ou similaire, vous n'êtes pas dans VMware. http://msdn.microsoft.com/en-us/library/s58ftw19%28VS.80%29.aspx –