AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Unit zur VM detection + Testprogramm
Thema durchsuchen
Ansicht
Themen-Optionen

Unit zur VM detection + Testprogramm

Ein Thema von Zacherl · begonnen am 23. Sep 2007 · letzter Beitrag vom 11. Jul 2010
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Benutzerbild von Zacherl
Zacherl
Registriert seit: 3. Sep 2004
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:
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;
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.

Unterstützte Betriebssysteme:
* Win95 .. WinME
* WinNT .. WinVista

Unterstützt werden momentan:
* VirtualPC, VMWare, VirtualBox, ParallelsWorkstation und WinE.
* QEMU (Testphase)

Geplante Features:
* Sandbox detection

Download: www.viathinksoft.de/download.php?id=125

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
 
blackdrake

 
Delphi 10.3 Rio
 
#31
  Alt 14. Aug 2009, 15:49
Für Verbesserungen sind wir gerne offen. Ich persönlich hab mich nicht um den Assembler-Kram damals gekümmert. Vielleicht weiß ja Zacherl, wieso das so ist. Du kannst gerne mal ein Update des Code posten.
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

 
Delphi 10.2 Tokyo Professional
 
#32
  Alt 14. Aug 2009, 16:26
Hi,

Ist ja nicht viel.. und eigentlich Größtenteils nur Kosmetik:

Alles aus der Unit VMDetection.pas

1)
Delphi-Quellcode:
type
  TxDTEntry = record
    GDTBase: DWord;
    IDTBase: DWord;
    LDTRBase: DWord;
    GDTLimit: Word;
    IDTLimit: Word;
  end;

// ==>

// Code natürlich entsprechend der neuen Namen anpassen
TxDTEntry = record
    GDTOffset: DWord;
    IDTOffset: DWord;
    LDTROffset: DWord;
    GDTSize: Word;
    IDTSize: Word;
  end;
2)
Delphi-Quellcode:
type
  TxDT = record
    Limit,
    BaseLow,
    BaseHigh: Word;
  end;

// ==>

TxDT = packed record // packed würde ich bei solchen Sachen empfehlen!
    Size: Word;
    Offset: DWord;
  end;
3)
Delphi-Quellcode:
function GetIDTBase: DWord;
var
  IDT: TxDT;
begin
  asm
    SIDT IDT
  end;
  Result := (IDT.BaseHigh shl 16) or IDT.BaseLow;
end;

// ===>

function GetIDTOffset: DWord;
var
  IDT: TxDT;
begin
  asm
    SIDT IDT
  end;
  Result := IDT.Offset;
end;
4)

Delphi-Quellcode:
function GetIDTLimit: DWord;

// ==>

function GetIDTSize: DWord;
5)

Delphi-Quellcode:
function GetGDTBase: DWord;
var
  GDT: TxDT;
begin
  asm
    SGDT GDT
  end;
  Result := (GDT.BaseHigh shl 16) or GDT.BaseLow;
end;

// ==>

function GetGDTOffset: DWord;
var
  GDT: TxDT;
begin
  asm
    SGDT GDT
  end;
  Result := GDT.Offset;
end;
6)
Delphi-Quellcode:
function GetGDTLimit: DWord;

// ==>

function GetGDTSize: DWord;
7)

Delphi-Quellcode:
function GetLDTRBase: DWord;

// ==>

function GetLDTROffset: DWord;
Das sind wie du siehst und ich gesagt habe ja keine wirklichen großen Änderungen^^ Hab ja gesagt dass es etwas kleinlich ist, aber so finde ich den Code schöner bzw. verständlicher.

Gruß
Neutral General
Michael
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#33
  Alt 14. Aug 2009, 16:51
Result := (IDT.BaseHigh shl 16) or IDT.BaseLow; und mann kann auch froh sein, daß der Compiler die Berechnung auf seine Prozessorauflösung (32 bit) hochoptimiert,
denn (Word shl 16) ergibt ja eigentlich 0, da alle Bits aus dem Word rausgeschoben würden
und die Erweiterung auf LongWord, für die Zuweisung an diesen Typ, eigentlich erst am Ende der Berechnung durchgeführt wird.

mit 32 Bit-Werten und 64 Bit als Ergebnis ginge soetwas nicht.
  Mit Zitat antworten Zitat
devidespe

 
Delphi 10.4 Sydney
 
#34
  Alt 15. Aug 2009, 09:56
Vielleicht tragen die hier genannten Verbesserungen ja zur Optimierung des bestehenden Codes bei.

Grundsätzlich ist das Vergleichen von einzelnen Adressen aber immer problematisch, da es die konsequente Pflege dieses Datenbestandes voraussetzt.

Von daher müsste man sich eigentlich von den wichtigsten virtuellen Umgebungen (Heise hatte da vor kurzem mal einen Vergleichstest) die API's besorgen, da ich mir jeweils unterschiedliche Wege vorstelle, wie eine VM erkannt werden kann.
Devid
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

 
Delphi 10.2 Tokyo Professional
 
#35
  Alt 15. Aug 2009, 11:41
Zitat von devidespe:
Vielleicht tragen die hier genannten Verbesserungen ja zur Optimierung des bestehenden Codes bei.

Grundsätzlich ist das Vergleichen von einzelnen Adressen aber immer problematisch, da es die konsequente Pflege dieses Datenbestandes voraussetzt.

Von daher müsste man sich eigentlich von den wichtigsten virtuellen Umgebungen (Heise hatte da vor kurzem mal einen Vergleichstest) die API's besorgen, da ich mir jeweils unterschiedliche Wege vorstelle, wie eine VM erkannt werden kann.
Ich denke in diesem Fall macht das nichts. Die GDT/IDT sollte eigentlich IMMER an der gleichen Stelle gespeichert sein. Alles andere würde mich wundern.
Michael
  Mit Zitat antworten Zitat
devidespe

 
Delphi 10.4 Sydney
 
#36
  Alt 15. Aug 2009, 13:31
Die Frage ist ja, ob die hier genannten Verbesserungsvorschläge insbesondere von Neutral General und Himitsu helfen, das bei mir nicht erkannte Virtual PC 2007 erkennbar zu machen ?

Falls ich da noch was testen soll, bin ich gerne bereit.
Devid
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

 
Delphi 11 Alexandria
 
#37
  Alt 15. Aug 2009, 15:44
Hallo zusammen,
gut ich nutze Windows 7 RC1 in der 64 Bit Version und als VM das komplett neue "Windows Virtual PC" (von welchem ich im übrigen sehr begeistert bin).
Zuvor hat MS ja Virtual PC xxxx verwendet.
Mit dem anscheinend völlig neuen VM geht MS neue Wege.

Die Unit erkennt diese neue VM von MS natürlich noch nicht.
(wird von Euch auch nicht supportet, noch nicht ; weder Windows 7 noch Windows Virtual PC)

Da diese VM von MS IMHO wohl bald weit verbreitet sein wird, allzumal man ja eine XP-Lizenz kostenfrei dazu bekommt, USB verfügbar ist, Anwendungen aus der VM wie eine normale Anwendung gestartet werden können u.v.m., wäre es doch sinnvoll dieses hier mit aufzunehmen, oder?

Ich wäre gern bereit Euch die fehlenden Informationen zu liefern bzw. auch Test's durchzuführen.
Allerdings müsste ich genau wissen was zu tun ist weil ich mich in diesem Bereich nicht auskenne.
Jürgen
  Mit Zitat antworten Zitat
Hisoka

 
FreePascal / Lazarus
 
#38
  Alt 8. Jul 2010, 13:16
Mal eine kleine Frage: Wie versuchst du WINE zu erkennen? Denn da WINE keine Virtualisierungslösung ist, sollte es nicht möglich sein WINE von WinXX zu unterscheiden(von der Erkennung her). (Es wird bei mir auch nicht Unterschieden)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#39
  Alt 8. Jul 2010, 16:46
Wie versuchst du WINE zu erkennen?
Wine hat nicht für alles eine Umleitung, man muß also nur schauen, ob etwas "fehlt".

Geändert von himitsu ( 8. Jul 2010 um 16:49 Uhr)
  Mit Zitat antworten Zitat
Hisoka

 
FreePascal / Lazarus
 
#40
  Alt 10. Jul 2010, 17:40
Wie versuchst du WINE zu erkennen?
Wine hat nicht für alles eine Umleitung, man muß also nur schauen, ob etwas "fehlt".
Das ist mal eine eher schlechte Idee. Denn dann kann man nie sicher sein wie lange der Code funktioniert. Denn die Wine Leute versuchen ja immer wieder Funktionen fertigzustellen oder neue Sachen zu implementieren. Auch gibt es dann wieder einen Unterschied zwischen einem Stub der schon mal generiert wurde und einer Funktion die noch gar nicht implementiert wurde. (Aber allgemein halte ich eher wenig von der Idee WINE erkennen zu wollen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 14:43 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