Em x86 , o nível de privilégio atual é determinado pelos dois bits inferiores do seletor de segmento de código, ie o valor armazenado no registrador CS. Então, "tudo" que você precisa fazer para determinar o nível de privilégio atual de um processo é olhar para o valor de seu registro de CS.
Você pode fazer isso facilmente para o seu próprio programa (assumindo 64-bit x86 ):
#include <stdint.h>
#include <stdio.h>
int main (int argc, char **argv) {
uint64_t rcs = 0;
asm ("mov %%cs, %0" : "=r" (rcs));
printf("%d\n", (int) (rcs & 3));
return 0;
}
Para outros processos, você teria que anexar a eles usando algo como ptrace
e examinar seus registros. Você pode fazer isso manualmente usando gdb
: identificar um processo, anexar a ele (se tiver permissão) usando gdb --pid ...
e, em seguida, emitir gdb
command info registers cs
para ver o valor atual de CS e extrair o valor dos dois bits menos significativos.
No Linux em x86 , você verá rapidamente que o nível de privilégio atual é sempre 3: os processos do usuário sempre são executados no anel 3, exceto quando estão em chamadas do sistema (que são executadas no anel 0 ) - mas você não poderá vê-los no anel 0 externamente, exceto pelo rastreamento do código do kernel usando ftrace
por exemplo.