Skip to main content
QUICK REVIEW

[论文解读] Augmenting Decompiler Output with Learned Variable Names and Types

Qibin Chen, Jeremy Lacomis|arXiv (Cornell University)|Aug 13, 2021
Software Engineering Research参考文献 57被引用 11
一句话总结

该论文提出 DIRTY,一种深度学习方法,通过利用对人类编写的 C 代码的统计建模,自动预测有意义的变量名和类型,从而提升反汇编器的输出质量。在大规模 GitHub 数据集上进行训练后,DIRTY 在恢复原始变量名方面达到 66.4% 的准确率,在恢复原始类型方面达到 75.8%,显著优于先前的方法,其优势源于对代码结构和命名惯例中上下文模式的利用。

ABSTRACT

A common tool used by security professionals for reverse-engineering binaries found in the wild is the decompiler. A decompiler attempts to reverse compilation, transforming a binary to a higher-level language such as C. High-level languages ease reasoning about programs by providing useful abstractions such as loops, typed variables, and comments, but these abstractions are lost during compilation. Decompilers are able to deterministically reconstruct structural properties of code, but comments, variable names, and custom variable types are technically impossible to recover. In this paper we present DIRTY (DecompIled variable ReTYper), a novel technique for improving the quality of decompiler output that automatically generates meaningful variable names and types. Empirical evaluation on a novel dataset of C code mined from GitHub shows that DIRTY outperforms prior work approaches by a sizable margin, recovering the original names written by developers 66.4% of the time and the original types 75.8% of the time.

研究动机与目标

  • 为解决反汇编器输出中缺乏有意义的变量名和类型的问题,这些问题会阻碍逆向工程和程序理解。
  • 通过建模人类编写的 C 代码中的模式,恢复丢失的高层抽象——特别是变量名和类型。
  • 通过生成语义上合理的标识符和类型注解,提升反汇编二进制代码的可读性和可理解性。
  • 克服确定性反汇编的局限性,后者由于编译过程中的信息丢失,无法恢复原始名称或自定义类型。
  • 在来自 GitHub 的真实世界 C 程序的新颖且大规模的数据集上,评估所学命名和类型推断方法的有效性。

提出的方法

  • DIRTY 使用基于 Transformer 的序列到序列模型,基于从 GitHub 提取的大规模 C 代码数据集进行训练,从反汇编函数文本中预测变量名和类型。
  • 该模型利用周围代码结构中的上下文信息,包括变量使用模式、函数签名和数据布局,以推断可能的名称和类型。
  • 在类型预测方面,DIRTY 考虑了内存布局约束,并采用 BPE(字节对编码)分词策略来处理未登录类型,尽管初步实验表明这会降低准确率并增加推理时间。
  • 该方法通过学习真实代码中重复出现且上下文一致的命名和类型惯例来建模命名与类型模式,从而实现对未见过但结构相似变量的泛化能力。
  • 该模型在反汇编函数文本上进行微调,其中输入为反汇编生成的类 C 代码,输出为每个变量的预测名称和类型。
  • 为处理罕见或未见过的类型,该方法探索了基于 BPE 的复杂类型分解方法,但指出这在覆盖范围与性能之间存在权衡。

实验结果

研究问题

  • RQ1当没有源代码可用时,学习模型能否有效从反汇编 C 代码中恢复原始变量名?
  • RQ2深度学习模型在多大程度上能基于代码上下文和内存布局推断出正确的变量类型?
  • RQ3DIRTY 在变量名和类型恢复方面与先前最先进方法相比表现如何?
  • RQ4基于 BPE 的分词策略对反汇编代码中未见过或复杂类型的预测有何影响?
  • RQ5当反汇编目标为 C 语言时,DIRTY 是否能泛化到非 C 程序?其对 C++ 类等高级语言结构的处理能力如何?

主要发现

  • 在反汇编函数的保留测试集上,DIRTY 以 66.4% 的准确率恢复了开发人员使用的原始变量名。
  • 该模型在恢复原始变量类型方面达到 75.8% 的准确率,显著优于先前方法。
  • 实证评估表明,DIRTY 在多种代码库中表现稳健,对未见过的函数和变量模式具有较强的泛化能力。
  • 使用 BPE 进行类型分解虽提升了对罕见类型的覆盖范围,但降低了整体预测准确率并增加了推理时间,表明设计中存在权衡。
  • DIRTY 在 C++ 相关类型(如 std::string)上表现出色,表明其在反汇编为 C 时对高级语言构造具有部分支持能力。
  • 该模型的有效性受限于输入长度约束,但仅有 8.8% 的函数超过 512 个标记的限制,表明实际数据损失极小。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。