Пожалуйста, обратите внимание, что пользователь заблокирован
Попалась мне давеча очень старая тема под названием RedPill, которую я решил перепроверить на процессоре Intel с Windows 10 x64 и VMWare Workstation 15 Pro.
Если коротко, то некотрые байты из регистра
Под отладчиком ситуация выглядела следующим образом:
Где Virt - это значения, полученные с виртуалки, а Phys соответственно с хоста.
Выборка была сделана до и после ребута.
Из этой маленькой выборки видно, что на хосте отличаются 5 и 6 байты и что немаловажно - они занулены. Мое предположение - это было сделано в качестве устранения утечки адреса IDT-таблицы.
На этом предположении и построена антивм техника для x64 битовых систем. Интересно, как дела обстоят с дргуими версиями гипервизоров, ОС и процессоров.
Если коротко, то некотрые байты из регистра
idtr, возвращаемые ассемблерной инструкцией SIDT будут отличаться на ВМ и хосте. Согласено мануалу Intel, в 64 битном режиме sidtсохраняет в выделенную память 10 байт; 8 байт (база) + 2 байта (лимит).Под отладчиком ситуация выглядела следующим образом:
Код:
Before reboot
Phys1: ff 0f 00 10 00 00 00 f8 ff ff
Phys2: ff 0f 00 10 00 00 00 f8 ff ff
Virt1: ff 0f 00 f0 b2 32 00 f8 ff ff
Virt2: ff 0f 00 f0 b2 32 00 f8 ff ff
After reboot
Virt1: ff 0f 00 f0 8e 09 01 f8 ff ff
Phis1: ff 0f 00 10 00 00 00 f8 ff ff
Где Virt - это значения, полученные с виртуалки, а Phys соответственно с хоста.
Выборка была сделана до и после ребута.
Из этой маленькой выборки видно, что на хосте отличаются 5 и 6 байты и что немаловажно - они занулены. Мое предположение - это было сделано в качестве устранения утечки адреса IDT-таблицы.
На этом предположении и построена антивм техника для x64 битовых систем. Интересно, как дела обстоят с дргуими версиями гипервизоров, ОС и процессоров.
C:
#include <stdio.h>
#include <intrin.h>
int main()
{
char idtr[10];
memset(idtr, 0, sizeof(idtr));
__sidt(&idtr);
if (idtr[4] != 0x00 && idtr[5] != 0x00) {
printf("This code was executed in VMWare\n");
}
else {
printf("This code was ececuted on a host machine\n");
}
return 0xbabababa;
}
Последнее редактирование: