How to detect if my application is running in a virtual machine?

前端 未结 10 1257
青春惊慌失措
青春惊慌失措 2020-11-28 05:52

How can I detect (.NET or Win32) if my application is running in a virtual machine?

相关标签:
10条回答
  • 2020-11-28 05:55

    Here is an example of one way to do it. It only works with Microsoft's Virtual PC and VMWare, but it's a start: http://www.codeproject.com/KB/system/VmDetect.aspx

    0 讨论(0)
  • 2020-11-28 05:57
    public static bool isVirtualMachine()
    {
        const string MICROSOFTCORPORATION = "microsoft corporation";
        const string VMWARE = "vmware"; 
    
        foreach (var item in new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
        {
            string manufacturer = item["Manufacturer"].ToString().ToLower();
            // Check the Manufacturer (eg: vmware, inc)
            if (manufacturer.Contains(MICROSOFTCORPORATION) || manufacturer.Contains(VMWARE))  
            {
                return true;
            }
    
            // Also, check the model (eg: VMware Virtual Platform)
            if (item["Model"] != null)
            {
                string model = item["Model"].ToString().ToLower();
                if (model.Contains(MICROSOFTCORPORATION) || model.Contains(VMWARE)) 
                {
                    return true;
                }
            }
        }
        return false;
    }
    
    0 讨论(0)
  • 2020-11-28 05:58

    Jay Abuzi showed the solution in powershell. Here's the same as a c# function:

       /// <summary>
        /// Detect if this OS runs in a virtual machine
        /// 
        /// http://blogs.msdn.com/b/virtual_pc_guy/archive/2005/10/27/484479.aspx
        /// 
        /// Microsoft themselves say you can see that by looking at the motherboard via wmi
        /// </summary>
        /// <returns>false</returns> if it runs on a fysical machine
        public bool DetectVirtualMachine()
        {
            bool result = false;
          const  string  MICROSOFTCORPORATION ="microsoft corporation";
            try
            {
                ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("root\\CIMV2","SELECT * FROM Win32_BaseBoard");
    
                foreach (ManagementObject queryObj in searcher.Get())
                {
                   result =  queryObj["Manufacturer"].ToString().ToLower() == MICROSOFTCORPORATION.ToLower();
                }
                return result;
            }
            catch (ManagementException ex)
            {
                return result;
            }
        }
    
    0 讨论(0)
  • 2020-11-28 06:00

    According to Virtual PC Guy's blog post "Detecting Microsoft virtual machines", you can use WMI to check the manufacturer of the motherboard. In PowerShell:

     (gwmi Win32_BaseBoard).Manufacturer -eq "Microsoft Corporation"
    
    0 讨论(0)
  • 2020-11-28 06:00

    This is what I use:

    using (var searcher = new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem"))
    {
      using (var items = searcher.Get())
      {
        foreach (var item in items)
        {
          string manufacturer = item["Manufacturer"].ToString().ToLower();
          if ((manufacturer == "microsoft corporation" && item["Model"].ToString().ToUpperInvariant().Contains("VIRTUAL"))
              || manufacturer.Contains("vmware")
              || item["Model"].ToString() == "VirtualBox")
          {
            return true;
          }
        }
      }
    }
    return false;
    

    Edit 2014-12-02: Updated code so that it no longer detects a Microsoft Surface Pro as a VM. Thanks to Erik Funkenbusch for pointing this out.

    Edit 2017-06-29: Updated code so that it also checks the value of the HypervisorPresent property.

    Edit 2018-02-05: removed check for the HypervisorPresent property since it's incorrect. This property could return true if running on the host O/S on a hyper-V server.

    0 讨论(0)
  • 2020-11-28 06:00

    For Lower level Tests I recommend looking at ScoopyNG [1]. It is a collection of known low-level, well working vm detection methods, albeit being a little dated.

    If you really want to rely on other things, like installed tools (VM* Additions) , these are much easier to "fake".

    This [2] Blog Post also has a pretty nice overview, from low level asm stuff, checking for specific DLLs, filepaths and registry keys to check.

    [1] http://trapkit.de/research/vmm/scoopyng/index.html

    [2] http://securitykitten.github.io/vm-checking-and-detecting/

    0 讨论(0)
提交回复
热议问题