【问题标题】:Reading debug registers on linux在linux上读取调试寄存器
【发布时间】:2015-11-23 14:43:58
【问题描述】:

我想检测硬件断点。我可以使用以下方法读取寄存器值:

unsigned sp;
__asm __volatile("movl %%esp, %0" : "=r" (sp));
return sp;

尝试在 64 位机器上读取 dr0 我得到 Error: unsupported instruction 'mov'。 我设法使用-m32 进行编译,但是当我尝试运行时出现分段错误。

如何检查调试寄存器?我对 32 位和 64 位解决方案都感兴趣。

【问题讨论】:

  • 为什么这被否决了?请解释一下。
  • 您被否决了,因为您没有向我们展示错误代码。如果您不向我们展示您的所作所为,我们应该如何告诉您您做错了什么?
  • @FUZxxl,错误代码在上面,把esp换成dr0就好了。
  • 如果你一开始就这么说,那就没有任何问题了。

标签: c linux assembly


【解决方案1】:

您需要在 64 位模式下使用 64 位寄存器,这就是它无法编译的原因(大概是因为您没有显示您尝试过的实际代码......)

在任何情况下,您都无法在用户模式下读取调试寄存器。您应该说明为什么需要访问它们,否则这是一个 XY 问题。我最好的猜测是,您可能对 ptrace API 感兴趣。

【讨论】:

  • 已编辑,我想检测是否设置了硬件断点。什么都有,我把esp改成dr0,并尝试打印值。
  • @franz1 我不认为你可以在 Linux 上做到这一点。访问调试寄存器是一项特权操作,您的操作系统不允许您这样做。相反,请使用ptrace() API 来确定您是否正在被调试。
  • 另外请注意,如果已经附加了其他人,则调用ptrace 将失败,这已经是一个指示。如果调试器足够聪明地隐藏自己,它也会对调试寄存器这样做。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2022-07-18
  • 2018-06-02
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
相关资源
最近更新 更多