![]() |
Unit zur VM detection + Testprogramm
Hey,
zusammen mit blackdrake habe ich eine Unit entwickelt die sehr zuverlässig erkennen kann, ob das eigene Programm auf einer virtuellen Maschiene ausgeführt wird. Dabei sind sogar Fingerprints möglich, die eine Identifizierung der verschiedenen Emulations Software zulässt.
Delphi-Quellcode:
Das ganze Funktioniert über verschiedene Tabellen, die für jede CPU existieren. Die GDT, die IDT und die LDT. Anhand deren Base Adressen und ihrer Größe (Limits) werden die VMs ermittelt.
type
TVMFingerprint = (fpUnknown, fpVMWare, fpVirtualPC, fpVirtualBox, fpNative, fpWINE, fpParallelsWorkstation, fpQEMU); type TxDTEntry = record GDTBase: DWord; IDTBase: DWord; LDTRBase: DWord; GDTLimit: Word; IDTLimit: Word; end; type TxDTArray = array of TxDTEntry; TFingerprintArray = array of TVMFingerprint; // Prüft auf eine VM, wobei angegeben werden kann, ob WinE als VM gehandhabt werden soll function IsVirtualMachine(const DetectWINE: Boolean = true): Boolean; // Gibt einen Fingerprint anhand eines TxDTEntrys zurück function GetVMFingerprint(xDTEntry: TxDTEntry): TVMFingerPrint; overload; // Gibt einen Fingerprint für eine CPU zurück function GetVMFingerprint(CPU: Cardinal): TVMFingerPrint; overload; // Konvertiert einen Fingerprint in einen String function VMFingerprintToStr(FP: TVMFingerprint): String; // Gibt einen TxDTEntry für eine CPU zurück function GetxDTEntry(CPU: Cardinal): TxDTEntry; // Gibt ein Array of TxDTEntry für alle CPUs zurück function GetxDTArray(var Output: TxDTArray): Integer; // Gibt ein Array of TVMFingerprint für alle CPUs zurück function GetFingerprintArray(var Output: TFingerprintArray): Integer; Unterstützte Betriebssysteme: * Win95 .. WinME * WinNT .. WinVista Unterstützt werden momentan: * VirtualPC, VMWare, VirtualBox, ParallelsWorkstation und WinE. * QEMU (Testphase) Geplante Features: * Sandbox detection Download: ![]() Im Archiv findet sich die Unit, der Source für das Testprogramm und eine Excel Tabelle mit unseren Messergebnissen. Wir würden uns über Feedback und weitere Messergebnisse freuen! Gruß Zacherl |
Re: Unit zur VM detection + Testprogramm
Liste der Anhänge anzeigen (Anzahl: 1)
danke, deine Unit erkennt auch auch VMs die unter Parallels Workstation laufen. Nur als Typ steht VirtualBox da.
Hier das Ergebnis (siehe Anhang) von deinem Testprogramm innerhalb einer Windows Server 2008 VM. |
Re: Unit zur VM detection + Testprogramm
Hallo.
Danke für den Beitrag. Hier wäre die Vermutung nahe, dass Parallels Workstation stets die LDTR-Base 0xDEADFF5B verwendet (Beispiel: Microsoft Virtual PC 2007 verwendet immer 0xDEADFFA8). Hast du auf Parallels Workstation noch ein anderes Betriebssystem, damit die 0xDEADFF5B-Theorie bestätigt werden kann? Gruß blackdrake |
Re: Unit zur VM detection + Testprogramm
(Hui, unter Parallel Workstations hatten wir bisher gar keine Testergebnisse. Bisher haben wir für VirtualBox als Erkennungsmerkmal nur das GDT Limit.
Bei Parallel Workstations scheint ja auch noch die LDTR Base anders zu sein. Da bräuchten wir allerdings mehr Messwerte. Hast du zufällig noch andere Systeme auf Parallel Workstations installiert?) - zu spät. Habe die Unit schonmal so angepasst, dass unter VirtualBox die LDTR der Nativen LDTR des Entsprechenden Systems entspricht. Die Ausgabe dürfte dann für Parallel Workstations "Unknown" sein. [Edit: Parallels Workstation wird nun auch erkannt. (BETA!)] Neue Funktionen:
Delphi-Quellcode:
// Gibt ein Array of TxDTEntry für alle CPUs zurück
function GetxDTArray(var Output: TxDTArray): Integer; // Gibt ein Array of TVMFingerprint für alle CPUs zurück function GetFingerprintArray(var Output: TFingerprintArray): Integer; |
Re: Unit zur VM detection + Testprogramm
ich installiere gleich mal ein XP. Das Ergebnis gibts dann morgen.
|
Re: Unit zur VM detection + Testprogramm
Danke dir :)
|
Re: Unit zur VM detection + Testprogramm
Liste der Anhänge anzeigen (Anzahl: 1)
hier das Ergebnis für XP unter Parallels-
ich werde auch noch ein Win9x installieren und dann die Werte posten. |
Re: Unit zur VM detection + Testprogramm
Damit bestätigt sich unsere Annahme zumindest für NT Systeme schonmal :) Ein Win9x Test wäre sehr nett von dir ..
|
Re: Unit zur VM detection + Testprogramm
Laptop in VM:
Code:
und ohne:
System Info
----------- Win Type : WinNT CPU count: 1 Processor # 1 ------------- GDT : 0xFFC07000 <16687> IDT : 0xFFC18000 < 2047> LDTR: 0xDEAD4060 <WinNT> Type: VMWare This application is [probably] running IN a virtual machine!
Code:
Ich weiß ja, dass man immer alles sofort will. :zwinker:
System Info
----------- Win Type : WinNT CPU count: 2 Processor # 1 ------------- GDT : 0x81F3F000 < 1023> IDT : 0x81F3F400 < 2047> LDTR: 0xDEAD0000 <WinNT> Type: Native Processor # 2 ------------- GDT : 0x82A48560 < 1023> IDT : 0x82A48960 < 2047> LDTR: 0xDEAD0000 <WinNT> Type: Native This application is [probably] NOT running in a virtual machine! |
Re: Unit zur VM detection + Testprogramm
Hallo freak4fun.
Vielen Dank für die Ergebnisse! :-D Unser Erkennungsmuster scheint bei VMWare mittlerweile sehr zuverlässig zu sein. Kann ich von Windows XP bei den Systemen ausgehen? Gruß blackdrake |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 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