![]() |
VMWare, VirtualPC, VirtualBox, etc detection
Hey,
ich habe folgende Methode gesehen, mit der man testen kann, ob das eigene Programm virtualisiert wird.
Code:
Nur habe ich leider keine Idee, wie ich das ganze in eine inline Assembler Funktion konvertieren könnte. Kann da jemand helfen?
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 Gruß |
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: ![]() ![]() Die PDF direkt: ![]() 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. |
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? |
Re: VMWare, VirtualPC, VirtualBox, etc detection
Zitat:
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": ![]() |
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:
Allerdings werden weder _vmware_detected noch _virtualpc_detected aufgerufen.
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; |
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.
|
Re: VMWare, VirtualPC, VirtualBox, etc detection
Okey danke dir :)
|
Re: VMWare, VirtualPC, VirtualBox, etc detection
Versuch's mal hiermit:
Delphi-Quellcode:
... oder wenn das nicht geht das hier
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;
Delphi-Quellcode:
... und wenn das partout nicht geht, versuche
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;
Delphi-Quellcode:
Beide sind identisch, eben verschiedene Darstellungen. Und immer an die Besonderheiten denken, die ich u.a. im Artikel beschrieben habe.
function GetSIDTBaseAddress: DWORD; assembler;
asm db $83, $EC, $08, $0F, $01, $0C, $24, $8B, $44, $24, $02, $83, $C4, $08 end; Sobald du die BaseAddress hast, kannst du ja den Rest selber schreiben ;) |
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: ![]() |
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:
Wenn du hingegen eine Funktionen aufrufen möchtes (z.B. VirtualPCErkannt() oder VMWareErkannt()), die dann deine Warnungen oder Captions erzeugen, müsste folgendes Funktonieren:
procedure ...
asm ... jge @@sprungziel ... @@sprungziel ... end;
Delphi-Quellcode:
Kann es leider derzeit nicht ausprobieren.
procedure XYZ;
begin showmessage('XYZ'); end; procedure ABC; asm CALL XYZ; end; Gruß blackdrake |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04: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