Como escrevo registros de depuração x86 do espaço do usuário no OSX?
-
25-09-2019 - |
Pergunta
Gostaria de brincar com o MSRS depuração definido na especificação X86 (DR0-7) do meu programa de espaço de usuário do OSX. Infelizmente, eles requerem cpl == 0 (também conhecido como anel 0). Eu me enrolei através dos syscalls OSX e com exceção de kernel_debug
Nada realmente salta como uma maneira de acessar isso.
Pode ser o caso de eles estarem disponíveis apenas por meio de uma interface de nível superior, como kernel_debug
, mas não está claro para mim se for esse o caso ou se eu simplesmente não encontrei a invocação mágica para alcançá -los.
Meu objetivo final é acessar a funcionalidade desses registros, não os próprios registros. Alguém tem uma visão de como fazer coisas como definir pontos de interrupção de hardware?
Solução
Acontece que thread_get_state
/thread_set_state
é a resposta.
#include <mach/mach_types.h>
thread_t target = get_target_thread();
struct x86_debug_state dr;
mach_msg_type_number_t dr_count = x86_DEBUG_STATE_COUNT;
kern_return_t rc = thread_get_state(target, x86_DEBUG_STATE, &dr, &dr_count);
printf("DR0: 0x%08x\n", dr.uds.ds32.__dr0);
printf("DR1: 0x%08x\n", dr.uds.ds32.__dr1);
printf("DR2: 0x%08x\n", dr.uds.ds32.__dr2);
printf("DR3: 0x%08x\n", dr.uds.ds32.__dr3);
printf("DR4: 0x%08x\n", dr.uds.ds32.__dr4);
printf("DR5: 0x%08x\n", dr.uds.ds32.__dr5);
printf("DR6: 0x%08x\n", dr.uds.ds32.__dr6);
printf("DR7: 0x%08x\n", dr.uds.ds32.__dr7);
Outras dicas
Esse é praticamente o ponto das instruções do anel 0. Eles não são acessíveis a partir do espaço do usuário.