我怎样写从用户空间的x86调试寄存器的OSX?
-
25-09-2019 - |
题
我想玩弄从我的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指示的点。 他们不是从用户空间访问的。
不隶属于 StackOverflow