Einzelnen Beitrag anzeigen

delphinub23

Registriert seit: 27. Okt 2010
Ort: Chemnitz
110 Beiträge
 
Delphi XE3 Professional
 
#1

ASM Verständnisproblem

  Alt 25. Sep 2013, 16:04
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?

Geändert von delphinub23 (25. Sep 2013 um 16:17 Uhr) Grund: schlechte Formulierung
  Mit Zitat antworten Zitat