Мне нужно определить, работает ли мое приложение в экземпляре виртуальной ОС или нет.
Я нашел статью с полезной информацией по этой теме. Эта же статья появляется в нескольких местах, я не уверен в исходном источнике. VMware реализует определенную недействительную инструкцию x86 для возврата информации о себе, а VirtualPC использует магическое число и порт ввода/вывода с инструкцией IN.
Это работоспособно, но в обоих случаях оно выглядит недокументированным. Я полагаю, что будущий выпуск VMWare или VirtualPC может изменить механизм. Есть ли способ лучше? Есть ли поддерживаемый механизм для любого продукта?
Аналогично, существует ли способ обнаружить Xen или VirtualBox?
Меня не интересуют случаи, когда платформа намеренно пытается скрыть себя. Например, приманки используют виртуализацию, но иногда скрывают механизмы, которые вредоносная программа будет использовать для ее обнаружения. Меня не волнует, что мое приложение будет думать, что оно не виртуализировано в этих приманках, я просто ищу решение "лучшего усилия".
Приложение в основном Java, хотя я ожидаю использовать собственный код плюс JNI для этой конкретной функции. Поддержка Windows XP/Vista наиболее важна, хотя механизмы, описанные в указанной статье, являются общими функциями x86 и не зависят от какой-либо конкретной ОС.