Jetzt stellt sich die Frage: Wie fängt man bei seinem ersten Blogeintrag, der halbwegs sinnvoll ist, an? Aber die Frage erübrigt sich, denn angefangen hab ich hiermit ja schon.
Nun es geht darum zu erkennen ob man sich innerhalb einer Virtuellen Umgebung bzw. innerhalb einer Virtuellen Maschine befindet oder nicht.
Der Hintergrund, weshalb ich das für wichtig erachte ist folgendes: Viele Anbieter von Hosting-Angeboten im Internet bieten WebServer an und behaupten das System stehe einem alleine zur Verfügung. Ob das aber tatsächlich stimmt oder ob man anstatt einem Root-Server nicht doch nur einen Virtuellen Server (vHost) gemietet hat, lässt sich relativ einfach feststellen. Hier ein bisschen C-Source-Code:
int main () {
unsigned char size[6],
shell_code[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
*((unsigned*)&shell_code[3]) = (unsigned)size;
((void(*)())&shell_code)();
printf ("IDT base: %#x\n", *((unsigned*)&size[2]));
if (size[5]>0xd0) {
printf ("Inside Virtual Machine!\n", size[5]);
} else {
printf ("Not in a Virtual Machine.\n");
}
return 0;
}
Download: vm_detect.c
Nun wie funktioniert das ganze? Die Theorie dahinter ist einfach: Jedes Computersystem hat bestimmte Speicherbereiche innerhalb des Prozessors in dem bestimmte Daten abgelegt werden. Diese Speicherbereiche befinden sich immer (innerhalb eines CPU-Typs) an festen Adressen. Die Interrupt Descriptor Table (IDT) ist eines dieser Register. Wer mehr über die IDT wissen will kann sich das entsprechende Dokument für Intel-Prozessoren ansehen. Das kleinen Stück Quellcode überprüft einfach ob das Register an der richtigen Adresse liegt. Ist das der Fall befinden wir uns in einem realen Betriebsystem, wenn nicht, sind wir innerhalb einer virtuellen Umgebung. So einfach ist das.