После долгого гугления самое удовлетворительное что я нашол,это - "VBOX HARDDRIVE,QEMU HARDDISK,VMWARE VIRTUAL IDE HARD DRIVE,VIRTUAL HD" В итоге ничего кроме Код (Text): bool VmDetect() { //char ids[]="VBOX HARDDRIVE,QEMU HARDDISK,VMWARE VIRTUAL IDE HARD DRIVE,VIRTUAL HD"; char vbox[]="VBOX"; char qemu[]="QEMU"; char vmw[]="VMWARE"; char unkn[]="VIRTUAL HD"; GUID h=GUID_DEVCLASS_DISKDRIVE; DWORD rg,rsz; char *buf=(char*)malloc(4096); SP_DEVINFO_DATA devinfo; devinfo.cbSize=sizeof(SP_DEVINFO_DATA); HDEVINFO devs=SetupDiGetClassDevs(&h,NULL,NULL,DIGCF_PRESENT); SetupDiEnumDeviceInfo(devs,0,&devinfo); SetupDiGetDeviceRegistryPropertyA(devs,&devinfo,SPDRP_FRIENDLYNAME,&rg,(BYTE*)buf,4096,&rsz); //MessageBoxA(0,buf,"",MB_OK); if(strstr(buf,vbox)!=NULL || strstr(buf,qemu)!=NULL || strstr(buf,vmw)!=NULL || strstr(buf,unkn)!=NULL) { free(buf); return true; } else { free(buf); return false; } } Сообразить не вышло.Вроде не слишком универсально ((( Теперь ломаю голову - должен ли биос виртуалки всегда отличаться от биоса реального железа,и причем в одном и том же месте.Кто что думает по этому поводу?
ИМХО, помойму проще запросить вендор биоса, у виртульных машин я не в стречал настоящих производителей прошивок.
Сие реликт и уже не актуально. Вендоры в камни запилили это, посему хардварная эмуляция и её нет смысла детектить.
_nic Эмуляция всего. На всяких варях, вайнах и прочих архитектурах ваш код с детектором работать не будет. Следовательно он не портабельный, а значит никому не нужен. Я например юзаю софт на варе, если он не работает, то я беру другой. Если малварку пишите, то также смысла нет детектить. Он может быть только для триала, но это конечно не задача.
Satsura Софт или железо, которое что то эмулирует завётся эмулятором. Например дос на нт это эмуляция, одновременно хардварная(V8086) и софтверная(NTVDM).
Ну тогда не полноценный эмуль, хотя я никогда его таковым не считал. Это всего лишь прослойка win вызовов над ядром никсов (самопальные хаки с ndis и ntoskrnl не в счет). А есче для просветвления могу посоветовать почитать в вики на тему вайна.
А еще можно "тиражировать" софт с привязкой к железу,при помощи виртуалок.В общем присекать нада установку на виртуалки.
Ну например у vmware есть различия в CPUID. mov eax, 1 cpuid ebx = 03040800 = на хосте 4 ядерник реально; ebx = 00000800 = на vmware… CPU count = 0 ?! Есть у меня небольшая база по CPUID-дампам… в ebx либо полный ноль (например у атлонов сокет-А), либо если в младших 16 битах не ноль - то поле CPU count реальное (где 1 проц, где 2, и т.п., но не 0). ecx = 00802009 = на хосте ecx = 80802001 = на vmware… 31бит в описаниях значится как reserved Реальный процов с этим битов не видел… Но это вероятно только у vmware, может какой-то magic-бит для её самой. В прочих регистрах тоже есть различия, но не столь явные. Например под vmware пропадает бит FXSR и т.п. надо на других виртуалках тоже всё это проверить. Детект по имени производителя HDD который в первом посте описан кстати может провалится, у vmware можно ведь физический диск в виртуалку отдать… Понятно что так мало кто делает, но тем не менее… wine детектить можно через бэкдоры в его дллках. LoadLibrary 'kernel32.dll' GetProcAddress 'wine_get_unix_file_name'