是否可以生成除int3调试器捕获之外的软件断点,例如除以零?
如果是这样,我想知道为什么调试器不支持为软件断点生成不同的异常?对于具有反调试机制的程序,例如扫描未知的0xCC.
这有什么原因吗?因为到目前为止我见过的所有调试器都只实现了int3软件断点。
是否可以生成除int3调试器捕获之外的软件断点,例如除以零?
如果是这样,我想知道为什么调试器不支持为软件断点生成不同的异常?对于具有反调试机制的程序,例如扫描未知的0xCC.
这有什么原因吗?因为到目前为止我见过的所有调试器都只实现了int3软件断点。
除了 ollydbg2 的内置实验支持,在 x64dbg 中实现类似的东西相对容易,尽管需要一些手动脚本。使用 x64dbg 的SetExceptionBPX函数,您可以定义任何异常被 x64dbg 视为断点,而不是被常规异常处理逻辑处理。然后,您需要通过修改所需地址处的代码来创建自己的“断点”处理逻辑(创建和删除断点)以触发该异常并在之后恢复它。
此外,你问过
为什么调试器不支持为软件断点生成不同的异常?对于具有反调试机制的程序,例如扫描未知的
0xCC.
所以我会继续回答更广泛的问题。
尽管您准确地注意到调试器默认使用int3断点指令,但这绝对不是唯一的。出于这个原因,一些调试器(尤其是那些针对恶意软件分析和反调试的调试器)已经开始实施额外的软件断点方法。ollydbg 和 x64dbg 等调试器为不同的调试功能(即内存/数据断点)和隐蔽(例如触发调试器可能捕获的中断的不太常见的技巧)实现了多种断点类型。
对于大多数更常见的调试任务,这些对于大多数调试器用例来说是不必要的,因此许多调试器从不需要使用任何替代的异常触发指令。例如,gdb 的用户群主要是从未遇到过对此类功能的需求的软件开发人员。
最后,您已经专门询问了被零除异常用作软件断点替代方案的问题,因此我将特别说明使用除以零的一些缺点。
是否可以生成除 int3 以外的软件断点以供调试器捕获,例如除以零?
具体来说,那个更广为人知,但与替代方案相比,它是次优选择。它避免甚至被调试器提供了许多软件断点的替代品,因为它是一个比较棘手的异常产生和清除相比,单字节指令,例如int3,int1,outsb等
由于div指令需要寄存器或内存地址,并且不能接受除数的立即数,因此您需要准备一个值为 0 的寄存器或内存地址,并生成更长的指令,这可能会有点风险如果覆盖原代码的多条指令。由于这些原因,除以零远不如用作软件断点替代方法的方便。