Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Bitte testen! IDT base Adresse auslesen + VMM detection (https://www.delphipraxis.net/99543-bitte-testen-idt-base-adresse-auslesen-vmm-detection.html)

Zacherl 17. Sep 2007 14:21

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
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.

Daniel 18. Sep 2007 06:11

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
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!

blackdrake 18. Sep 2007 06:45

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
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:

Delphi-Quellcode:
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:

Delphi-Quellcode:
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

Zacherl 18. Sep 2007 08:53

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Daniel
Ist zwar kein Win9x, sondern Vista x64 - aber, wo ist da schon ein Unterschied. ;-)

Hehe :mrgreen: Danke dir :thumb:

Zitat:

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:

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:

Zitat von blackdrake
Ich würde mal behaupten, dass folgendes Muster sicher sein könnte:

Delphi-Quellcode:
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:

Zitat von blackdrake
Sollte ein anderes VirtualMachine-System beim dritten LDTR-Byte etwas anderes als $FF setzen, könnte es auch so funktionieren:

Delphi-Quellcode:
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:

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

blackdrake 18. Sep 2007 10:19

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
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

Zacherl 18. Sep 2007 14:32

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
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.

Zacherl 18. Sep 2007 19:25

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal die Tabelle mit den Messwerten als *.xls, *.xlsx und als HTML Datei.

blackdrake 19. Sep 2007 08:26

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
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

Zacherl 19. Sep 2007 08:54

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

blackdrake 19. Sep 2007 09:23

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
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

blackdrake 19. Sep 2007 12:19

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

Schicke mir doch mal deinen bisherigen Quellcode. Ich würde gerne mal ein bißchen probieren.

Gruß
blackdrake

Zacherl 19. Sep 2007 14:16

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

ich habe dich mal in ICQ gedadded. Dort können wir den Code ja zusammen nochwas optimieren / weiter testen und dann in die CodeLib stellen :)

Gruß

DP-Maintenance 19. Sep 2007 16:38

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Klatsch und Tratsch" nach "Windows API / MS.NET Framework API" verschoben.

axellang 19. Sep 2007 17:42

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

getestet unter Vista Ultimate 32 die in einer VM Workstation läuft:


Processor # 1
-------------
GDT: 0xFFC07000 <16687>
IDT: 0xFFC18000 < 2047>
LDTR: 0xDEAD4060 <WinNT>

This application is [probably] running IN a virtual maschine!


Axel

brechi 19. Sep 2007 18:39

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
Schon mal nen Wint2k Prof mit boot.ini Schalter /3gb getestet?
Denke dann bekommste bei IDT/GDT immer einen posiven test auf VM.

Zacherl 19. Sep 2007 19:06

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

@axellang: Danke dir .. ich füg die Werte der Tabelle hinzu :)
@brechi: Nein, noch nicht getestet. Könnte das jemand prüfen? Habe leider kein natives Win2000 System hier. Wobei ich ja nicht die Base prüfe, sondern eher der GDT / IDT Limit. Natürlich könnte auch das größer sein, als normal.

Zacherl 19. Sep 2007 22:20

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Blackdrake hat mal noch ein etwas detailierteres Testprogramm mit meiner Funktion geschrieben. Bitte nochmal testen :)

Zacherl 20. Sep 2007 21:14

Re: Bitte testen! IDT base Adresse auslesen + VMM detection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Argh. Die Anwendung war komischerweise fehlerhaft. Hat vielleicht mit dem Aufruf von SetThreadAffinityMask unter der VCL zu tun.
Im Anhgang nochmal eine neue Konsolenversion von mir.

Link zum Projekt: http://www.daniel-marschall.de/vm/

[Edit: Jemand der das unter WINE testen könnte wäre super!]

blackdrake 23. Sep 2007 17:08

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

Wir haben nun die erste Version Open-Source mit Testprogramm auf http://www.delphipraxis.net/internal...t.php?p=781780 veröffentlicht.

Gruß
blackdrake


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz