Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi VMWare, VirtualPC, VirtualBox, etc detection (https://www.delphipraxis.net/99480-vmware-virtualpc-virtualbox-etc-detection.html)

Zacherl 12. Sep 2007 19:49


VMWare, VirtualPC, VirtualBox, etc detection
 
Hey,

ich habe folgende Methode gesehen, mit der man testen kann, ob das eigene Programm virtualisiert wird.

Code:
SIDT FWORD PTR opIDT <-- Store IDT.
CMP DWORD PTR [opIDT+2], 0F0000000h <-- Check IDT location (possibly Virtual PC check).
JLE _check_virtualpc
CMP DWORD PTR [opIDT+2], 0FF000000h <-- Check IDT VMWare.
JG_vmware_detected

check_virtualpc:
CMP DWORD PTR [opIDT+2], 0D0000000h <-- Check IDT Virtual PC.
JGE _virtualpc_detected
Nur habe ich leider keine Idee, wie ich das ganze in eine inline Assembler Funktion konvertieren könnte. Kann da jemand helfen?

Gruß

Olli 12. Sep 2007 20:18

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Einfach die Bytefolge des Opcodes mit "DB" in einem Inline-ASM-Block einbinden.

Allerdings ist SIDT Dummfug und selbst Frau Rutkowska hat das bereits implizit eingestanden, indem sie es in ihrem SVV garnicht erst aus dem Usermode aufruft ... naja, und Thema Kernelmode und Delphi will ich hier nicht aufwaermen. Zur weiteren Lektuere, warum es Dummfug ist empfehle ich meine beiden Blogeintraege sowie den von dort herunterladbaren Artikel und das Programm mit Treiber:

http://blog.assarbad.net/20061105/re...ing-colorless/
http://blog.assarbad.net/20070401/re...ess-continued/

Die PDF direkt: http://blog.assarbad.net/wp-content/..._colorless.pdf



Nachtrag: Uebrigens bin ich persoenlich bei diesem Thema immer aeusserst skeptisch. Bisher habe ich nur zwei Anwendungen fuer das was du willst gesehen: Forschung (i.e. Neugierde) und Malware.

Zacherl 12. Sep 2007 20:48

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Sehr interessante Artikel. Den Maleware Aspekt hatte ich bisher nie so betrachtet. Ich möchte den User meines Programmes darauf hinweisen, dass einige Rechenintensive Aufgaben nicht in einer WM ausgeführt werden können, da die Ausführzeit einfach zu lange dauern würde.

Wie mache ich das mit dem Opcode?

Olli 12. Sep 2007 21:06

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Zitat:

Zitat von Zacherl
Wie mache ich das mit dem Opcode?

Bspw. bei Rutkowska im Code nachschauen:

Das sind alle Opcodes als einfache Bytes: \x0f\x01\x0d\x00\x00\x00\x00\xc3

Ansonsten die ueblichen Verdaechtigen, sprich Intel Manuals. Und die sagen:

SIDT = 0F 01 /1 .. .. .. .. (wobei die 4 freien Stellen eine Speicheradresse darstellen)

Bsp. fuer die Verwendung von "DB": http://www.delphipraxis.net/internal...=763908#763908

Zacherl 12. Sep 2007 21:25

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Da ich das mit den Opcodes nicht ganz verstehe habe ich es mal so versucht, weiß aber nicht, ob das ganze noch funktioniert. Im normalen System kommt eine AV und unter VirtualBox keine. Klingt eigentlich nicht schlecht oder?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  opIDT: Pointer;

procedure _vmware_detected;
begin
  Caption := 'VMWare';
end;

procedure _virtualpc_detected;
begin
  Caption := 'VirtualPC';
end;

procedure _check_virtualpc;
asm
  CMP DWORD PTR [opIDT+2], $0D0000000
  JGE _virtualpc_detected
end;

begin
  asm
    SIDT FWORD PTR opIDT
    CMP DWORD PTR [opIDT+2], $0F0000000
    JLE _check_virtualpc
    CMP DWORD PTR [opIDT+2], 0FF000000h
    JGE _vmware_detected
  end;
end;
Allerdings werden weder _vmware_detected noch _virtualpc_detected aufgerufen.

Olli 12. Sep 2007 21:29

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Bei dem Code wuerde ich immer eine AV erwarten. Werde nachher mal schauen, ob ich es in FP schreiben kann. Wie schon anderswo erwaehnt, habe ich kein Delphi installiert.

Zacherl 12. Sep 2007 21:33

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Okey danke dir :)

Olli 13. Sep 2007 00:56

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Versuch's mal hiermit:

Delphi-Quellcode:
function GetSIDTBaseAddress: DWORD; assembler;
asm
  sub esp, 8 // create stack frame
  sidt qword ptr [esp]
  mov eax, dword ptr [esp+2] // write into EAX for return value
  add esp, 8 // clean up stack
end;
... oder wenn das nicht geht das hier

Delphi-Quellcode:
function GetSIDTBaseAddress: DWORD; assembler;
asm
  sub esp, 8 // create stack frame
  { sidt qword ptr [esp] }
  db $0F, $01, $0C, $24
  mov eax, dword ptr [esp+2] // write into EAX for return value
  add esp, 8 // clean up stack
end;
... und wenn das partout nicht geht, versuche

Delphi-Quellcode:
function GetSIDTBaseAddress: DWORD; assembler;
asm
  db $83, $EC, $08, $0F, $01, $0C, $24, $8B, $44, $24, $02, $83, $C4, $08
end;
Beide sind identisch, eben verschiedene Darstellungen. Und immer an die Besonderheiten denken, die ich u.a. im Artikel beschrieben habe.


Sobald du die BaseAddress hast, kannst du ja den Rest selber schreiben ;)

Olli 13. Sep 2007 01:50

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Sorry, hatte einen Fehler drin. Statt [esp-2] muß es natürlich [esp+2] heißen. Habe es oben soeben korrigiert.

Noch für die Englischsprachigen: http://blog.assarbad.net/20070913/ge...s-with-delphi/

blackdrake 13. Sep 2007 07:00

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Hallo.

Besteht noch ein Problem? Leider habe ich noch nicht so das Vergnügen mit dem Inline-Assembler gehabt, aber ich glaube du hast ein Problem bei den Jump-Befehlen (JMP/JGE/... etc). Meines Wissens nach müsste ein Assembler Jump-Befehl in Delphi so aussehen:

Delphi-Quellcode:
procedure ...
asm
  ...
  jge @@sprungziel
  ...
  @@sprungziel
  ...
end;
Wenn du hingegen eine Funktionen aufrufen möchtes (z.B. VirtualPCErkannt() oder VMWareErkannt()), die dann deine Warnungen oder Captions erzeugen, müsste folgendes Funktonieren:

Delphi-Quellcode:
procedure XYZ;
begin
  showmessage('XYZ');
end;

procedure ABC;
asm
  CALL XYZ;
end;
Kann es leider derzeit nicht ausprobieren.

Gruß
blackdrake

Olli 13. Sep 2007 11:10

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Guckst du in meine Antwort, dann siehst du, daß Jumps nichtmal nötig sind. :zwinker: :mrgreen:

Zacherl 13. Sep 2007 12:14

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank Oli :thumb:

Habs jetzt mal so implementiert und es scheint zu funktionieren:

Delphi-Quellcode:
function CheckVirtual: Boolean;

function GetSIDTBaseAddress: DWORD; assembler;
asm
  sub esp, 8
  sidt qword ptr [esp]
  mov eax, dword ptr [esp+2]
  add esp, 8
end;

var
  SIDT: DWORD;
begin
  Result := false;
  SIDT := GetSIDTBaseAddress;

  if SIDT >= $0D0000000 then
  begin
    Result := true;
  end;
  if SIDT >= $0FF000000 then
  begin
    Result := true;
  end;
end;
Allerdings habe ich die Abfrage

Code:
CMP DWORD PTR [opIDT+2], $0F0000000
JLE _check_virtualpc
jetzt rausgelassen. Habe ich sie als

Delphi-Quellcode:
if SIDT <= $0F0000000 then ...
implementiert gehabt, allerdings war diese Abfrage auch auf der VM nicht zutreffend, weshalb die VM dann auch nicht erkannt wurde.

Nachtrag 1: Unter VirtualBox mit Windows2000 scheints schonmal nicht zu funktionieren. WinXP Pro und WinXP MCE werden aber als VM erkannt.
Nachtrag 2: Bei Vista wird auch keine VM erkannt. Liegen die BaseAdressen der SIDT bei Vista, 2000, etc in anderen Bereichen?

blackdrake 13. Sep 2007 13:10

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Hallo.

Hast du diese Publikation auch schon zu Rate gezogen?

http://www.s21sec.com/descargas/vmware-eng.pdf

Gruß
blackdrake

Zacherl 13. Sep 2007 13:21

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe ich jetzt mal getan, allerdings haben sämtliche dort vorgestellten Programme das selbe Problem. Sie erkennen unter Win XP wunderbar, wenn es in einer VM läuft. Bei Win2000 oder Vista scheitern sie allerdings :(

So, habe mal ein Testprogramm angehangen, was auch die SIDT Base ausgibt. Könntet ihr das vielleicht mal auf eurer VM und auf eurem RealSystem testen und jeweils das OS und die Base Adresse angeben?

Meine Messungen:
Code:
RealSystem
--------------
Win XP Home:
2147742720
3132343696
--------------


VirtualBox
--------------
Win XP Pro:
4131451024

Win XP MCE:
4131451024

Win 2000 Pro:
3204509840

Win Vista:
2302734480
--------------

Olli 13. Sep 2007 15:40

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Hexadezimaldarstellung wuerde die Lesbarkeit doch deutlich erhoehen.

Olli 13. Sep 2007 17:35

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Jo, sieht mir aus wie abgeschrieben. Entweder Rutkowska von der o.g. Quelle oder umgekehrt. Dumm nur, dass es in jedem Fall Quark war, der da abgeschrieben wurde:

Zitat:

There is only one IDTR register, one GDTR register and one LDTR register, but there are two operating systems being executed: the one of the virtual machine and the one of the native machine. So the VMM needs to change the localization of the different tables. This generates an inconsistency between the values of the registers in the virtual machine and the values in the native machine.

Olli 13. Sep 2007 17:48

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Zacherl, hast du eigentlich mal versucht die STR-Methode aus dem Paper, auf welches dich Blackdrake verwiesen hat, zu testen?

Zacherl 13. Sep 2007 18:15

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Diese Methode habe ich ehrlich gesagt nicht ganz verstanden, bzw habe mangels fehlender Assembler Kentnisse keine Idee wie ich das umsetzen kann.

Die IDT Methode stammt von hier:
http://www.mnin.org/?page=vmmdetect&left=off

Allerdings funktioniert sie außer bei Vista bemerkenswert gut.

blackdrake 13. Sep 2007 18:37

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Hallo.

Bringt es dir etwas, wenn ich dein Testprogramm auf Windows 95b, 98SE und 2000 SP4 laufen lasse, jedoch ohne Vergleich zu einer VMM?

PS: Die Publikation, zu der ich hingewiesen hatte, weist auf folgendes Beispielprojekt hin, welches jedoch scheinbar nur VMWare erkennt. Ich weiß nicht, ob du das auch gesehen hast. Der Link ist hier: http://www.trapkit.de/research/vmm/scoopydoo/index.html .

In diesem C-Projekt ist folgender Abschnitt eventuell interessant:

Delphi-Quellcode:
/* scoopy - A VMware Fingerprinter
 * Windows Version v1.0 
 *
 * tested with:
 *  VMware 3.2.0 build-2230 and Win2000/XP
 *  VMware 4.0.0 build-4460 and Win2000/XP/2003 
 *
 * -tk, 2003
 * [url]www.trapkit.de[/url]
 */ 

#include <stdio.h>

/* Common base values for fingerprinting.
 * Windows 2003 Server has the same base
 * values as Windows XP.
 */
#define VMWARE3_IDT         0xFFC6A370
#define VMWARE4_IDT         0xFFC17800
#define NATIVE_IDT_WINXP   0x8003F400   // same for Windows 2003 Server
#define NATIVE_IDT_WIN2000   0x80036400

#define VMWARE3_LDT         0xDEAD3fa8
#define VMWARE4_LDT         0xDEAD4058
#define NATIVE_LDT_WINXP   0xDEAD0000 // same for Windows 2003 Server
#define NATIVE_LDT_WIN2000   0xDEAD0000

#define VMWARE3_GDT         0xFFC05000
#define VMWARE4_GDT         0xFFC07000
#define NATIVE_GDT_WINXP   0x8003F000 // same for Windows 2003 Server
#define NATIVE_GDT_WIN2000   0x80036000
Weiß jetzt aber nicht, ob IDT und GDT dir hilft, wenn du nach IDTR suchst.

Gruß
blackdrake

Zacherl 13. Sep 2007 18:41

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Wenn du das Testprogramm aus dem anderen Thread auf Win2000 startest würde mir das helfen :)

Diesen source von scoopy habe ich auch schon angesehen, allerdings hat er das selbe Problem, wie der Code den ich momentan verwende als auch Olis SIDTcon. Olis Programm erkennt eine Vista VM nicht als VM und mein Code erkennt ein richtiges Vista nicht als richtig :D

Das IDT ist wichtig für mich. In dem neuen Code den ich verwende prüfe ich ob die IDT base in einer bestimmten range liegt. Wenn das nicht der Fall ist, ist man vermutlich in einer VM. Das Problem ist nur, dass ab Vista diese range wohl nach hinten hin vergrößert wurde. Mit den Tests will ich jetzt gucken wie weit nach hinten dies sein könnte.

blackdrake 13. Sep 2007 20:24

Re: VMWare, VirtualPC, VirtualBox, etc detection
 
Hallo.

Anbei die Testergebnisse von VMTest.exe mittels nativen Systemen und Microsoft Virtual PC 2007.

Delphi-Quellcode:
Win95b + MVPC 2007 = 3896083712, VM-Detektion positiv
Win95b NATIVE     = (Wird durch Edit des Posts nachgereicht)

Win98SE + MVPC 2007 = 3896083712, VM-Detektion positiv
Win98SE NATIVE     = 2148188160, VM-Detektion negativ

WinME  + MVPC 2007 = 3896083712, VM-Detektion positiv
WinME  NATIVE     = (Leider habe ich derzeit kein reales System mit Windows ME)

Win2000 + MVPC 2007 = 3854140672, VM-Detektion positiv
Win2000 NATIVE     = 2147705856, VM-Detektion negativ
Wenn deine Methode sicher ist würde ich dir empfehlen, sie in der CodeLib einzutragen.

Gruß
blackdrake


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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