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

这是我仅在IDA和ollydbg中发现的功能,我尝试过的任何其他调试器都不能将功能分析为IDA和olly做到了。

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

谢谢。

评论

较简单的答案是“因为调试器根本不知道函数有什么稀薄”,因为调试器一次只执行一条指令。即使显示了要执行的指令列表,也无法完全保证按照该顺序和这些指令将要发生的事情。

#1 楼

由于汇编指令集相当复杂,因此正确地找出大型可执行二进制文件内部的函数边界是一项困难的任务。即使是专门从事此工作的IDA,在某些情况下也存在很多错误和遗漏。

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



Linear Sweep就是简单地反汇编一条指令。拆卸指令序列的直接方法是-在最后一条指令结束的地方立即开始下一条指令的拆卸。

递归拆卸试图在拆卸时考虑代码流,并可能持有一堆“函数条目”(例如,每次调用都将获得该函数在该队列中的目标地址)。在分析所有遇到的功能之前,队列会一直被清空,直到它们被清除。

尽管线性扫描被认为更易于实现和递归分解以产生更好的结果,但是它们都有各自的优缺点。 >
大多数调试器不会将太多精力放在反汇编任务上,因为通常,指令指针寄存器将指向正确的反汇编函数,并且很少需要反汇编大型二进制Blob和识别函数。此外,由于大多数静态分析工具IDA更加关注“整体情况”的曝光,因此调试器往往一次仅对一小部分可执行文件发光。

PS

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

评论


嗯,我明白了,所以您认为主要原因是因为功能分析是一件复杂的事情吗?您为什么认为olleh在几年前做得如此出色,而如今人们却无法复制?

–避免
17年12月7日在22:05

当我使用x64dbg时,我发现它的分析功能令人满意。如果您不这样做,那么没有什么可以轻松改善它们的。抱歉。

– NirIzr
17年12月8日在0:34

谢谢:)请让我知道是否还有其他方法可以使您进一步了解该主题。

– NirIzr
17年12月8日在1:46

@underthevoid首选项,例如速度或工作流。对我来说,我正在调试一个50MB的二进制文件,其idb生成为〜600 MB。一旦我开始调试,IDA就会重新格式化整个二进制文件,这对我来说将花费很多时间。

– sudhackar
17年12月9日在7:20

@underthevoid IDA的调试器非常差。这甚至是Ilfak的看法,因为它主要是为了“满足需求”而违背Ilfak的意愿而做的。拆装器和调试器是完全不同的工具,可能会用于略有不同的任务,尽管个人偏爱它。

– NirIzr
17年12月10日在6:12