【问题标题】:x86 debug register : how to break on a specific physical addressx86 调试寄存器:如何中断特定的物理地址
【发布时间】:2017-08-30 18:52:50
【问题描述】:

x86 调试寄存器(dr0 到 dr3)允许在软件尝试读/写 (intel doc) 时中断特定地址。而且这个配置的地址必须是线性地址。

问题是当启用分页时,同一个物理地址可能会被来自不同任务的几个不同的线性地址映射到。

那么,当我们不知道所有可能的线性别名地址时,如何中断对特定物理地址的访问?

【问题讨论】:

  • 同样的老方法:int 03h 在你想要中断的地址 ;) 这是一个单字节指令,并引发了与调试寄存器相同的异常。您可以将原始字节保存在某处(即使在禁用的调试寄存器中!如果上下文允许)。我不知道是否有一个聪明的方法。
  • 我应该把int 03h放在哪里?在我看来,int 03h 允许中断指令地址。但是在这里,这条指令(修改内存的内容)是未知的。因此,目标是中断对内存中特定地址的访问,以获取修改存储在该地址的内容的指令。
  • 哦,对不起!我误读了你的问题。我不认为你可以打破 R/W 但不幸的是调试寄存器。
  • 也许您可以将某些内容锁定到物理内存中。然后打破映射的线性地址将有效地监控支持的物理地址。
  • 这是一个奇怪的场景,你将如何访问这个物理地址?如果是内核空间,它会在每个进程上映射相同,如果是用户空间,那么为什么要映射到不同的进程上,否则你如何访问它?

标签: debugging x86 breakpoints paging systems-programming


【解决方案1】:

在不修改底层内核的情况下,您只能通过虚拟化扩展来做到这一点。当您是客户操作系统时,您所认为的物理地址对于下一层来说是虚拟的;所以它可以使用调试寄存器来达到预期的效果。

如果您愿意修改内核,一种方法是拒绝映射“感兴趣的页面”,然后将该页面上的所有错误重定向到适当的调试器。这比我说的要复杂,您可能必须模拟/单步执行一些代码并保持一些复杂的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多