LLM4Decompile——专门用于反编译的大规模语言模型

概述

论文地址:https://arxiv.org/abs/2403.05286

反编译是一种将已编译的机器语言或字节码转换回原始高级编程语言的技术。该技术用于分析软件的内部工作原理,尤其是在没有源代码的情况下;Ghidra 和 IDA Pro 等专用工具已经开发出来,但这些工具很难生成人类可读格式的代码。反编译的最大挑战是完全再现代码的基本结构,如变量名、循环和条件语句,这些在编译过程中往往会丢失。

为解决这一问题,大规模语言模型(LLM)的最新进展备受瞩目。这些模型将编程语言视为一种语言系统,并使用预先训练好的模型来处理各种编码任务。与传统方法相比,这种方法取得了显著的进步,并表明在反编译领域也可以采用类似的方法。

然而,到目前为止,很少有标准基准或公开可用的数据集来评估和比较反编译技术。研究人员使用不同的数据集,因此很难对结果进行直接比较。因此,在本文中,我们开发了一个专门用于反编译的开源大规模语言模型,并建立了第一个侧重于可重编译性和可重执行性的反编译基准。这有望统一反编译领域的评估标准,促进进一步的研究。下图显示了本文的反编译评估步骤。

什么是 LLM4Decompile?

LLM4Decompile 是一项致力于反编译程序的开创性举措。首先,在构建预训练数据时,它以一百万个名为 Anghabench 的公开可编译 C 文件为基础。利用这一丰富的数据集创建汇编代码和源代码对。具体来说,首先将源代码转换为二进制对象文件,然后将其反汇编为汇编代码,并与 x86 Linux 平台上的源代码配对。它还考虑了程序员为优化执行性能而使用的各种编译器优化标志。优化过程是一种将源代码转换为更快、更高效的机器代码的技术。优化级别在不同阶段对源代码进行编译,从默认的 O0(无优化)到 O3(积极优化)。在整个过程中,都会使用独特的提示来让模型了解优化阶段。

这是具有 [优化状态] 优化功能的汇编代码:[汇编代码]。源代码是什么?

通过这种方式,LLM4Decompile 可以更深入地了解编程世界,并为更精确的反编译奠定基础。

接下来,LLM4Decompile 模型设置使用与 LDeepSeek-Coder 相同的架构,并使用相应的 DeepSeek-Coder 检查点初始化模型。学习目标分为两类

第一个目标是下一个标记预测(NTP)。它根据给定的输入预测下一个标记。这种方法在许多大规模语言模型的预训练中发挥着核心作用,其目的是最大限度地降低真实标记的负对数概率。这一过程包括改进模型参数,以便根据输入序列做出更准确的预测。

第二个目标是序列到序列(S2S)。它预测输入序列的预期输出。这是一种专门用于神经机器翻译模型的方法,其重点是尽量减少 C 代码中标记的负对数概率。以此为目标,只计算输出序列的损失,从而实现更准确的翻译。

这两种学习目标的主要区别在于输入序列和汇编代码如何影响学习损失的计算:在 NTP 中,所有输入都被考虑在内,而在 S2S 中,只强调输出序列。本文进行了各种消融研究,以确定这些目标如何影响反编译的准确性。

实验结果

下表总结了有趣的研究结果。最初,即使是基本版本的 DeepSeek-Coder 也很难反编译二进制文件,在某些情况下可以编译,但在其他情况下却无法准确捕捉原始程序的含义。不过,经过微调后,LLM4Decompile 模型在反编译二进制文件的能力上有了显著提高。事实上,90% 的代码都可以编译,这表明我们对代码的结构和语法有了更深入的理解。

值得注意的是,6B 版本的 LLM4Decompile 在执行代码的能力方面比 1B 版本有明显优势:6B 版本反编译出的代码中有 21% 准确地抓住了程序的本质并通过了所有测试用例。而 1B 版本只有 10%。这一改进凸显了扩大模型规模对捕捉程序含义的益处。另一方面,将模型规模增大到 33B 也会导致可再运行性的小幅改善,改善幅度不到一个百分点。这可能说明了调整到 33B 模型的难度。

下表总结了 AnghaBench 中的结果,显示 LLM4Decompile 取得了特别高的 BLEU 和 ES 分数;6B 模型的 BLEU 分数为 0.82,与源代码非常接近。这一令人印象深刻的表现表明,测试集中可能存在严重的数据泄漏。实际上,带有规范化变量的反编译代码不可能达到如此高的 N-gram/ES 分数。这一反常现象,以及之前研究中报告的高 BLEU 和 ES 分数,凸显了建立独立可靠的反编译评估基准的重要性。

序列到序列(S2S)预测方法也因其特点而显示出领先于其他学习方法的性能。其中的奥秘可以说在于汇编代码被排除在损失函数的计算之外,从而使模型能够专注于源代码的生成。这种集中可以让模型更好地理解反编译代码背后的模式和结构。

但是,在训练过程中加入汇编代码会使性能降低约 4 个百分点,这在下一个标记预测 (NTP)任务中尤为明显(下表)。汇编代码固有的复杂性和低级特性使模型难以学习有意义的模式;S2S 方法避免了这种复杂性,使模型能够专注于高级源代码模式。

还有另一种策略,即在涉及汇编和 C 代码的初始训练之后,尝试以翻译任务为重点进行微调(NTP+S2S),但这种方法不如 S2S 方法有效。这项消融研究强调了 LLM4Decompile 在反编译过程中的演变过程,以及某些方法更胜一筹的原因。

总结

本文提供了首个开源的、以反编译为重点的大规模语言模型和标准化的可重编译性/可重执行性基准。对这组不同的 C 代码编译数据集的分析表明,LLM4Decompile-6B 的可重编译性和可重执行性分别达到了 87% 和 21%,前者表明了语法理解,后者表明了语义保护。作为对数据驱动反编译的初步探索,本文建立了一个开放的基准,以激励未来的努力。已发布的数据集、模型和分析都体现了通过新技术提高反编译能力的巨大潜力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/781763.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

灵活视图变换器:为扩散模型设计的革新图像生成架构

在自然界中,图像的分辨率是无限的,而现有的图像生成模型在跨任意分辨率泛化方面存在困难。虽然扩散变换器(DiT)在特定分辨率范围内表现出色,但在处理不同分辨率的图像时却力不从心。为了克服这一限制,来自上…

java 栅栏(CyclicBarrier)

Java中的栅栏(CyclicBarrier)是一种用于协调多个线程并发工作的同步辅助类。与CountDownLatch不同,CyclicBarrier允许一组线程相互等待,直到所有线程都到达一个共同的屏障点(barrier)后,才继续执…

【qt】TCP 服务端怎么收到信息?

上一节,我已经讲了,TCP的监听,是基于上一节的,不知道的可以看看. 当我们的TCP 服务器 有 客户端请求连接的时候,会发出一个信号newConnection(). 在TCP服务端与客户端的通信中,我们需要使用到套接字 QTcpSocket类. 套接字相当于是网络通信的接口,服务段和客户端都要通过它进行通…

聚焦大模型应用落地,2024全球数字经济大会人工智能专题论坛在京举办

7月1日下午,2024全球数字经济大会人工智能专题论坛在中关村国家自主创新示范区会议中心举办。论坛紧扣大模型应用落地这一热点,以“应用即未来——大模型赋能千行百业,新生态拥抱产业未来”为主题,备受社会各界关注。 一、北京已…

STM32点灯闪烁

stm32c8t6引脚图 开发板引脚图 GPIO端口的每个位可以由软件分别配置成 多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 配置GPIO端口步骤:开启时钟->使用结构体设置输出模式…

LabVIEW从测试曲线中提取特征值

在LabVIEW中开发用于从测试曲线中提取特征值的功能时,可以考虑以下几点: 数据采集与处理: 确保你能够有效地采集和处理测试曲线数据。这可能涉及使用DAQ模块或其他数据采集设备来获取曲线数据,并在LabVIEW中进行处理和分析。 特…

吉时利KEITHLEY KI-488驱动和说明

吉时利KEITHLEY KI-488驱动和说明

D1.排序

1.快速排序 双指针 采用分治的思想,基于一个数作为标准,进行分治 步骤: 确定分界点的值。x q[l]、q[(lr)/2]、q[r]、随机 都可以;划分区间:使得小于等于x的数放在数组的左边;大于等于x的数放在数组的右边…

系统级别的原生弹窗窗口

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生的弹出窗口dialog</title><style>…

C语言指针函数指针

跟着这篇文章重新理解了一下&#xff1a;彻底攻克C语言指针 有一个例子感觉可以拿出来看看&#xff1a; char *(*c[10])(int **p); * 这段声明定义了一个长度为10的数组c&#xff0c;数组中的每个元素都是指向函数的指针。每个函数接受一个类型为int **&#xff08;指向指向…

Gitlab Fork Workflow(协作工作流)

Gitlab Fork WorkFlow&#xff08;协作工作流&#xff09; Fork WorkFlow用于团队间的协作开发。在开发过程中&#xff0c;我们都需要将最新修改的代码合并到代码库上&#xff0c;在代码合并之前&#xff0c;为了保证代码符合上传要求&#xff08;符合需求、代码规范等&#xf…

2024/7/7周报

文章目录 摘要Abstract文献阅读题目问题本文贡献问题描述图神经网络Framework实验数据集实验结果 深度学习MAGNN模型相关代码GNN为什么要用GNN&#xff1f;GNN面临挑战 总结 摘要 本周阅读了一篇用于多变量时间序列预测的多尺度自适应图神经网络的文章&#xff0c;多变量时间序…

ASP.NET Core----基础学习03----开发者异常页面 MVC工作原理及实现

文章目录 1. 开发者异常页面(1)Startup.cs 页面的基础配置(2)自定义显示报错代码的前后XX行 2. MVC 的原理3. MVC 的实现4.默认路由路径5.返回Json字符串 1. 开发者异常页面 (1)Startup.cs 页面的基础配置 namespace ASP.Net_Blank {public class Startup{private readonly IC…

Linux muduo 网络库

主要记录示意图和知识点框架&#xff1a; 1、阻塞、非阻塞、同步、异步 在处理IO的时候&#xff0c;阻塞和非阻塞都是同步IO&#xff0c;只有使用了特殊的API才是异步IO。 2、五种IO模型&#xff1a; 阻塞、非阻塞、IO复用、信号驱动、异步IO 3、muduo网络库 muduo网络库给用…

【python】python当当数据分析可视化聚类支持向量机预测(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

windows 服务器安装svn服务端、迁移svn

svn服务器版本 因为要把旧svn迁移到新的svn&#xff0c;为了保证迁移后的稳定性&#xff0c;安装包使用的旧服务器的svn服务器版本 VisualSVN-Server-3.6.1-x64.msi 安装 配置仓库路径等 其他没截图的就默认配置下一步即可。安装完成先不要启动 迁移 旧的svn服务器直接把…

Windows远程桌面实现之十五:投射浏览器摄像头到xdisp_virt以及再次模拟摄像头(一)

by fanxiushu 2024-07-01 转载或引用请注明原始作者。 本文还是围绕xdisp_virt这个软件展开&#xff0c; 再次模拟成摄像头这个比较好理解&#xff0c;早在很久前&#xff0c;其实xdisp_virt项目中就有摄像头功能&#xff0c; 只是当时是分开的&#xff0c;使用起来…

【SpringBoot】IDEA查看spring bean的依赖关系

前因&#xff1a;在研究springcloud config组件时&#xff0c;我发现config-server包下的EnvironmentController不在扫描的包路径下却可以响应客户端的请求&#xff0c;这吸引了我的注意&#xff0c;我的问题是&#xff1a;EnvironmentController是怎么被添加进bean工厂的。本章…

Golang | Leetcode Golang题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; type pair struct{ right, height int } type hp []pairfunc (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { return h[i].height > h[j].height } func (h hp) Swap(i, j int) { h[i], h[j]…

26_嵌入式系统网络接口

以太网接口基本原理 IEEE802标准 局域网标准协议工作在物理层和数据链路层&#xff0c;其将数据链路层又划分为两层&#xff0c;从下到上分别为介质访问控制子层(不同的MAC子层&#xff0c;与具体接入的传输介质相关),逻辑链路控制子层(统一的LLC子层&#xff0c;为上层提供统…