LLM4Decompile

LLM4Decompile

大型语言模型驱动的二进制代码反编译技术

LLM4Decompile是一款创新的开源大型语言模型,专注于二进制代码反编译。该模型能将Linux x86_64二进制文件转换为可读的C源代码,覆盖GCC的O0至O3优化级别。项目提供多个参数规模的模型版本,从1.3B到33B不等。其中,最新的22B-V2版本在HumanEval-Decompile基准测试中实现了63.6%的重新执行率。LLM4Decompile不仅可直接反编译二进制文件,还能优化Ghidra等工具生成的伪代码,为二进制分析和逆向工程领域提供了新的可能性。

LLM4Decompile反编译大语言模型二进制代码源代码Github开源项目

LLM4反编译

<p align="left"> 📊&nbsp;<a href="#evaluation">结果</a> | 🤗&nbsp;<a href="#models">模型</a> | 🚀&nbsp;<a href="#quick-start">快速开始</a> | 📚&nbsp;<a href="#humaneval-decompile">HumanEval-反编译</a> | 📎&nbsp;<a href="#citation">引用</a> | 📝&nbsp;<a href="https://arxiv.org/abs/2403.05286">论文</a> </p>

逆向工程:使用大型语言模型反编译二进制代码

更新

关于

  • LLM4Decompile是首个专注于反编译的开源大型语言模型。当前版本支持将Linux x86_64二进制文件(从GCC的O0到O3优化级别)反编译为人类可读的C源代码。我们团队致力于扩展该工具的功能,正在努力纳入更广泛的架构和配置。
  • LLM4Decompile-End专注于直接反编译二进制文件。LLM4Decompile-Ref优化Ghidra反编译的伪代码。

评估

框架

<p align="center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/037d9dd2-c4a0-4bdb-adf0-fff92be206a3.png" alt="image" width="400" height="auto"> </p>

