Project Icon

LLM4Decompile

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

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

LLM4反编译

📊 结果 | 🤗 模型 | 🚀 快速开始 | 📚 HumanEval-反编译 | 📎 引用 | 📝 论文

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

更新

关于

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

评估

框架

image

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

指标

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

基准测试

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

结果

results

模型

我们的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

典型的汇编指令可能如下所示:

: 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历史图表

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号