Zitat von
Daniel:
Ist zwar kein
Win9x, sondern Vista x64 - aber, wo ist da schon ein Unterschied.
Hehe
Danke dir
Zitat von
blackdrake:
Hier das Testergebnis von Win 95 native [..]
Heute bzw. morgen reiche ich noch das Ergebnis von Windows ME native nach.
Vielen Dank
Das Ergebniss ist ja eigentlich wie erwartet. Theoretisch könnte ich einfach auf
Win9x prüfen und dementsprechen den LDTR Test weglassen. Die Limit Prüfung der anderen Tabellen sollte nämlich ergeben, dass das System keine VM ist.
Zitat von
blackdrake:
Du solltest auf jeden Fall noch jemand finden, der dir die Wert bei Windows NT nachweisen kann.
Ja das wäre vermutlich nicht schlecht, wobei ich start annehme, dass die LDTR dort auch $DEAD0000 ist, wie bisher auf allen NT basierten Systemen.
Zitat von
blackdrake:
Ich würde mal behaupten, dass folgendes Muster sicher sein könnte:
IsVirtualMachine := DrittesByte(LDTR) = $FF;
Das wäre mit der Annahme verbunden, dass jedes virtualisierte Windows System den LDTR 0xDEADFF.. verwendet
Es ist mir unbekannt, wie sich das LDTR bei mehreren Prozessoren oder bei mehreren VMM's oder bei Windows NT und Vista verhält! Ebenfalls weis ich nicht, ob VirtualBox oder VMWare etc ebenfalls das Muster LDTR = 0xDEADFF.. verwendet. Ich habe nur mit Microsoft Virtual PC 2007 getestet. Ich habe auch testweise mehrere verschiedene virtuelle Betriebssysteme gleichzeitig aufgemacht. Alle hatten dabei den LDTR 0xDEADFFA8.
Dies könnte korrekt sein, allerdings habe ich WinXP, Win2000 und WinVista 32 Bit auchmal bei mir unter VirtualBox getestet und VirtualBox scheint die LDT auch wie ein natives System nicht zu verwenden. Der Wert ist zumindest auch $DEAD0000. Von daher hatte ich diese Überorüfung sowieso nur optional eingebaut. Sprich: Das Testprogramm prüft erstmal das Limit der IDT und der GDT. Wenn dabei KEINE VM festgestellt wird, prüft das Programm auch noch die LDTR auf $DEAD0000. Fals der Wert nicht "normal" ist wird zurückgegeben, dass das Programm auf einer VM läuft. Bisher hatte diese Funktion ja optimale Ergebnisse. Bis halt auf
Win9x Systemen, bei denen die LDT nativ noch verwendet wird und somit auch die LDTR Adresse <> $DEAD0000 ist.
Zitat von
blackdrake:
Sollte ein anderes VirtualMachine-System beim dritten LDTR-Byte etwas anderes als $FF setzen, könnte es auch so funktionieren:
IsVirtualMachine := DrittesByte(LDTR) <> $00;
Das wäre dann aber mit der Annahme verbunden, dass jedes native Windows System den LDTR 0xDEAD00.. verwendet
Die Annahme ist für Systeme >=
WinNT richtig. Nur die alten
Win9x Systeme fallen da aus dem Schema.
Zitat von
blackdrake:
Ich finde das ein sehr interessantes Thema, zumal es im Internet kaum Informationen zu LDTR gib (bzw. mehr Fehlinformationen als absolut universell korrekte). Wenn du denkst, dass deine Methode überall korrekt funktioniert, wäre das ein perfekter Beitrag zur CodeLib. Leg dir auf jeden Fall eine Excel-Tabelle an, in der du alle Testergebnisse sammelst, die dir hier angeboten werden, sodass du schneller Zusammenhänge finden kannst.
Am Anfang sollte das ganze ja nur eine einfache Warnung an den Benutzer werden, aber mittlerweile ist bei mir auch theoretisches Interesse geweckt worden. Ich werde mal so eine Tabelle anlegen und diese sobald ist das ganze noch etwas optimiert / weiter getestet habe zusammen mit der Funktion in der CodeLib posten.
Über die LDTR habe ich auch nicht viel Sinnvolles gefunden, außer dass man mittels des Assembler Befehls SLDT 2 Bytes des LDT Descriptor Selectors bekommen kann, welcher unter NT Systemen 0000 ist, da dort die LDT auf die der LDT Descriptor zeigt nicht mehr verwendet wird. Die vorangestellten Bytes $DEAD habe ich dem Programm "scoopy doo" entnommen, welches auch "versucht" VMs zu erkennen, allerdings auf eine andere Methode, welche nicht sehr zuverässig ist.
[Edit: Habe mal einen leicht modifizierten Test angehangen, welcher den LDTR Test auf
Win9x Systemen einfach überspringt. Die Ergebnisse sollten so wieder stimmen]
Gruß Zacherl