在编译过程中,预处理器处理源代码(SRC)以消除注释并展开宏或包含文件。处理后的代码传递给编译器,将其转换为汇编代码(ASM)。汇编器将ASM转换为二进制代码(0和1)。链接器通过链接函数调用完成过程,创建可执行文件。反之,反编译涉及将二进制代码转回源文件。大型语言模型(LLMs)经过文本训练,无法直接处理二进制数据。因此,必须先使用Objdump将二进制文件反汇编为汇编语言(ASM)。需要注意的是,二进制和反汇编的ASM是等效的,它们可以相互转换,因此我们交替使用这两个术语。最后,通过计算反编译代码与源代码之间的损失来指导训练。为评估反编译代码(SRC')的质量,通过测试断言(可重执行性)测试其功能。

指标

  • 可重执行性评估反编译代码是否能正确执行并通过所有预定义的测试用例。

基准测试

  • HumanEval-Decompile 一组164个仅依赖标准C库的C函数集合。
  • ExeBench真实项目中抽取的2,621个函数集合,每个函数都使用用户定义的函数、结构和宏。

结果

<p align="center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/5cb838ab-8eb4-4e9a-804e-5178b7b6deee.png" alt="results" width="800" height="auto"> </p>

模型

我们的LLM4Decompile包括参数规模在13亿到330亿之间的模型,这些模型已在Hugging Face上发布。

模型检查点大小可重执行性备注
llm4decompile-1.3b🤗 HF链接1.3B10.6%-
llm4decompile-6.7b🤗 HF链接6.7B21.4%-
llm4decompile-33b🤗 HF链接33B21.5%-
llm4decompile-6.7b-nsp🤗 HF链接6.7B20.9%备注1
llm4decompile-6.7b-uo🤗 HF链接6.7B21.9%备注2
llm4decompile-1.3b-v1.5🤗 HF链接1.3B27.3%备注3
llm4decompile-6.7b-v1.5🤗 HF链接6.7B45.4%备注3
llm4decompile-1.3b-v2🤗 HF链接1.3B46.0%备注4
llm4decompile-6.7b-v2🤗 HF链接6.7B52.7%备注4
llm4decompile-22b-v2🤗 HF链接22B63.6%备注4

备注1:NSP模型使用汇编代码进行训练,平均可重执行性约为0.17。

备注2:统一优化(UO)模型在没有优化级别(O0~O3)先验知识的情况下进行训练,平均可重执行性约为0.21。UO模型的预处理稍有不同(没有On的先验知识),请查看模型页面

备注3:V1.5系列使用更大的数据集(150亿个令牌)和4,096的最大令牌大小进行训练,与之前的模型相比性能显著提升(超过100%的改进)。

备注4:V2系列基于Ghidra构建,并在20亿个令牌上训练,以优化Ghidra生成的伪代码。详情请查看ghidra文件夹

快速开始

设置: 请使用以下脚本安装必要的环境。

git clone https://github.com/albertan017/LLM4Decompile.git
cd LLM4Decompile
conda create -n 'llm4decompile' python=3.9 -y
conda activate llm4decompile
pip install -r requirements.txt

以下是使用我们模型的示例(针对V1.5版本修订。对于之前的模型,请查看HF上相应的模型页面)。 注意:将func0替换为您想要反编译的函数名。

预处理: 将C代码编译为二进制文件,然后将二进制文件反汇编为汇编指令。

import subprocess import os OPT = ["O0", "O1", "O2", "O3"] fileName = 'samples/sample' #'文件路径' for opt_state in OPT: output_file = fileName + '_' + opt_state input_file = fileName + '.c' compile_command = f'gcc -o {output_file}.o {input_file} -{opt_state} -lm' #在Linux上使用GCC编译代码 subprocess.run(compile_command, shell=True, check=True) compile_command = f'objdump -d {output_file}.o > {output_file}.s' #将二进制文件反汇编成汇编指令 subprocess.run(compile_command, shell=True, check=True) input_asm = '' with open(output_file+'.s') as f: #汇编文件 asm = f.read() if '<'+'func0'+'>:' not in asm: #重要:将func0替换为函数名 raise ValueError("编译失败") asm = '<'+'func0'+'>:' + asm.split('<'+'func0'+'>:')[-1].split('\n\n')[0] #重要:将func0替换为函数名 asm_clean = "" asm_sp = asm.split("\n") for tmp in asm_sp: if len(tmp.split("\t"))<3 and '00' in tmp: continue idx = min( len(tmp.split("\t")) - 1, 2 ) tmp_asm = "\t".join(tmp.split("\t")[idx:]) #移除二进制代码 tmp_asm = tmp_asm.split("#")[0].strip() #移除注释 asm_clean += tmp_asm + "\n" input_asm = asm_clean.strip() before = f"# 这是汇编代码:\n" #提示 after = "\n# 源代码是什么?\n" #提示 input_asm_prompt = before+input_asm.strip()+after with open(fileName +'_' + opt_state +'.asm','w',encoding='utf-8') as f: f.write(input_asm_prompt) 汇编指令应该采用以下格式: <函数名>:\n操作\n操作\n 典型的汇编指令可能如下所示:

<func0>: endbr64 lea (%rdi,%rsi,1),%eax retq


**反编译:** 使用LLM4Decompile将汇编指令翻译成C语言:
```python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model_path = 'LLM4Binary/llm4decompile-6.7b-v1.5' # V1.5模型
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path,torch_dtype=torch.bfloat16).cuda()

with open(fileName +'_' + OPT[0] +'.asm','r') as f: #优化级别O0
    asm_func = f.read()
inputs = tokenizer(asm_func, return_tensors="pt").to(model.device)
with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=2048) ### 最大长度为4096,新生成的token数应在范围内
c_func_decompile = tokenizer.decode(outputs[0][len(inputs[0]):-1])

with open(fileName +'.c','r') as f: #原始文件
    func = f.read()

print(f'原始函数:\n{func}') # 注意我们只反编译一个函数,而原始文件可能包含多个函数
print(f'反编译后的函数:\n{c_func_decompile}')

HumanEval-Decompile

数据存储在 llm4decompile/decompile-eval/decompile-eval-executable-gcc-obj.json 中,使用JSON列表格式。共有164*4(O0、O1、O2、O3)个样本,每个样本有五个键:

  • task_id:表示问题的ID。
  • type:优化阶段,是[O0、O1、O2、O3]之一。
  • c_func:HumanEval问题的C语言解决方案。
  • c_test:C语言测试断言。
  • input_asm_prompt:带有提示的汇编指令,可以按照我们的预处理示例中的方式得出。

请查看评估脚本

进行中

  • 带有清理流程的更大训练数据集。(完成:2024.05.13)
  • 支持流行的语言/平台和设置。
  • 支持可执行二进制文件。(完成:2024.05.13)
  • 与反编译工具(如Ghidra、Rizin)集成。

许可证

此代码库在MIT和DeepSeek许可证下发布。

引用

@misc{tan2024llm4decompile,
      title={LLM4Decompile: Decompiling Binary Code with Large Language Models}, 
      author={Hanzhuo Tan and Qi Luo and Jing Li and Yuqun Zhang},
      year={2024},
      eprint={2403.05286},
      archivePrefix={arXiv},
      primaryClass={cs.PL}
}

Star历史

Star历史图表

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多