大模型可以反编译二进制代码了?

前言

今天在推上看到的一篇让我觉得震撼的论文,使用大型语言模型反编译二进制代码[1],并提供了源代码[2]

简单说就是大模型可以逆向工程了,可以把二进制文件翻译成源码,并且反编译的源码可以再编译并成功运行。

让我们看一个网上的评价:

大模型可以反编译二进制代码了?

推上的评价

用 LLM 反编译 binary code。程序员的恶梦,终于还是来了。前几个月还在逼逼 LLM 的可解释性,现在自己的 code 就要被全解释了。对于 LLM 来说,又多了一大块数据源,大跃进继续。

大模型可以反编译二进制代码了?

论文截图
  • • 标题:《LLM4Decompile: Decompiling Binary Code with Large Language Models[3]

  • • 作者:Hanzhuo Tan, Qi Luo, Jing Li, Yuqun Zhang,来自南方科技大学和香港理工大学。

  • • 代码:https://github.com/albertan017/LLM4Decompile

  • • 论文的主要内容是关于使用大型语言模型(LLMs)来进行二进制代码的反编译工作,这是一个将编译后的机器代码或字节码转换回高级编程语言的过程。

下面是该论文的摘要,有兴趣的可以去看全文或者研究源代码。

摘要

反编译的目标是将编译后的代码恢复到人类可读的源代码形式,但在变量名和结构等细节上面临挑战。大型语言模型(LLMs)在编程任务中展现出潜力,激发了将其应用于反编译的动机。然而,目前不存在任何开源的LLM用于反编译。现有的反编译评估系统主要考虑的是令牌级别的准确性,而忽略了代码的可执行性,这是任何程序最重要的特性。因此,作者发布了第一个开放访问的反编译LLM,范围从1B到33B,预训练在40亿个C源代码和相应的汇编代码令牌上。这些开源LLM可以作为该领域进一步开发的基线。为了确保实用的程序评估,作者引入了Decompile-Eval,这是第一个考虑反编译的可重新编译性和可执行性的评估数据集。实验表明,LLM4Decompile能够准确反编译21%的汇编代码,比GPT-4提高了50%。代码、数据集和模型已在GitHub上发布。

主要贡献:

  • • 首个开源反编译LLM: 本文发布了首个开源的、专门用于反编译的大型语言模型 (LLM) LLM4Decompile。该模型预训练了40亿个C语言源代码和对应汇编代码的token,模型参数规模从10亿到330亿不等。LLM4Decompile的开源将促进反编译领域进一步发展。

  • • 首个可重编译和可重执行的反编译评估数据集: 为了更准确地评估反编译模型的性能,本文构建了首个考虑代码可重编译性和可重执行性的反编译评估数据集 Decompile-Eval。该数据集基于 HumanEval 问题和测试样本,强调从程序语义的角度评估反编译模型的重要性。

研究背景:

反编译旨在将编译后的代码恢复为人类可读的源代码,但现有的反编译工具在还原细节信息(如变量名和结构)方面存在困难。大型语言模型 (LLM) 在编程任务上展现出巨大潜力,因此研究者们开始尝试将其应用于反编译。然而,目前还没有开源的专门用于反编译的LLM,现有的反编译评估系统也主要关注token级别的准确性,而忽略了代码可执行性这一重要指标。

研究方法:

  • • 数据预训练: 作者从 AnghaBench 收集了100万个C代码样本,使用不同配置的GCC编译器将其编译成汇编代码,构建了包含40亿个token的汇编代码-源代码对数据集。

  • • 模型微调: 使用该数据集对 DeepSeek-Coder 模型进行微调,训练了不同参数规模的LLM4Decompile模型。

  • • 评估基准: 基于 HumanEval 构建了 Decompile-Eval 评估基准,从代码可重编译性和可重执行性两个角度评估反编译模型的性能。

实验结果:

在 Decompile-Eval 数据集上,LLM4Decompile 模型展现出 promising 的反编译能力:

  • • 约90% 的反编译代码可以被GCC编译器成功重编译,表明模型能够很好地理解代码结构和语法。

  • • 60亿参数版本的 LLM4Decompile 模型有21% 的反编译代码能够成功执行并通过所有测试用例,表明模型能够较好地捕捉程序语义。

结论:

LLM4Decompile 是首个开源的、专门用于反编译的LLM,Decompile-Eval 是首个关注代码可重编译性和可重执行性的反编译评估基准。这项工作为利用新技术改进反编译奠定了基础,并鼓励该领域未来进行更深入的研究。

局限性:

  • • 本研究目前只针对C语言和x86平台。

  • • 仅限于单个函数的反编译,未考虑交叉引用和外部类型定义等因素。

未来方向:

  • • 将研究扩展到其他编程语言和平台。

  • • 研究更复杂的反编译场景,例如包含交叉引用和外部类型定义的代码。

P.S.

这篇论文是借助沉浸式翻译看完的,同时尝试使用月之暗面、 Claude Sonnet 和 Google Gemmi Pro 1.5来生成摘要, Claude 免费版不理想,回答过于简单。

大模型可以反编译二进制代码了?

沉浸式翻译截图

引用链接

[1] 使用大型语言模型反编译二进制代码: https://arxiv.org/abs/2403.05286v1
[2] 源代码: https://github.com/albertan017/LLM4Decompile
[3] LLM4Decompile: Decompiling Binary Code with Large Language Models: https://arxiv.org/abs/2403.05286v1


原文始发于微信公众号(alitrack):大模型可以反编译二进制代码了?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/254734.html

(0)
Java朝阳的头像Java朝阳

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!