Ainda não testei num hardware apropriado… mas hoje quando fiz um teste rápido com com o VMware ESXi no QEmu percebi que ele detectou “aonde” estava rodando.
Para ver mais screenshots clique aqui.
As CPUs modernas possuem alguns registros especiais dentre os quais há o grupo de instruções: Memory Type Range Registers (MTRRs) que provém um sistema de como o acesso a faixas de memória são transferidas para a cache. Nesse caso a mensagem [No variable MTRRS] indica como o VMware detectou. [assim que sobrar um tempo irei buscar a fundo o motivo real da virtualização não implementar isso]
Utilizei o seguinte comando para rodar o Qemu:
./qemu -cpu coreduo -m 1500 \ -hda vm.cow \ -cdrom VMware-VMvisor-InstallerCD-3.5.0_Update_4-153875.i386.iso
A título de exemplo, vejam um programa para detectar se o seu programa está em uma máquina virtual (no caso VMware):
#include <stdlib.h> #include <unistd.h> #include <signal.h> #define MAGIC 0x564d5868 /* "VMXh" */ #define PORT 0x5658 /* "VX" */ #define GETVERSION 0x0a static char *versions[] = {"??","Express","ESX Server","GSX Server","Workstation" }; static int vlen[] = {2,7,10,10,11}; static void segfault(){ write(1,"Not a VMware box.\n",18); exit(1); } int main(){ unsigned int ok, ver, magic; signal(11, segfault); __asm__ __volatile__ (" \ push %%ebx \n\ in %%dx, %%eax \n\ mov %%ebx, %1 \n\ pop %%ebx \n\ " : "=a"(ok), "=m"(magic), "=c"(ver) : "0" (MAGIC), "c" (GETVERSION), "d" (PORT) ); if (magic == MAGIC) { write(1, "VMware ", 7); if (ok == 6) { write(1, versions[ver], vlen[ver]); write(1, "\n", 1); } else write(1, "unknown\n",8); } else write(1, "Not vmware\n",11); exit(0); }
Isso foi só um motivacional. Isso é assunto para outros posts, ainda estou aprendendo as metodologias utilizadas em virtualização, esperem em breve posts com temas interessantíssimos.
Arquivado em: programação | Etiquetado: qemu, virtualização, vmware

