Debugging x86调试寄存器:如何在特定物理地址上中断

Debugging x86调试寄存器:如何在特定物理地址上中断,debugging,x86,breakpoints,paging,systems-programming,Debugging,X86,Breakpoints,Paging,Systems Programming,x86调试寄存器(dr0到dr3)允许在软件尝试读取/写入()时在特定地址中断。并且此配置的地址必须是线性地址 问题是,当启用分页时,同一物理地址可能会被来自不同任务的多个不同线性地址映射到 因此,当我们不知道特定物理地址的所有可能线性别名地址时,如何中断对该地址的访问?如果不修改底层内核,您只能通过虚拟化扩展来实现这一点。当你是一个客户操作系统时,你所认为的物理地址在下一层是虚拟的;因此,它可以使用调试寄存器来实现所需的效果 如果您愿意修改内核,一种方法是拒绝映射“感兴趣的页面”,然后将此页面

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

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


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

如果不修改底层内核,您只能通过虚拟化扩展来实现这一点。当你是一个客户操作系统时,你所认为的物理地址在下一层是虚拟的;因此,它可以使用调试寄存器来实现所需的效果


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

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