Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ASM Verständnisproblem (https://www.delphipraxis.net/176772-asm-verstaendnisproblem.html)

delphinub23 25. Sep 2013 15:04


ASM Verständnisproblem
 
Hallo delphianer,

ich versuche herauszufinden, ob meine Anwendung unter Parallels ausgeführt wird.
dazu habe ich folgenden Assembler-Code gefunden:

Code:
pushad
 mov esi, [ebp+xxxx]
 mov eax, [esi] ;load auth value
 mov ebx, [esi+4] ;load auth value
 mov ecx, [esi+8] ;load auth value
 mov edx, [esi+0Ch] ;load auth value
 mov edi, [esi+10h] ;load auth value
 mov esi, [ebp+xxxx] ;load real esi
 xor ebp, ebp
 push ebp ;upper bound value
 push ebp ;lower bound value
 mov ebp, '0x90'
 bound ebp, [esp] ;raise exception
 add esp, 8 ;discard bound values
 popad
In der Beschreibung steht, dass die Adressen spezifisch zu der "current execution session" sind.
Was bedeutet das und wie bekomme ich die Information?


Über folgende Funktionen finde ich bereits heraus, ob es sich um VMWare handelt.

Delphi-Quellcode:
function ObtainBIOSSerialNumber: string;
const
  WbemQuery          = 'SELECT SerialNumber FROM Win32_BIOS';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService  : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject  : OLEVariant;
  oEnum        : IEnumvariant;
  iValue       : LongWord;
begin;
  Result := '';
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService  := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
    FWbemObjectSet:= FWMIService.ExecQuery(WbemQuery,'WQL', wbemFlagForwardOnly);
    oEnum        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    if oEnum.Next(1, FWbemObject, iValue) = S_OK then
      Result := String(FWbemObject.SerialNumber);
  except
    on E:EOleException do
      OutputDebugString(PChar(Format('EOleException %s %x', [E.Message,E.ErrorCode])));
    on E:Exception do
      OutputDebugString(PChar(Format('%s: %s', [E.Classname, E.Message])));
  end;
end;

function IsVMWareBIOS: Boolean;
var
  BIOSSerial: string;
begin
  CoInitialize(nil);
  try
    BIOSSerial := ObtainBIOSSerialNumber;
    a := BIOSSerial; // test
    Result := (Pos('VMware-', BIOSSerial) > 0) or (Pos('VMW', BIOSSerial) > 0);
  finally
    CoUninitialize;
  end;
end;
Resultat unter Parallels: [Parallels-0C 37 30...] anstatt [VMWare-0C 37 30...].
Ist das zuverlässig genug um auch Parallels damit abzustecken?

Könnte mir jemand Hilfestellung zum ASM geben?

BUG 25. Sep 2013 16:14

AW: ASM Verständnisproblem
 
Ohne jetzt auf dein konkretes Problem eingehen zu können:
Von Zacherl gibt es in der DP eine Unit zum Erkennen von VMs.
Außerdem gab es auch eine interessante Diskussion (vermutlich bei der Entstehung) dazu.

Vielleicht hilft das dir weiter.

delphinub23 25. Sep 2013 18:32

AW: ASM Verständnisproblem
 
Vielen Dank! Das hilft mir etwas weiter. Ich frage mich nur wo oder wie Zacherl und Co. auf die Adressen gekommen sind :?:

Zacherl 26. Sep 2013 12:10

AW: ASM Verständnisproblem
 
Zitat:

Zitat von delphinub23 (Beitrag 1229923)
Vielen Dank! Das hilft mir etwas weiter. Ich frage mich nur wo oder wie Zacherl und Co. auf die Adressen gekommen sind :?:

Im Prinzip durch Testen unter den verschiedenen unterstüzten VM / OS Konstellationen. Die Unit wurde lange nicht mehr gewartet, deshalb kann ich leider nichts dazu sagen, ob sich eventuell einige Werte in neueren Versionen der Virtualisierungssoftware geändert haben.

Auch noch zu erwähnen ist, dass die verwendete Methode bei aktivierter Hardwarevirtualisierung (heute normalerweise Standard) nicht funktioniert.


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