J'essaie de détecter si je cours sur un environnement virtuel (vmware, virtualbox, etc)
Sur Windows j'ai utilisé plusieurs ASM mais je ne peux pas les utiliser sous Linux, principalement parce que le code peut être compilé et exécuté sur Linux 32 ou 64 bits.Détecter VMM sur Linux
Le code suivant fonctionne sur Windows 32 et 64 ans et a été testé sur VMWare, VirtualBox et d'autres machines virtuelles:
#include <stdio.h>
int idtCheck()
{
unsigned char m[2];
__asm sidt m;
printf("IDTR: %2.2x %2.2x\n", m[0], m[1]);
return (m[1]>0xd0) ? 1 : 0;
}
int gdtCheck()
{
unsigned char m[2];
__asm sgdt m;
printf("GDTR: %2.2x %2.2x\n", m[0], m[1]);
return (m[1]>0xd0) ? 1 : 0;
}
int ldtCheck()
{
unsigned char m[2];
__asm sldt m;
printf("LDTR: %2.2x %2.2x\n", m[0], m[1]);
return (m[0] != 0x00 && m[1] != 0x00) ? 1 : 0;
}
int main(int argc, char * argv[])
{
idtCheck();
gdtCheck();
if (ldtCheck())
printf("Virtual Machine detected.\n");
else
printf("Native machine detected.\n");
return 0;
}
maintenant, GCC se plaint du __asm sur toutes les fonctions. J'ai essayé avec asm(), asm et d'autres formes que j'ai utilisées dans le passé mais aucun ne fonctionne. Des idées?
Je vous suggère de lire l'ensemble du document, en particulier le texte après ** NOTE: **. Ensuite, vous seriez en mesure de poser une question pertinente ou de le comprendre vous-même. – jbcreix
merci. voir la question éditée. –
SIDT génère un résultat de 6 octets (32 bits) ou de 10 octets (64 bits). Ne le placez pas dans un tableau de caractères de 2 octets, sauf si vous préférez écraser des bits aléatoires de votre pile. – bdonlan