![]() |
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. |
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! |
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:
Heute bzw. morgen reiche ich noch das Ergebnis von Windows ME native nach.
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!!) 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:
Das wäre mit der Annahme verbunden, dass jedes virtualisierte Windows System den LDTR 0xDEADFF.. verwendet
IsVirtualMachine := DrittesByte(LDTR) = $FF;
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:
Das wäre dann aber mit der Annahme verbunden, dass jedes native Windows System den LDTR 0xDEAD00.. verwendet
IsVirtualMachine := DrittesByte(LDTR) <> $00;
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 |
Re: Bitte testen! IDT base Adresse auslesen + VMM detection
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
[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 |
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 |
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. |
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.
|
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:
Die Erkennnugsfunktion müsste so perfekt wirken (Pseudo-Code):
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!
Delphi-Quellcode:
Verbunden mit der Annahme, dass Windows NT's LDTR = 0xDEAD0000. Das muss unbedingt nachgeprüft werden.
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; 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:
Gruß
// 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} blackdrake |
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. |
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:
Gruß
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; blackdrake |
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 |
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
Dieses Thema wurde von "SirThornberry" von "Klatsch und Tratsch" nach "Windows API / MS.NET Framework API" verschoben.
|
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 |
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. |
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. |
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 :)
|
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: ![]() [Edit: Jemand der das unter WINE testen könnte wäre super!] |
Re: Bitte testen! IDT base Adresse auslesen + VMM detection
Hallo.
Wir haben nun die erste Version Open-Source mit Testprogramm auf ![]() Gruß blackdrake |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr. |
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