Как программно определить, в каком кольце (-1, 0, 1, 2, 3) я работаю?
-
23-08-2019 - |
Вопрос
Как программно определить, в каком кольце (-1, 0, 1, 2, 3) я работаю?
Решение
Самый простой способ — просто запустить команду (x86) и обнаружить соответствующую ошибку.
Например.(SEH, Windows, режим ядра)
bool ring_lower_0 = false;
__try
{
__asm { <cmd> };
ring_lower_0 = true;
}
__except( GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION )
{
ring_lower_0 = false;
}
Примечания:
cmd — это команда ассемблера.Список команд и соответствующие им уровни кольца см. в справочных руководствах по архитектуре Intel.
В Linux немного другая концепция.
Но помните, что виртуальные машины, находящиеся на более низком уровне, могут маскировать результат, эмулируя вызов.
(Примечание:Задача виртуальной машины — преобразовать неверную инструкцию в осмысленный вызов)
Если вы действительно хотите проверить, виртуализирован ли вы, и хотите из-за этого остановить выполнение, вам следует прочитать то, что написано о «Красной таблетке».
Другие советы
Если вы не являетесь драйвером устройства, вы всегда будете работать в Ring 3 (для систем, которые имеют «кольца» как таковые).
Обычно я бы написал, что вам следует прочитать о «программировании защищенного режима».Есть статья о том, как взаимодействовать с кольцом 0 с помощью Windows XP SP2.Обратите внимание, что он изменится для других версий Windows и, конечно же, для других операционных систем.
http://www.codeproject.com/KB/threads/MinimalisticRingZero.aspx
Если вы просто хотите определить, работаете ли вы внутри виртуальной машины, чтобы избежать отладки вашего приложения, например, вы можете проверить здесь: