Como posso detectar programaticamente em que o anel (-1, 0, 1, 2, 3) Eu estou correndo?

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

  •  23-08-2019
  •  | 
  •  

Pergunta

Como posso detectar programaticamente em que o anel (-1, 0, 1, 2, 3) Eu estou correndo?

Foi útil?

Solução

A maneira mais fácil é, basta executar o comando (x86) e pegar o erro correspondente.

por exemplo. (SEH, o Windows, o modo kernel)

bool ring_lower_0 = false;
__try
{
    __asm { <cmd> };
    ring_lower_0 = true;
}
__except( GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION )
{
    ring_lower_0 = false;
}

Notas:

cmd, é um comando assembler. Veja as Intel Architecture Manuais de referência para uma lista de comandos e seus respectivos níveis Ring.

O Linux tem um conceito um pouco diferente.

Mas lembre-se que as VMs que residem em um nível mais baixo pode mascarar o resultado emulando a chamada.

(NB: O trabalho da VM é traduzir a instrução inválido em uma chamada significativa)


Se você realmente quer para verificar se o seu virtualizados e quer parar a execução por causa disto, você deve ler o que foi escrito sobre 'Red pílula'.

Outras dicas

A menos que você é um driver de dispositivo, você sempre vai estar em execução no anel 3 (para sistemas que têm "anéis", por si só).

Normalmente eu iria escrever que você deve ler sobre "programação modo protegido". Há um artigo sobre como intertact com anel 0 usando o Windows XP SP2. Note-se que ele vai mudar para outras versões do Windows e para sistemas operacionais certeza que outros.

http://www.codeproject.com/KB/threads/MinimalisticRingZero.aspx

Se você quiser apenas para detectar se você está rodando dentro de uma máquina virtual, para evitar que as pessoas depurar seu aplicativo, por exemplo, você pode conferir aqui:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top