как определить виртуальную машину?
От: gok Россия  
Дата: 09.10.15 13:41
Оценка:
Господа,
как определить то что приложение запущено на виртуальной машине?
ос: виндовс х64
язык: срр

Предистория: была ассемблерная функция для 32-битной системы, но с переходом на х64 получил ошибку компиляции
error C4235: nonstandard extension used : '_asm' keyword not supported on this architecture
gok
Re: медиаплеер
От: RiNSpy  
Дата: 09.10.15 14:01
Оценка: 1 (1)
 int swallow_redpill () {
   unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
   *((unsigned*)&rpill[3]) = (unsigned)m;
   ((void(*)())&rpill)();
   return (m[5]>0xd0) ? 1 : 0;
 }
Re: как определить виртуальную машину?
От: Сергей Мухин Россия  
Дата: 09.10.15 14:31
Оценка:
Здравствуйте, gok, Вы писали:

gok>Господа,

gok>как определить то что приложение запущено на виртуальной машине?
gok>ос: виндовс х64
gok>язык: срр

gok>Предистория: была ассемблерная функция для 32-битной системы, но с переходом на х64 получил ошибку компиляции

gok>error C4235: nonstandard extension used : '_asm' keyword not supported on this architecture

причём тут виртуалка? 64 MS действительно не поддержиывает __asm.
---
С уважением,
Сергей Мухин
Re[2]: как определить виртуальную машину?
От: gok Россия  
Дата: 09.10.15 15:45
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>причём тут виртуалка? 64 MS действительно не поддержиывает __asm.

Вопрос был: есть ли другие средства используя срр
gok
Re[3]: как определить виртуальную машину?
От: vasyaa  
Дата: 09.10.15 16:28
Оценка: 2 (1)
Здравствуйте, gok, Вы писали:

gok>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>причём тут виртуалка? 64 MS действительно не поддержиывает __asm.

gok>Вопрос был: есть ли другие средства используя срр
--
В чистом cpp 64 бита можно — g++ поддерживает asm Intel и AT&T синтакс.
Можно ассемблерный код выделить в отдельный файл, скомпилировать с masm и прилинковать. Что встроенный asm что из обьектного файла — значения не имеет.
Можна использовать intrinsic https://software.intel.com/sites/landingpage/IntrinsicsGuide/ — "C style functions that provide access to many Intel instructions"
Re[4]: как определить виртуальную машину?
От: vasyaa  
Дата: 09.10.15 19:28
Оценка:
Здравствуйте, vasyaa, Вы писали:

V>Здравствуйте, gok, Вы писали:


gok>>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>>причём тут виртуалка? 64 MS действительно не поддержиывает __asm.

gok>>Вопрос был: есть ли другие средства используя срр
V>--
V>В чистом cpp 64 бита можно — g++ поддерживает asm Intel и AT&T синтакс.
V>Можно ассемблерный код выделить в отдельный файл, скомпилировать с masm и прилинковать. Что встроенный asm что из обьектного файла — значения не имеет.
V>Можна использовать intrinsic https://software.intel.com/sites/landingpage/IntrinsicsGuide/ — "C style functions that provide access to many Intel instructions"

Исправление:
В принципе — в чистом cpp — нет — нет такого в стандарте.
Но в раширениях копилятора специфическими производителями компиляторов — да. Пример — gcc, sunCC, думаю что IBM xlC тоже. Microsoft не поддерживает inline assembly в 64 бита версии компилятора.
Re: как определить виртуальную машину?
От: MT-Wizard Украина  
Дата: 10.10.15 16:27
Оценка:
Здравствуйте, gok, Вы писали:

gok>Господа,

gok>как определить то что приложение запущено на виртуальной машине?
gok>ос: виндовс х64
gok>язык: срр

gok>Предистория: была ассемблерная функция для 32-битной системы, но с переходом на х64 получил ошибку компиляции

gok>error C4235: nonstandard extension used : '_asm' keyword not supported on this architecture

Как сказано на мсдне, вынесите функцию в отдельный .asm файл и прилинкуйте полученный объектник к проекту.
А ти, москалику, вже приїхав (с)
Re: как определить виртуальную машину?
От: Cruser Украина  
Дата: 03.11.15 14:40
Оценка: 2 (1)
Здравствуйте, gok, Вы писали:

gok>Господа,

gok>как определить то что приложение запущено на виртуальной машине?
gok>ос: виндовс х64
gok>язык: срр

gok>Предистория: была ассемблерная функция для 32-битной системы, но с переходом на х64 получил ошибку компиляции

gok>error C4235: nonstandard extension used : '_asm' keyword not supported on this architecture

Можно через cpuid команду.

 int cpuInfo[4];
 char strid[255] = {0};

__cpuid(cpuInfo, 0x40000000);
 *((int*)strid) = cpuInfo[0];
 *((int*)(strid+4)) = cpuInfo[1];
 *((int*)(strid+8)) = cpuInfo[2];

printf("%s\n", strid);


Должно быть "VMWareVMWare" или "HyperV".
Re[2]: как определить виртуальную машину?
От: gok Россия  
Дата: 03.11.15 17:35
Оценка:
Здравствуйте, Cruser, Вы писали:
C> Должно быть "VMWareVMWare" или "HyperV".

С разбегу не получилось. Пробовал распечатывать целые значения из cpuInf,
на моем лэптопе:
7
832
832
<strid начинается с \a те ничего не печатается>

на виртуальной:
1073741830
1919117645
1718580079
<знак "Пики", Alt+6>

Unicode?
gok
Re[3]: как определить виртуальную машину?
От: Cruser Украина  
Дата: 04.11.15 08:16
Оценка:
Здравствуйте, gok, Вы писали:

gok>Здравствуйте, Cruser, Вы писали:

C>> Должно быть "VMWareVMWare" или "HyperV".

gok>С разбегу не получилось. Пробовал распечатывать целые значения из cpuInf,

gok>на моем лэптопе:
gok>7
gok>832
gok>832
gok><strid начинается с \a те ничего не печатается>

gok>на виртуальной:

gok>1073741830
gok>1919117645
gok>1718580079
gok><знак "Пики", Alt+6>

gok>Unicode?


Похоже, надо с индекса 1 брать:

    *((int*)strid) = cpuInfo[1];
    *((int*)(strid + 4)) = cpuInfo[2];
    *((int*)(strid + 8)) = cpuInfo[3];


Ваши цифры в ASCII: Microsoft Hv. Это не юникод. Правда, возможно, этот метод не работает в других виртуалках, таких как VirtualBox. Так что извиняюсь.
Re[4]: как определить виртуальную машину?
От: gok Россия  
Дата: 04.11.15 20:51
Оценка:
Здравствуйте, Cruser, Вы писали:

C> Ваши цифры в ASCII: Microsoft Hv. Это не юникод. Правда, возможно, этот метод не работает в других виртуалках, таких как VirtualBox. Так что извиняюсь.


теперь на виртуальной:
1919117645
1718580079
1984438388
Microsoft Hv

Для VMWare сервера, наверное, будет что то подобное
gok
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.