我想玩弄从我的OSX用户空间程序在x86规格(DR0-7)定义调试的MSR。不幸的是,这些都需要CPL == 0(又名环0)。我已经通过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