Как программно определить, в каком кольце (-1, 0, 1, 2, 3) я работаю?

StackOverflow https://stackoverflow.com/questions/1086722

  •  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

Если вы просто хотите определить, работаете ли вы внутри виртуальной машины, чтобы избежать отладки вашего приложения, например, вы можете проверить здесь:

http://www.codeproject.com/KB/system/VmDetect.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top