处理器如何区分进程wrt HW bps?

逆向工程 调试 断点
2021-06-26 00:40:37

当设置硬件断点 ( DR0...) 时,它会存储一个地址(据我所知,它看起来像一个虚拟地址)。由于地址在进程之间共享(至少在 32 位中可能是这种情况),处理器如何知道哪个进程受到影响以引发异常?这对多处理器环境有什么影响吗?

我知道DR7bp 是否具有全局(所有任务)或本地(仅限当前任务)相关性的标志,但我看不到处理器如何知道何时引发异常,因为我可以410123为当前的 pid(任务)设置 hw bp at ,其他 pid 也可能使用相同的地址。

1个回答

DR7(调试控制)寄存器中的各个位决定了所讨论的硬件断点的适用性。这样的断点可以是局部的,也可以是全局的。

全局断点,顾名思义影响所有任务。本地断点特定于当前正在执行的任务。对于 Intel 架构,DR7 中的本地断点启用标志位在每次任务切换时被清除。全局断点保留在任务切换上。

在 Windows 中,您只能从用户模式设置本地硬件断点。

现在,根据英特尔文档,在任务切换时清除本地硬件断点。那么本地硬件断点是如何工作的呢?

硬件断点在正确的进程上工作并触发,因为 Windows 不使用处理器中可用硬件任务状态切换机制。Windows 有自己的上下文切换机制。在上下文切换期间,内核会创建一个称为 的特殊结构TRAP_FRAME来存储有关调试寄存器的信息以及其他信息。TRAP_FRAME是线程的情况下完成的一部分。

当线程被重新安排执行时,Windows 会恢复保存的上下文,并且硬件断点也随之恢复。

因此,处理器永远无法区分进程 A 和进程 B 中的本地硬件断点。它所看到的只是在每个处理器上执行的单个任务。跨各种进程恢复本地硬件断点的责任在于 Windows。


回复评论

(1) 在 Windows 上,硬件断点是线程特定的。这意味着如果您在来自特定线程的地址上设置 hwbp,则仅当线程执行/读取/写入该特定地址时才会触发断点。HWBP 从来都不是过程宽的因此,对于从线程 1 设置的 hwbp,线程 2 永远不会中断。

(2) Linux 的情况也一样。然而,它很可能与 iOS 不同,因为它运行在不同的架构上,即 ARM 而不是 x86。