Одним жуть каким прохладным январским утром от знакомого прилетел вопрос как на C# определить, не запущена ли программа в ОС (оконное приложение в ОС Windows 7 или новее) на виртуальной машине.
Требования к такому детектору были достаточно жёсткими:
- Должен быть полностью в исходных кодах,
- Должен собираться с помощью Visual Studio,
- Должен работать из-под аккаунта непривилегированного пользователя (нельзя использовать методы, требующие, к примеру, установки драйверов устройств, или иных операций, для которых нужны права администратора),
- Разрешено использовать .NET Framework 4.5 и никаких лишних зависимостей (типа Visual C++ Redistributable Package).
Под катом описание реализованного детектора на C# (в следующей части с некоторыми элементами C++) и приличным количеством неприличного кода с использованием Visual Studio 2015 Community.
Структура публикации
- 1 уровень. Изучение матчасти и простейших существующих решений:
- немного теории касательно виртуализации,
- реализация проверки ВМ с помощью данных из Windows Management Instrumentation (WMI).
- 2 уровень. Поиск статей и публикаций про детектирование запуска в виртуальных машинах:
- допиливаем реализацию с WMI,
- работа с инструкцией CPUID.
- 3 уровень. Поиск материалов с хакерских конференций:
- допиливаем работу с CPUID,
- делаем сводную таблицу параметров и результатов тестирования.