Я хотел бы проверить, работает ли мое приложение на VMWare. Есть ли надежный способ сделать это в C ++?
Обнаружение VMWare программным способом
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
Похоже, это вызывает сбой на сервере Win2k8 и, возможно, 32-битной ОС Windows 7, к сожалению.
- person Mike Trader; 12.12.2009
Вероятно, вам нужно обернуть его в структурированный обработчик исключений 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