Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#48

Re: Bitte testen! IDT base Adresse auslesen + VMM detection

  Alt 19. Sep 2007, 09:26
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
Daniel Marschall
  Mit Zitat antworten Zitat