Как я могу написать реестры отладки X86 из помещения пользователя на OSX?

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

Вопрос

Я хотел бы играть с помощью отладочного MSRS, определенных в SPECT X86 (DR0-7) из My Program Space Space OSX. К сожалению, эти требуют CPL == 0 (aka Ring 0). Я избил через SCHLLS OSX и за исключением kernel_debug Ничто не на самом деле не выпрыгивает как способ получить доступ к ним.

Это может быть тот случай, когда они доступны только через некоторые более высокие интерфейс уровня, как kernel_debug, но это неясно для меня, если это так или если бы я просто не нашел волшебную вызов, чтобы добраться до них.

Моя конечная цель доступа к функциональности этих регистров, а не сами реестры. У кого-нибудь есть понимание того, как делать такие вещи, как набор аппаратных точек останова?

Это было полезно?

Решение

Оказывается thread_get_state/thread_set_state это ответ.

#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);

Другие советы

Это в значительной степени точка кольца 0 инструкций. Они не доступны от пользовательского пространства.

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