どのように私はOSX上でユーザ空間からのx86デバッグレジスタを書くのですか?

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

質問

私は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