AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Bitte testen! IDT base Adresse auslesen + VMM detection
Thema durchsuchen
Ansicht
Themen-Optionen

Bitte testen! IDT base Adresse auslesen + VMM detection

Ein Thema von Zacherl · begonnen am 13. Sep 2007 · letzter Beitrag vom 23. Sep 2007
Antwort Antwort
Seite 5 von 6   « Erste     345 6      
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#41

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

  Alt 17. Sep 2007, 15:21
Nett von dir Wie vermutet ist die LDTR Adresse auf Systemen < Win2000 <> 0xDEAD0000. Von daher müsste ich noch eine Abfrage einbauen die auf Win9x testet.

Naja jetzt warte ich erstmal noch auf die Ergebnisse der beiden anderen Win9x Systeme.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#42

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

  Alt 18. Sep 2007, 07:11
Ist zwar kein Win9x, sondern Vista x64 - aber, wo ist da schon ein Unterschied.


Code:
CPU count: 2

Processor # 1
-------------
        GDT: 0x02868000 < 111>
        IDT: 0x02868070 < 4095>
        LDTR: 0xDEAD0000

Processor # 2
-------------
        GDT: 0x00A45180 < 111>
        IDT: 0x00A451F0 < 4095>
        LDTR: 0xDEAD0000

This application is [probably] NOT running in a virtual maschine!
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
blackdrake

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

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

  Alt 18. Sep 2007, 07:45
Hallo.

Kann meinen Beitrag nicht mehr beatbeiten. Hier das Testergebnis von Win 95 native:

Delphi-Quellcode:
Betriebssystem: Windows 95b (Native)

Testprogramm aus dem alten Thread

Processors: 1
Running IN a virtual machine-Machine: Negativ (OK)
ID-Basis: 2148163584

Neues Testprogramm

Found processors: 1
GDT: 0xC0048E34 (511)
IDT: 0x800A6000 (767)
LDTR: 0xDEAD00B8
Running in a virtual machine? Positiv (FEHLER!!)
Heute bzw. morgen reiche ich noch das Ergebnis von Windows ME native nach.

Du solltest auf jeden Fall noch jemand finden, der dir die Wert bei Windows NT nachweisen kann.

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.

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

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.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#44

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

  Alt 18. Sep 2007, 09:53
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
Angehängte Dateien
Dateityp: zip xdtinfo_187.zip (11,3 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
blackdrake

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

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

  Alt 18. Sep 2007, 11:19
Hallo.

Ich verstehe das nicht ganz. Wieso ist die LDTR-Prüfung bei Win9x unnötig? Kannst du anhand der GDT und IDT bereits sicher die VM-Detektion durchführen und benötigst die Zusatzinformation LDTR nur bei WinNT+?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#46

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

  Alt 18. Sep 2007, 15:32
Naja unnötig ist die Prüfung nicht. Sie erhöht die Trefferquote. Der Bereich in den native Systeme bei der GDT / IDT Prüfung fallen ist so klein wie möglich gehalten, aber es besteht trotzdem noch die Möglichkeit, dass ein virtuelles System "übersehen" wird.
Aus diesem Grund ziehe ich noch die LDTR zur Rate, sofern dies denn geht. (Also nur auf NT Systemen)

Die Prüfung der LDTR basiert ja auf der Tatsache, dass die LDT auf NT Systemen nicht mehr verwendet wird, aber der Descriptor aus Kompatibilitätsgründen noch vorhanden sein muss. Ist dieser aber leer (0000) dann weiß man, dass es sich um ein natives System handelt. Wird das NT System virtualisiert gibt es VM Software, welche die LDT für irgendwelche Zwecke verwendet. Daher ist der Descriptor dann <> 0000.

Bei Win9x wird der Descriptor aber auch nativ verwendet, insofern ist die Abfrage auf 0000 ungültig. Inwiefern deine Vorschläge da stimmen müsste man einfach mal mit noch weiteren Systemen testen. Wenn man eine sichere Abfrage auch für Win9x generieren könnte ist diese natürlich meiner Lösung vorzuziehen die LDTR Abfrage auf Win9x Systemen einfach wegzulassen

Ich werde jetzt mal eine Tabelle mit den bisherigen Werten erstellen.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#47

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

  Alt 18. Sep 2007, 20:25
Hier mal die Tabelle mit den Messwerten als *.xls, *.xlsx und als HTML Datei.
Angehängte Dateien
Dateityp: zip messwerte_515.zip (23,3 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
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
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#49

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

  Alt 19. Sep 2007, 09:54
Danke dir Komisch ist, dass auch das neue Testprogramm ein fehlerhaftes Ergebniss anzeigt. Wird denn zwischen < > wenigstens korrekt ermittelt, dass es sich um ein Win9x System handelt? Ansonsten liegt dort der Fehler, dass die Funktion zu Win9x Erkennung fehlerhaft ist. Oder hast du noch das (ältere) Programm angewendet, welches nicht auf Win9x prüft? Dort stehen gar keine < > hinter dem LDTR Wert.

Wie man auf Linux testet weiß ich leider auch nicht.

Zur Sicherheit nochmal die neuste Version im Anhang.
Angehängte Dateien
Dateityp: zip xdtinfo_204.zip (11,4 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
blackdrake

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

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

  Alt 19. Sep 2007, 10:23
Hallo.

Ich habe bei dem 0xDEAD0000 und 0xDEAD00B8 das result verdreht (= mit <> verwechselt). So müsste es korrekt sein:

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
    begin
    end
      result := LDTR <> $DEAD00B8;
    else
    begin
      result := LDTR <> $DEAD0000;
    end;
  end;
End;
Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz