Обнаружение VMWare программным способом

Я хотел бы проверить, работает ли мое приложение на VMWare. Есть ли надежный способ сделать это в C ++?


person Mike Trader    schedule 11.12.2009    source источник
comment
Почему именно вам это нужно? Не могу придумать многих причин, где простую запускать под вм? диалогового окна недостаточно (даже если оно действительно действительно необходимо)   -  person viraptor    schedule 12.12.2009
comment
Дублирование stackoverflow.com/questions/154163/   -  person saschabeaumont    schedule 14.12.2009
comment
@viraptor Это не потому, что вы не можете вспомнить случаи, которых нет. Например, я работаю над идентификацией компьютера для лицензий и тому подобного, и мне нужно знать, нахожусь ли я в виртуальной машине или нет, потому что это определит, какую информацию об оборудовании я собираюсь использовать, и узнать, буду ли я Я нахожусь в виртуальной машине, я должен проверить все возможные виртуальные машины, включая VM Ware.   -  person Virus721    schedule 04.08.2014
comment
@ Virus721 Это был не пренебрежительный комментарий. Здесь действительно поможет знание варианта использования. Например, вы говорите об аппаратной информации - она ​​отделена от части виртуальной машины, и если вы хотите быть ориентированными на будущее (как насчет новых типов? Как насчет сквозной передачи устройств? Что, если они изменят имя?), Вам действительно стоит взглянуть на перечисленное оборудование, а не проверять тип виртуальной машины. Если это для лицензии, то вы, вероятно, смотрите на эту виртуализированную проверку, а не на определение конкретного гипервизора. Вот почему я не думаю, что этот гость vmware - хороший вопрос в большинстве случаев.   -  person viraptor    schedule 04.08.2014
comment
Обнаружение распространенных конфигураций виртуальных машин тривиально. Помните, что пользователь всегда сможет обойти ваши проверки, если в этом возникнет необходимость.   -  person Croll    schedule 12.04.2019


Ответы (3)


Я только что нашел эту сборку на codeproject.

http://www.codeproject.com/KB/system/VmDetect.aspx

person Daniel A. White    schedule 11.12.2009

Я думаю, что эта ссылка может вам помочь. Это в сборке, а не на C ++, но вы всегда можете создать блок сборки в своем C ++ ...

////////////////////////////////////////////////////////////////////////////////
//
//  Simple VMware check on i386
//
//    Note: There are plenty ways to detect VMware. This short version bases
//    on the fact that VMware intercepts IN instructions to port 0x5658 with
//    an magic value of 0x564D5868 in EAX. However, this is *NOT* officially
//    documented (used by VMware tools to communicate with the host via VM).
//
//    Because this might change in future versions - you should look out for
//    additional checks (e.g. hardware device IDs, BIOS informations, etc.).
//    Newer VMware BIOS has valid SMBIOS informations (you might use my BIOS
//    Helper unit to dump the ROM-BIOS (http://www.bendlins.de/nico/delphi).
//
function IsVMwarePresent(): LongBool; stdcall;  // platform;
begin
  Result := False;
 {$IFDEF CPU386}
  try
    asm
            mov     eax, 564D5868h
            mov     ebx, 00000000h
            mov     ecx, 0000000Ah
            mov     edx, 00005658h
            in      eax, dx
            cmp     ebx, 564D5868h
            jne     @@exit
            mov     Result, True
    @@exit:
    end;
  except
    Result := False;
  end;
{$ENDIF}
end; 

Как и в случае с любым кодом из Интернета, будьте осторожны, просто копируйте и вставляйте его и ожидайте, что он будет работать безупречно.

person CrimsonX    schedule 11.12.2009
comment
Похоже, это вызывает сбой на сервере Win2k8 и, возможно, 32-битной ОС Windows 7, к сожалению. - person Mike Trader; 12.12.2009
comment
Вероятно, вам нужно обернуть его в структурированный обработчик исключений Win32. Если вы получили недопустимое исключение инструкции или подобное, вы не работаете в VMware. msdn.microsoft.com/en-us/library/ s58ftw19% 28VS.80% 29.aspx - person Tim Sylvester; 12.12.2009

Я считаю, что этот умный и «простой» код сборки на C ++ может помочь кому угодно. Вы можете прочитать больше об этом на странице github.

https://github.com/dretax/VMDetect

int IsVMRunning()
{
#if _WIN64 
    UINT64 time1 = rdtsc();
    UINT64 time2 = rdtsc();
    if (time2 - time1 > 500) {
        return 1;
    }
    return 0;
#else 
    unsigned int time1 = 0;
    unsigned int time2 = 0;
    __asm
    {
        RDTSC
        MOV time1, EAX
        RDTSC
        MOV time2, EAX

    }
    if (time2 - time1 > 500) {
        return 1;
    }
    return 0;
#endif
}
person DreTaX    schedule 12.04.2019