如何阻止我的应用程序在Virtualbox上运行?

问题描述:

我试过this unit来检测我的应用程序是否在Oracle VirtualBox中运行,但它没有检测到VirtualBox。如何阻止我的应用程序在Virtualbox上运行?

我已经使用安装在VirtualBox中的Windows 7测试了它。

是否有任何有效的方法来防止我的VCL应用程序在VirtualBox中运行?

+2

你尝试调试代码,以弄清楚为什么它不检测VirtualBox的?对下载有评论:“*如果安装了Windows 8,此代码无法检测到虚拟盒?*”,因此VirtualBox检测可能通常被破坏?看看检测代码,它实际上是非常简单的代码 - 它只是测试运行该应用程序的系统上是否存在“VBoxHook.dll”或“\\。\ VBoxMiniRdrDN”。也许你的VirtualBox版本没有这些项目? –

+2

虚拟盒子有什么特别之处?你想阻止它,但不是其他虚拟机。虚拟机是未来。试图阻止它们会削弱软件的实用性。 –

+0

@DavidHeffernan想到了最低要求的硬件/软件支持。例如(至少目前)需要DX10 +或OpenGL3.0 +的任何东西都不能正常工作。也就是说,软件应该正确地测试它需要的特定需求,如果是这种情况,而不是从其他指标获得支持,比如它是否在虚拟机中......当然VirtualBox中的支持会随着时间而改变。 –

你可以使用Win32_BaseBoard WMI类,并检查产品字符串包含单词“Virtual

例如:

function _IsOSVirtual(): Boolean; 
const 
    v = 'virtual'; 
Begin 
    Result := False; 
    CoInitialize(nil); 
    try 
    if Pos(v, LowerCase(GetWin32_BaseBoard('Product'))) > 0 then 
     Result := True; 
    finally 
    CoUninitialize; 
    end; 
end; 
+0

v8上的VMWare也有[440BX桌面参考平台](https://communities.vmware.com/thread/409703) – FredS

如果你能获得BIOS信息(与WMI或其他方法)你可以找到VirtualBox的踪迹。

instance of Win32_BIOS 
{ 
    ... 
    BIOSVersion = {"VBOX - 1"}; 
    Caption = "Default System BIOS"; 
    Description = "Default System BIOS"; 
    Manufacturer = "innotek GmbH"; 
    Name = "Default System BIOS"; 
    SerialNumber = "0"; 
    SMBIOSBIOSVersion = "VirtualBox"; 
    SMBIOSPresent = TRUE; 
    SoftwareElementID = "Default System BIOS"; 
    SoftwareElementState = 3; 
    Status = "OK"; 
    Version = "VBOX - 1"; 
}; 

继续使用WMI,其他类可以帮助您识别VirtualBox安装。例如下面的查询:

Select Manufacturer, Model, OEMStringArray from Win32_ComputerSystem 

返回这个值:

instance of Win32_ComputerSystem 
{ 
    Manufacturer = "innotek GmbH"; 
    Model = "VirtualBox"; 
    OEMStringArray = {"vboxVer_5.1.22", "vboxRev_115126"}; 
}; 

function IsRunningVirtualBox : Boolean; 
var 
    vHandle : THandle; 
begin 
    Result := false; 
    vHandle := LoadLibrary('VBoxHook.dll'); 
    if vHandle <> 0 then begin 
     Result := true; 
     FreeLibrary(vHandle); 
    end; 
end;