6.控制流还原:新方法

通用方案的难题?

人类很难阅读并理解完全由jmp/goto跳转组合成的CFG结构图,因此还原出高层的控制流结构,能够极大的提升反编译结果的可读性。

按照通用的还原方法标准,反编译工具希望还原后剩余的goto语句越少越好;

但是由于通用结构化分析技术对不可规约图的分析,存在不和处理的问题。程序分析的研究者们提出了更多的分析思路。

新方法

可以移步到补充章节,在那里我讨论了和控制流还原相关的两篇很有意思的论文:

  • “Dream: no-more-goto”:这篇论文提出了一种no-more-goto算法,从理论上证明了任何的CFG都能还原出不带goto的高层次控制流结构。

  • “Sailr:no-need no-more-goto”:这个更有牛逼,驳斥了上面的no-more-goto算法,认为判断控制流还原算法应该和编译前的源码对比,并给出了更为先进的控制流还原理论。

goto-less方案:

“Dream: no-more-goto”方案提出一种“到达状态”的转换方案,从理论上证明了任何的CFG图都能转换为不带有goto的结构化图。(参考补充章节中的no-more-goto论文)

精确的还原方案:

但是随着goto-less的算法分析,以及对于编译器的优化方案的研究,也有研究者提出:goto语句的数量和控制流还原的效果没有关系,控制流还原效果应该和编译前的源码相似度进行对比!

我觉得他说的很对,控制流还原的目标是提升可读性,更别说有些编译器优化是无法完美还原;

因此尽可能的还原出接近源码的反编译结果,因为源码的可读性是最佳的。

精进:对于控制流还原的进一步研究

Last updated