- - -
Библиотека:
- Очень проста в использовании
- Кроссплатформенная (Windows + MacOS + Linux)
- Поддерживает множество архитектур (alpha, amd64, arm64, arm64ec, armel, armhf, hppa, i386, m68k, mips, mipsel, mips64, mips64el, powerpc, ppc64, ppc64el, riscv64, s390x, sh4, sparc64, x32)
- Оснащена примерно 90 уникальными техниками обнаружения ВМ [[список](https://github.com/NotRequiem/VMAware/blob/main/docs/documentation.md#flag-table)]
- Создана с использованием самых передовых методов
- Способна обнаруживать около 70 марок ВМ, включая VMware, VirtualBox, QEMU, Hyper-V и многие другие [[список](https://github.com/NotRequiem/VMAware/blob/main/docs/documentation.md#brand-table)]
- Способна преодолевать средства защиты (харденинг) ВМ
- Очень гибкая, с тонким контролем над выполняемыми техниками
- Способна обнаруживать различные технологии ВМ и полу-ВМ, включая гипервизоры, эмуляторы, контейнеры, песочницы и др.
- Мемоизирована, то есть прошлые результаты кэшируются и извлекаются при повторном запуске для повышения производительности
- Доступна для C++11 и выше
- Поддерживается экосистемой портов на другие языки, такие как Rust, JavaScript и Ruby
- Header-only (состоит только из заголовочного файла)
- Не содержит внешних зависимостей
- Полностью лицензирована под MIT, допускает неограниченное использование и распространение
## Пример 🧪
```cpp
#include "vmaware.hpp"
#include
int main() {
if (VM::detect()) {
std::cout << "Virtual machine detected!" << "\n";
} else {
std::cout << "Running on bare metal" << "\n";
}
std::cout << "VM name: " << VM::brand() << "\n";
std::cout << "VM type: " << VM::type() << "\n";
std::cout << "VM certainty: " << (int)VM::percentage() << "%" << "\n";
}
```
Возможный вывод:
```
Virtual machine detected!
VM name: VirtualBox
VM type: Hypervisor (type 2)
VM certainty: 100%
```
## Структура ⚙️
## CLI-утилита 🔧
Этот проект также предоставляет удобную CLI-утилиту, использующую весь потенциал библиотеки. Она также кроссплатформенная.
Ниже приведён пример базовой системы QEMU без модификаций защиты на Linux.
## Установка 📥
Чтобы установить библиотеку, скачайте файл `vmaware.hpp` из последнего [раздела релизов](https://github.com/NotRequiem/VMAware/releases/latest) в ваш проект. Бинарные файлы также находятся там. Никаких CMake или связываний разделяемых объектов не требуется — всё действительно так просто.
Однако, если вам нужен полный проект (глобально доступные заголовки с `` и CLI-утилита), выполните следующие команды:
```bash
git clone https://github.com/NotRequiem/VMAware
cd VMAware
```
### ДЛЯ LINUX:
```bash
sudo dnf/apt/yum update -y # замените на команду вашего дистрибутива
mkdir build
cd build
cmake ..
sudo make install
```
### ДЛЯ MACOS:
```bash
mkdir build
cd build
cmake ..
sudo make install
```
### ДЛЯ WINDOWS:
```bash
cmake -S . -B build/ -G "Visual Studio 16 2019"
```
При желании вы можете создать отладочную сборку, добавив `-DCMAKE_BUILD_TYPE=Debug` к аргументам cmake.
### Установка через CMake
```cmake
# edit this
set(DIRECTORY "/path/to/your/directory/")
set(DESTINATION "${DIRECTORY}vmaware.hpp")
if (NOT EXISTS ${DESTINATION})
message(STATUS "Downloading VMAware")
set(URL "https://github.com/NotRequiem/VMAware/releases/latest/download/vmaware.hpp")
file(DOWNLOAD ${URL} ${DESTINATION} SHOW_PROGRESS)
else()
message(STATUS "VMAware already downloaded, skipping")
endif()
```
Файл модуля и версия функции находятся [здесь](auxiliary/vmaware_download.cmake)
## Документация и обзор кода 📒
Вы можете ознакомиться с полной документацией [здесь](docs/documentation.md).
Здесь приведены все подробности: функции, техники, настройки и примеры. Поверьте, это не так страшно ;)
## Порты на другие языки 🔀
VMAware также поддерживает различные языки. Если C++ — не тот язык, который вы ищете, обратитесь к списку ниже. Все эти проекты официально поддерживаются разработчиками VMAware.
| Язык | Репозиторий | Подробности | Автор |
|:---------|:---------------:|:--------:|:------:|
|
Ruby | [ссылка](https://github.com/NotRequiem/VMAware/tree/main/gem) | Официальный порт на Ruby, встроенный в репозиторий VMAware. Windows не поддерживается. | [Adam Ruman](https://github.com/addam128) |
|
JS | [ссылка](https://github.com/Kyun-J/node-vm-detect) | Отличный API, активно поддерживается. | [Kyun-J](https://github.com/Kyun-J) |
|
Rust | [ссылка](https://github.com/btwmarcel/vmaware-rs) | Отличный API, хорошо протестирован, активно поддерживается | [Marcel](https://github.com/btwmarcel) |
> [!WARNING]
> Хотя неофициальные порты существуют, они не тестируются по сравнению с нашими официальными. Используйте их на свой страх и риск.
## Q&A ❓
Как это работает?
> Фреймворк использует обширный список низкоуровневых и высокоуровневых анти-VM техник, учитываемых в системе баллов. Баллы (0–100) для каждой техники назначаются на основе объективных критериев, направленных на обнаружение самых скрытных ВМ при максимальном снижении ложных срабатываний. Каждая техника, обнаружившая ВМ, добавляет свои баллы к общему накопительному счёту, а пороговое значение баллов определяет, действительно ли система работает в ВМ.
Для кого предназначена эта библиотека и каковы варианты её использования?
> Она разработана для исследователей безопасности, инженеров ВМ, разработчиков античитов и практически всех, кому нужен практичный и надёжный механизм обнаружения ВМ в своём проекте. Библиотека полезна аналитикам вредоносного ПО, проверяющим скрытность своих ВМ, и разработчикам проприетарного ПО, стремящимся защитить свои приложения от реверс-инжиниринга. Это эффективный инструмент для оценки того, насколько хорошо ВМ способна скрыться от обнаружения.
>
> Кроме того, программное обеспечение может изменять своё поведение в зависимости от обнаруженного окружения. Это может пригодиться для целей отладки, а системные администраторы могут гибко управлять конфигурациями. Наконец, некоторые приложения могут юридически ограничивать использование в ВМ с помощью лицензионного соглашения для предотвращения несанкционированного распространения или тестирования.
Зачем ещё один проект обнаружения ВМ?
> Уже существует множество проектов с той же целью, например
InviZzzible, pafish и Al-Khaser. Разница с вышеупомянутыми проектами заключается в том, что они не предоставляют программного интерфейса для взаимодействия с механизмами обнаружения, а также практически не поддерживают системы кроме Windows. Кроме того, обнаружение ВМ во всех этих проектах зачастую недостаточно совершенно для практического применения в реальных условиях. Дополнительным препятствием является то, что все они распространяются под лицензией GPL, поэтому их использование в проприетарных проектах (главной целевой аудитории для такого функционала) исключено. Pafish и InviZzzible заброшены годами.
>
> Хотя эти проекты в определённой степени были полезны для VMAware, мы хотели сделать их гораздо лучше. Наша цель заключалась в том, чтобы сделать техники обнаружения программно доступными, кроссплатформенными и гибкими, чтобы каждый мог извлечь из них пользу, а не просто получить CLI-утилиту. В итоге, это фреймворк для обнаружения ВМ, ориентированный на практическое и реалистичное применение в любом сценарии, целью которого является предоставление наиболее точного результата об окружении, в котором работает ваше ПО.
Не делает ли открытый исходный код проект хуже?
> VMAware полностью открыт, что облегчает задачу создателям обходов по сравнению с закрытым кодом. Однако мы считаем это оправданным компромиссом ради максимального количества техник обнаружения ВМ в открытом и интерактивном формате. Это означает, что мы можем получать ценные отзывы сообщества для более эффективного и точного усиления библиотеки через обсуждения, сотрудничество и соревнование с проектами anti-anti-VM и инструментами анализа вредоносного ПО, пытающимися скрыть своё присутствие.
>
> Всё это вместе взятое продвинуло передовые инновации в области обнаружения ВМ гораздо продуктивнее, чем в случае закрытого кода. Иными словами, речь идёт о более высоком качестве И количестве, лучшей обратной связи и большей открытости вместо безопасности через обфускацию. По той же причине OpenSSH, OpenSSL, ядро Linux и другие ориентированные на безопасность проекты относительно безопасны: людей, помогающих их улучшать, больше, чем тех, кто пытается исследовать исходный код со злым умыслом. VMAware придерживается этой философии, и если вы хоть немного разбираетесь в безопасности, вам знакома фраза: «Безопасность через обфускацию — это НЕ безопасность».
Насколько эффективны средства защиты (харденинг) ВМ против библиотеки?
> Публично известные средства харденинга неэффективны, и большинство из них на Windows уже побеждены, но это не означает, что библиотека неуязвима для них. Кастомные средства защиты, о которых мы можем не знать, могут иметь теоретическое преимущество, но их создание значительно сложнее.
>
> Мы непрерывно отслеживаем как открытые, так и закрытые проекты и методы обхода, чтобы обнаруживать их. Windows является наиболее популярной ОС для обхода обнаружения ВМ, поэтому наш основной фокус направлен на усиление детектов для этой платформы.
>
> В настоящее время ни один публичный репозиторий, проект или база кода в целом не способны полностью обойти детекты на Windows. Когда обнаруживается рабочий публичный обход, он обычно исправляется за пару дней. Наша гонка вооружений в основном ведётся против приватных методов, скрываемых читерами для обхода как VMAware, так и античитов.
Как разрабатывается проект?
> С помощью исследований мы выявляем методы, используемые в настоящее время для сокрытия ВМ, и исследуем общие техники обнаружения, способные выявлять эти методы.
>
> Как только у нас появляется готовый к продакшену код, мы загружаем его в этот репозиторий и начинаем экспериментальное тестирование в реальных окружениях. Любой код в любой ветке GitHub является экспериментальным, тогда как последний релиз представляет наш стабильный код.
>
> Некоторые продукты, использующие наш проект, запускают нашу библиотеку на тысячах систем, сотрудничая с нами и сообщая о том, как VMAware вела себя на этих системах. Все эти отчёты проверяются нами вручную на предмет ложных срабатываний или любых других проблем в целом.
>
> В ходе оценки техник баллы для них динамически корректируются в зависимости от их эффективности, надёжности и того, как они работают в сочетании с другими техниками обнаружения. Критерии, используемые для выставления баллов, можно найти [здесь](docs/score_system.md).
>
> С помощью GitHub Actions мы автоматически отслеживаем возникновение проблем компиляции и времени выполнения на каждой целевой платформе при каждой загрузке нового коммита в наш репозиторий.
>
> Когда библиотека накапливает достаточно изменений, по нашему мнению, мы публикуем релиз и подробно описываем эти изменения. Перед выпуском релиза мы проводим аудит безопасности, чтобы убедиться в надёжности публикуемой версии.
Что насчёт использования для вредоносного ПО?
> Этот проект не поощряет разработку вредоносного ПО по понятным причинам. Даже если вы намерены использовать его для скрытности, он, скорее всего, всё равно будет заблокирован антивирусами, к тому же код изначально не обфусцирован.
>
> Мы намеренно не разрабатываем библиотеку для попыток обхода или предотвращения срабатываний EDR, таких как использование прямых/косвенных системных вызовов (syscalls), обнаружение инлайн-хуков и любых других техник уклонения вредоносных программ, не связанных с обнаружением виртуализации.
Планируется ли разработка компонента уровня ядра?
> Нет. По нашему мнению, не существует хороших решений пользовательского режима для обнаружения ВМ, и мы хотим посвятить всё наше время удовлетворению этой потребности. Мы всё ещё можем обнаруживать самые скрытные виртуализированные среды, полностью оставаясь в пользовательском режиме.
Потокобезопасна ли библиотека?
> Нет. Не вызывайте функции этой библиотеки из нескольких потоков одновременно — выполнение занимает не более 1 секунды.
У меня возникают ошибки линковки при компиляции
> Если вы компилируете с помощью gcc или clang, добавьте флаги -lm и -lstdc++ или используйте компиляторы g++/clang++. Если вы получаете ошибки линковщика в совершенно новой среде ВМ на Linux, обновите систему с помощью `sudo apt/dnf/yum update -y`, чтобы установить необходимые компоненты C++.
## Вопросы, обсуждения, пул-реквесты и запросы 📬
Если у вас есть предложения, идеи или вы хотите внести вклад — смело обращайтесь! Мы будем рады всё обсудить в разделах [issues](https://github.com/NotRequiem/VMAware/issues) или [discussions](https://github.com/NotRequiem/VMAware/discussions). Если вы хотите спросить что-то лично в приватном порядке, свяжитесь с `shenzken` в Discord.
По электронной почте: `vmaware.support@gmail.com`
## Авторы, участники и благодарности ✒️
- [Requiem](https://github.com/NotRequiem) (Main developer)
- [kernelwernel](https://github.com/kernelwernel) (Former creator and developer of the project)
- [Check Point Research](https://research.checkpoint.com/)
- [Unprotect Project](https://unprotect.it/)
- [Al-Khaser](https://github.com/LordNoteworthy/al-khaser)
- [pafish](https://github.com/a0rtega/pafish)
- [Matteo Malvica](https://www.matteomalvica.com)
- N. Rin, EP_X0FF
- [Peter Ferrie, Symantec](https://github.com/peterferrie)
- [Graham Sutherland, LRQA Nettitude](https://www.nettitude.com/uk/)
- [Alex](https://github.com/greenozon)
- [Marek Knápek](https://github.com/MarekKnapek)
- [Vladyslav Miachkov](https://github.com/fameowner99)
- [(Offensive Security) Danny Quist](chamuco@gmail.com)
- [(Offensive Security) Val Smith](mvalsmith@metasploit.com)
- Tom Liston + Ed Skoudis
- [Tobias Klein](https://www.trapkit.de/index.html)
- [(S21sec) Alfredo Omella](https://www.s21sec.com/)
- [hfiref0x](https://github.com/hfiref0x)
- [Waleedassar](http://waleedassar.blogspot.com)
- [一半人生](https://github.com/TimelifeCzy)
- [Thomas Roccia (fr0gger)](https://github.com/fr0gger)
- [systemd project](https://github.com/systemd/systemd)
- mrjaxser
- [iMonket](https://github.com/PrimeMonket)
- Eric Parker's discord community
- [ShellCode33](https://github.com/ShellCode33)
- [Georgii Gennadev (D00Movenok)](https://github.com/D00Movenok)
- [utoshu](https://github.com/utoshu)
- [Jyd](https://github.com/jyd519)
- [git-eternal](https://github.com/git-eternal)
- [dmfrpro](https://github.com/dmfrpro)
- [Teselka](https://github.com/Teselka)
- [Kyun-J](https://github.com/Kyun-J)
- [luukjp](https://github.com/luukjp)
- [Randark](https://github.com/Randark-JMT)
- [Scrut1ny](https://github.com/Scrut1ny)
- [Lorenzo Rizzotti (Dreaming-Codes)](https://github.com/Dreaming-Codes)
- [virtfunc](https://github.com/virtfunc)
- [Adam Ruman](https://github.com/addam128)
- [Juan Diego](https://github.com/w451)
- [Wiisus](https://github.com/wiisus)
- [Marcel](https://github.com/MarcelDev)
- [Max Ufer](https://github.com/Manny684)
- [Everdox](https://github.com/everdox)
- [snackapps](https://github.com/snackapps)
- [Bandwidth](https://github.com/bandw1dth)
## Юридическая информация 📜
Вы несёте единоличную ответственность за использование данного репозитория и за обеспечение соответствия вашего использования применимому законодательству, нормативным актам, а также условиям любых сторонних систем, сервисов, учётных записей или данных, с которыми вы взаимодействуете.
Публикация этого репозитория или любые ссылки на сторонние продукты, сервисы, наименования или товарные знаки не подразумевают какого-либо одобрения или поддержки.
Стороннее программное обеспечение, модели, наборы данных, исполняемые файлы и другие материалы, включённые в данный репозиторий или упоминаемые в нём, остаются объектом их собственных лицензий и условий. Вы несёте ответственность за ознакомление с этими отдельными условиями и их соблюдение.
Лицензия: MIT