Come faccio a rilevare a livello di codice in cui l'anello (-1, 0, 1, 2, 3) Sono in esecuzione?

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

  •  23-08-2019
  •  | 
  •  

Domanda

Come faccio a rilevare a livello di codice in cui l'anello (-1, 0, 1, 2, 3) Sono in esecuzione?

È stato utile?

Soluzione

Il modo più semplice è, per eseguire solo il comando (x86) e intercettare l'errore corrispondente.

es. (SEH, Windows, in modalità kernel)

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

Note:

cmd, è un comando assembler. Per un elenco dei comandi e dei loro rispettivi livelli di Anello vedere i manuali di riferimento Intel Architecture.

Linux ha un concetto leggermente diverso.

Ma ricordate che VM che risiedono su un livello più basso può mascherare il risultato emulando la chiamata.

(NB: il lavoro del VM è quello di tradurre l'istruzione non valida in una chiamata significativo)


Se davvero si vuole controllare se il vostro un virtualizzato e vuole fermare l'esecuzione a causa di questo, si dovrebbe leggere ciò che è stato scritto su 'La pillola rossa'.

Altri suggerimenti

A meno che non sei un driver di periferica, sarai sempre in esecuzione in Ring 3 (per i sistemi che hanno "anelli", di per sé).

Normalmente avrei scritto che si dovrebbe leggere "Programmazione modalità protetta". C'è un articolo su come intertact con anello 0 si utilizza Windows XP SP2. Si noti che cambierà per gli altri le versioni di Windows e di sicuro altri sistemi operativi.

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

Se si desidera solo per rilevare se si esegue all'interno di una macchina virtuale, al fine di evitare che le persone eseguire il debug delle applicazioni, ad esempio, è possibile controllare qui:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top