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