[论文解读] Towards Neural Decompilation
本文提出一种基于神经机器翻译(NMT)的自动反编译方法,通过编译器的正向翻译(将低级代码(LLVM IR 或 x86 汇编)转换为人类可读的 C 代码)来训练反编译器。该方法在 LLVM 和 x86 基准测试中分别实现了 97% 和 88% 的成功率,显著优于以往基于规则的系统,其优势在于利用学习到的模式而非手工编写的规则。
We address the problem of automatic decompilation, converting a program in low-level representation back to a higher-level human-readable programming language. The problem of decompilation is extremely important for security researchers. Finding vulnerabilities and understanding how malware operates is much easier when done over source code. The importance of decompilation has motivated the construction of hand-crafted rule-based decompilers. Such decompilers have been designed by experts to detect specific control-flow structures and idioms in low-level code and lift them to source level. The cost of supporting additional languages or new language features in these models is very high. We present a novel approach to decompilation based on neural machine translation. The main idea is to automatically learn a decompiler from a given compiler. Given a compiler from a source language S to a target language T , our approach automatically trains a decompiler that can translate (decompile) T back to S . We used our framework to decompile both LLVM IR and x86 assembly to C code with high success rates. Using our LLVM and x86 instantiations, we were able to successfully decompile over 97% and 88% of our benchmarks respectively.
研究动机与目标
- 解决传统基于规则的反编译器成本高昂且缺乏灵活性的问题,后者在支持每种新语言或新特性时都需要专家干预。
- 实现从任意现有编译器自动生成反编译器,从而减少反编译器开发中的手动工作量。
- 通过生成语义等价且人类可读的 C 代码,提升反编译代码质量,避免过度使用 goto 语句或低级语言结构。
- 克服以往神经反编译方法因缺乏领域特定知识而导致无法编译或语义不匹配的局限性。
提出的方法
- 该框架采用两阶段方法:首先生成一个保留控制流和语法结构但不包含变量或常量赋值的结构化代码模板。
- 在第二阶段,使用在编译器生成的源代码到汇编代码配对数据上训练的神经序列到序列模型,将实际值填入模板中。
- 该方法利用编译器的正向翻译隐式学习逆映射,从而在无需直接反编译监督的情况下实现反编译器的端到端训练。
- 通过使用编译器优化过的、语义等价的代码对,将领域特定知识融入模型,以提升泛化能力和正确性。
- 模型采用带有注意力机制的序列到序列神经网络,类似于神经机器翻译,但针对编程语言的语法和语义进行了适配。
- 训练数据来源于编译器输出,确保训练集与测试集之间无重叠;基准测试包含最多 668 个输入标记的复杂多语句程序。
实验结果
研究问题
- RQ1神经机器翻译模型能否被有效适配,以高精度将低级代码反编译为高级源代码?
- RQ2能否从编译器的正向翻译中自动学习反编译器,从而消除对手工规则的依赖?
- RQ3将来自编译器优化代码的领域知识融入模型,是否能提升反编译输出的质量和可编译正确性?
- RQ4与传统基于规则的反编译器相比,神经反编译器在复杂真实代码片段上的性能如何?
- RQ5该框架能否使用相同的训练范式,跨不同低级表示(如 LLVM IR 和 x86 汇编)实现良好泛化?
主要发现
- 该框架成功将 97% 的 LLVM IR 基准测试反编译为语义等价的 C 代码,证明了其在多样化测试用例上的高精度。
- 对于 x86 汇编,反编译器实现了 88% 的成功率,显著优于以往的神经方法,后者在编译和正确性方面表现不佳。
- 该模型生成的反编译代码不包含 goto 语句,且使用了高级语言结构,使其比传统反编译器更易读且更易重新编译。
- 该方法通过从编译器生成的配对数据中学习,消除了对专家规则工程的需求,从而能够快速适应新语言或新目标架构。
- 该框架通过整合领域特定知识并严格分离训练与测试数据,避免了数据泄露,从而在性能上超越了以往的神经反编译方法。
- 该方法成功处理了最多包含 668 个输入标记和 177 个输出标记的复杂程序,远超早期工作的单条语句限制。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。