Hallo.
Habe nun einen Freund gefragt, der noch Win ME hat. Hier das Ergebnis:
Delphi-Quellcode:
Testprogramm vom alten Thread
Processors: 1
VM-Detektion: Negativ (OK)
ID-Basis: 2148179968
Neues Testprogramm
Processors: 1
GDT: 0xC0F31000 (4095)
IDT: 0x800AA000 (767)
LDTR: 0xDEAD00B8
VM-Detektion: Positiv (FEHLER!!)
Ganz neues Testprogramm
Selbes Ergebnis!
Die Erkennnugsfunktion müsste so perfekt wirken (Pseudo-Code):
Delphi-Quellcode:
Function IsVirtual: boolean;
begin
// Hier Code einsetzen, der GDT, IDT und LDTR erfasst
If Check_GDT_and_IDT_IsVirtual(GDT, IDT) Then
Begin
result := true;
End
Else
Begin
if IsWin9x() then
begn
end
result := LDTR = $DEAD00B8;
else
begin
result := LDTR = $DEAD0000;
end;
end;
End;
Verbunden mit der Annahme, dass Windows NT's LDTR = 0xDEAD0000. Das muss unbedingt nachgeprüft werden.
Die Annahme, dass Windows 9x's LDTR = 0xDEAD00B8 ist, dürfte anhand der Testergebnisse der nativen Win95b, Win98SE und WinME bestätigt sein.
Ebenfalls sollte man vielleicht noch prüfen, wie sich die Windows Applikation bei Linux (-> WinE etc) auswirkt und ggf. zusätzlich prüft, ob Linux angewandt wird. Delphi ist schließlich kompatibel zu Kylix, daher sollte man so eine Überprüfung durchführen, wenn man einen perfekten CodeLib Beitrag erreichen möchte. Leider habe ich mit Linux nichts am Hut.
Man könnte, abhängig vom Kompiler (Kylix, Delphi) folgenden Abschnitt hinzubauen (Pseudo-Code):
Delphi-Quellcode:
// Kompilerschalter / Bedingte Kompilierung
{$IFDEF LINUX}
// Unter Linux/Kylix kompiliert
// -> Jede Anwendung unter Windows ist eine Virtualisierung (kann man Linux unter Windows emulieren?)
result := RunningUnderWindows;
{$ELSE}
// Unter Windows/Delphi kompiliert
// -> Jede Anwendung unter Linux ist eine Virtualisierung (z.B. unter WinE)
result := RunningUnderLinux;
{$ENDIF}
Gruß
blackdrake