为什么大多数调试器不能自动识别函数?

逆向工程 调试器 职能
2021-06-12 09:35:02

谁能向我解释为什么大多数调试器不能自动识别功能?

这是我只在 IDA 和 ollydbg 中发现的功能,我尝试过的任何其他调试器都不会像 IDA 和 olly 那样分析函数。

我知道这可能是一个性能问题,证明不要将此功能设置为默认行为,但是为什么像 x64dbg 这样的调试器似乎没有该功能?

谢谢。

1个回答

由于汇编指令集相当复杂,因此在大型可执行二进制文件中正确找出函数边界是一项有点困难的任务。即使是专门做这方面的 IDA,在某些情况下也有不少错误和失误。

这可以追溯到反汇编策略,它基本上是用于为给定的二进制流提供反汇编列表的算法。它们通常分为两类:

  1. 线性扫描是简单地将一条指令一个接一条地反汇编。反汇编指令序列的直接方法 - 在最后一条指令结束的地方开始下一条指令反汇编。
  2. 递归反汇编尝试在反汇编时考虑代码流,并且可能会持有一堆“函数条目”(例如,每次调用都会在该队列中获取它的目标地址)。队列一直被反汇编引擎清空,直到分析了所有遇到的函数。

尽管线性扫描被认为更易于实现和递归反汇编以产生更好的结果,但它们都有其优点和缺点。

大多数调试器不会过多关注反汇编任务,因为通常,指令指针寄存器会指向正确的反汇编函数,很少需要反汇编大二进制 blob 和识别函数。此外,由于大多数静态分析工具 IDA 将更多的注意力放在“全貌”的曝光上,调试器往往一次只关注一小部分可执行文件。

聚苯乙烯

x64dbg 是另一个调试器(被某些人认为是 ollydbg 的替代品),具有不错的功能发现。