2013-03-26 106 views
3

假设一个调试器(常见的x86 ring3调试器,如olly,IDA,gdb等)将软件断点设置为虚拟地址0x1234。调试器如何从断点恢复?

,这是通过在0x1234的更换任何操作码“的0xCC” 现在让我们假设调试进程完成运行这个指令的0xCC并引发 软件异常和调试器捕获此。

调试器检查存储器内容,注册并做一些事情..现在它想要恢复进程的debugee进程。

这是据我所知。从现在开始,这是我的假设。

调试器恢复原来的操作码(已被替换为0xCC) 歹徒为了恢复执行。

调试程序操纵debugee's CONTEXT的EIP指向 恢复的指令。

调试器处理异常,现在,恶魔从断点恢复。

但调试器希望断点保持不变。 调试器如何管理这个?

+0

好问题。我猜测片上调试器支持硬件必须帮助解决这个问题。 – 2013-03-26 18:04:33

回答

0

在短期和老百姓的话:

自从进入调试状态原子操作X86ARM处理器进入它和调试状态的退出是一样的,在架构的任何其他指令。 见gdb documentation说明它是如何工作和可以使用的。

以下是ARM和X86规格的一些亮点:

ARM

SW(软件)断点被暂时处于断点位置用特殊 更换 指令操作码实施了“断点“指令之前立即执行或执行 您的代码。当内核执行断点指令时,将会强制 进入调试状态。 SW断点只能放在RAM 中,因为它们依赖于修改目标内存。

通过对观察点单元进行编程来设置硬件(硬件)断点,以监视从特定存储器位置获取指令的内核总线。 HW 断点可以在RAM或ROM中的任何位置设置。在调试 指令被复制(Scatterloading),修改或处理器MMU重新映射内存区域的代码时,应使用HW断点。 在这些情况下,SW断点不可靠,因为它们可能是 丢失或被覆盖。

X86

方式软件断点的工作是相当简单的。具体来说,要设置一个软件断点,调试器只需在目标指令的第一个字节上写入一个int 3指令(操作码0xCC)即可,即 。当执行 被转移到您设置断点的地址时,会导致中断3被触发。当这个 发生时,当您设置 断点时,调试器“插入”并将0xCC操作码字节与 交换指令的原始第一个字节,以便您可以立即继续执行,而不必立即触击相同的断点。实际上有更多的魔力 涉及,允许您从断点继续执行,并且 不立即命中,但保持断点处于活动状态以供将来使用; 我会在以后的文章中讨论这个问题。

硬件断点,正如你可能想象到的名字,设置 与特殊的硬件支持。特别是,对于x86,这涉及到一个特殊的可能鲜为人知的寄存器组,称为“Dr.” 寄存器(用于调试寄存器)。这些寄存器允许您设置最多 四个(对于x86,这是高度特定于平台的)地址,当 读取,读取/写入或执行时,会导致处理器向 发送导致执行停止的特殊异常和控制 转移到调试

1

直接回答原来的问题,从GDB internals manual

当用户说继续,GDB会恢复原来的 指令,单步,重新插入陷阱,然后继续。