用Delphi 64位检测虚拟化环境?

问题描述 投票:0回答:1
// VMware detection as described by Elias Bachaalany
function IsInsideVMware: Boolean;
begin
  Result := True;

  try
    asm
      push edx;
      push ecx;
      push ebx;

      mov eax, 'VMXh';
      mov ebx, 0;
      mov ecx, 10;
      mov edx, 'VX';

      in eax, dx;

      cmp ebx, 'VMXh';
      setz [Result];

      pop ebx;
      pop ecx;
      pop edx;
    end;
  except
    Result := False;
  end;
end;


function IsRunningUnderHyperV: BOOL; stdcall;
var
  VMBranding: array[0..12] of AnsiChar;
begin
  asm
    mov eax, $40000000;
    cpuid;
        mov dword ptr [VMBranding+0], ebx;  // Get the VM branding string
        mov dword ptr [VMBranding+4], ecx;
        mov dword ptr [VMBranding+8], edx;
  end;
  VMBranding[12] := #0;
  Result := CompareText(String(VMBranding), 'Microsoft Hv') = 0;
end;

如何对64位的Delphi应用程序进行检测?

如果我试着编译成64位,我得到的信息是 "不支持的语言功能,ASM "和 "操作数大小不匹配"。ASM "和 "操作数大小不匹配"。我知道你需要把asm代码和pascal代码分开,而且寄存器是不同的,但不知道该怎么做?

delphi assembly virtual-machine x86-64 vmware
1个回答
1
投票

最后,我在3264位的时候用了这个方案。

var
  LFlag: Cardinal;

//================================= VMWare =====================================

procedure TryVMWare;
{$IFDEF CPUX86}
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax, 'VMXh'
    mov ecx, 0Ah
    mov dx, 'VX'
    in eax, dx
    mov LFlag, ebx
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
{$ENDIF CPUX86}
{$IFDEF CPUX64}
  asm
    push rax
    push rbx
    push rcx
    push rdx
    mov eax, 'VMXh'
    mov ecx, 0Ah
    mov dx, 'VX'
    in eax, dx
    mov LFlag, ebx
    pop rdx
    pop rcx
    pop rbx
    pop rax
  end;
{$ENDIF CPUX64}

function IsInsideVMware: Boolean;
begin
  LFlag := 0;
  try
    TryVMWare;
  except
  end;
  Result := LFlag = $564D5868;
end;

至于在64位中检测其他VM品牌,我使用了以下代码。

https:/github.comJBontesFastCodeblobmasterFastcodeCPUID.pas。

更新代码,以x64位运行和编译,并检测虚拟机品牌。

© www.soinside.com 2019 - 2024. All rights reserved.