LLM4Decompile

GitHub
6.5k 467 中等 1 次阅读 今天MIT语言模型
AI 解读 由 AI 自动生成,仅供参考

LLM4Decompile 是一款开创性的开源人工智能工具,致力于利用大语言模型将计算机二进制代码“反编译”还原为人类可读的源代码。在软件逆向工程领域,传统工具生成的代码往往晦涩难懂且变量名混乱,给安全分析和遗留系统维护带来巨大挑战。LLM4Decompile 通过深度学习技术,不仅能直接从二进制文件生成代码,还能对现有反编译结果进行智能优化,显著恢复程序的结构逻辑并赋予变量有意义的名称,从而大幅提升代码的可执行性和可理解性。

该项目提供了多种规模的模型版本,支持从端到端直接反编译到基于 Ghidra 的二次精炼等多种工作流。其独特亮点在于引入了“从骨架到皮肤”的两阶段反编译策略,先恢复代码结构再重命名标识符,并在大规模二进制 - 源码配对数据集上进行了训练,实现了业界领先的代码还原准确率。

LLM4Decompile 非常适合网络安全研究人员、逆向工程师以及需要分析闭源软件或维护老旧系统的开发者使用。无论是进行漏洞挖掘、恶意软件分析,还是尝试理解无文档支持的二进制程序,它都能成为得力的智能助手,帮助用户更高效地揭开二进制代码背后的逻辑真相。

使用场景

某安全团队在分析一个遗留的闭源金融系统时,需要理解其核心加密模块的逻辑以修复严重漏洞,但手头只有编译后的二进制文件。

没有 LLM4Decompile 时

  • 逆向工程师必须依赖传统反编译器(如 Ghidra)生成的伪代码,其中变量名多为 var_1func_2 等无意义符号,阅读极其困难。
  • 为了理清业务逻辑,专家需花费数天时间手动追踪寄存器状态和内存跳转,人工推导变量含义,效率极低且容易出错。
  • 面对经过高度优化的二进制代码,传统工具输出的控制流混乱不堪,难以直接还原为可重新编译的高质量源代码。
  • 团队中初级成员因无法读懂晦涩的汇编逻辑,完全无法参与协助,导致项目进度严重依赖个别资深专家。

使用 LLM4Decompile 后

  • LLM4Decompile 直接利用大模型能力,将二进制文件转换为带有语义化变量名(如 encryptionKeyuserBalance)的可读源码。
  • 借助其“从骨架到皮肤”的两阶段恢复技术,自动重构了清晰的函数结构,将原本数天的手动分析工作缩短至几小时。
  • 生成的代码具备高达 64.9% 的可重执行率,修复后的逻辑可直接编译验证,大幅降低了人工修正代码的成本。
  • 输出结果通俗易懂,使得初级分析师也能快速理解核心算法,团队得以并行协作,加速了漏洞修复进程。

LLM4Decompile 通过将晦涩的二进制码“翻译”为人类可读的高质量源码,彻底打破了逆向工程中的认知壁垒,让黑盒分析变得高效且民主化。

运行环境要求

操作系统
  • Linux
GPU
  • 必需 NVIDIA GPU
  • 训练示例提及 A100 40G
  • 推理代码使用 torch.bfloat16 并调用 .cuda(),建议显存 16GB+ 以运行较大模型(如 9B/22B),较小模型(1.3B/6.7B)可适当降低
内存

未说明

依赖
notes该工具主要面向 Linux x86_64 架构的二进制文件反编译。环境设置推荐使用 conda。核心流程依赖外部工具:需安装 GCC 用于编译 C 代码,以及 objdump (属于 binutils) 用于将二进制反汇编为汇编指令。代码示例显示模型加载使用 bfloat16 精度,因此需要支持该精度的较新 NVIDIA GPU。Docker 部署需启用 GPU 支持 (--gpus all)。
python3.9
torch
transformers
gcc
binutils (objdump)
LLM4Decompile hero image

快速开始

LLM4Decompile

📊 结果 | 🤗 模型 | 🚀 快速入门 | 📚 HumanEval-Decompile | 📎 引用 | 📝 论文 | 🖥️ Colab | ▶️ YouTube

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

GitHub趋势

更新

  • [2025-10-04]: 发布 SK²Decompile:基于 LLM 的两阶段二进制反编译,从骨架到皮肤。第一阶段结构恢复(骨架):将二进制/伪代码转换为混淆的中间表示形式 🤗 HF 链接。第二阶段标识符命名(皮肤):生成带有有意义标识符的人类可读源代码 🤗 HF 链接
  • [2025-05-20]: 发布 decompile-bench,包含用于训练的二百万对二进制-源代码函数对,以及用于评估的七万对函数对。详情请参阅 decompile-bench 文件夹。
  • [2024-10-17]: 发布 decompile-ghidra-100k,这是一个包含十万个训练样本的子集(每个优化级别 2.5 万个)。我们提供了一个 训练脚本,在单块 A100 40G GPU 上运行约 3.5 小时即可完成。该模型实现了 0.26 的可重执行率,总成本低于 20 美元,便于快速复现 LLM4Decompile。
  • [2024-09-26]: 更新了 Colab 笔记本,以演示 LLM4Decompile 模型的使用方法,包括 LLM4Decompile-End 和 LLM4Decompile-Ref 模型的示例。
  • [2024-09-23]: 发布 LLM4Decompile-9B-v2,基于 Yi-Coder-9B 进行微调,在 Decompile 基准测试中达到了 0.6494 的可重执行率。
  • [2024-06-19]: 发布 V2 系列(LLM4Decompile-Ref)。V2(1.3B-22B)以 Ghidra 为基础,使用 20 亿个标记进行训练,以 精炼 Ghidra 反编译出的伪代码。22B-V2 版本比 6.7B-V1.5 提高了额外的 40.1%。详情请查看 ghidra 文件夹
  • [2024-05-13]: 发布 V1.5 系列(LLM4Decompile-End,直接使用 LLM 反编译二进制文件)。V1.5 使用更大的数据集(150 亿个标记)和最大标记长度 4,096 进行训练,与先前模型相比,性能显著提升(超过 100%)。
  • [2024-03-16]: 新增 llm4decompile-6.7b-uo 模型,该模型在不预先了解优化级别(O0~O3)的情况下进行训练,平均可重执行率约为 0.219,是我们所有模型中表现最好的。

关于

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

评估

框架

image

在编译过程中,预处理器会处理源代码(SRC),去除注释并展开宏或包含文件。清理后的代码随后被传递给编译器,将其转换为汇编代码(ASM)。然后,汇编器将这些汇编代码进一步转化为二进制代码(0 和 1)。最后,链接器通过链接函数调用创建可执行文件。而反编译则是将二进制代码重新转换回源文件的过程。由于 LLM 是基于文本训练的,无法直接处理二进制数据。因此,必须先使用 Objdump 将二进制文件反汇编成汇编语言(ASM)。需要注意的是,二进制文件和反汇编后的 ASM 是等价的,可以相互转换,因此我们在讨论中会交替使用这两个术语。最后,通过计算反编译代码与源代码之间的损失来指导训练。为了评估反编译代码(SRC')的质量,我们会通过测试断言(可重执行性)来检验其功能是否正常。

指标

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

基准测试

  • HumanEval-Decompile 是一个包含 164 个 C 函数的集合,这些函数仅依赖于 标准 C 库。
  • ExeBench 是一个包含 2,621 个函数的集合,这些函数来自 真实项目,每个函数都使用了用户自定义的函数、结构体和宏。

结果

results

image

模型

我们的 LLM4Decompile 包含参数量从 13 亿到 330 亿不等的模型,并且我们已将这些模型发布在 Hugging Face 上。

模型 检查点 参数量 可重执行性 备注
llm4decompile-1.3b-v1.5 🤗 HF 链接 13亿 27.3% 注3
llm4decompile-6.7b-v1.5 🤗 HF 链接 67亿 45.4% 注3
llm4decompile-1.3b-v2 🤗 HF 链接 13亿 46.0% 注4
llm4decompile-6.7b-v2 🤗 HF 链接 67亿 52.7% 注4
llm4decompile-9b-v2 🤗 HF 链接 90亿 64.9% 注4
llm4decompile-22b-v2 🤗 HF 链接 220亿 63.6% 注4

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

注4:V2 系列基于 Ghidra 构建,并在 20 亿个 token 上进行训练,以 优化 Ghidra 生成的反编译伪代码。详情请参阅 ghidra 文件夹

快速入门

在 Colab 中打开

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

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 版本进行了修订。对于旧版本,请查看 Hugging Face 上对应的模型页面)。 注意:请将“func0”替换为您想要反编译的函数名

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

import subprocess
import os
func_name = 'func0'
OPT = ["O0", "O1", "O2", "O3"]
fileName = 'samples/sample' #'path/to/file'
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'#用 GCC 在 Linux 上编译代码
    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 文件
        asm= f.read()
        if '<'+func_name+'>:' not in asm: #重要:将 func0 替换为实际函数名
            raise ValueError("编译失败")
        asm = '<'+func_name+'>:' + asm.split('<'+func_name+'>:')[-1].split('\n\n')[0] #重要:将 func0 替换为实际函数名
        asm_clean = ""
        asm_sp = asm.split("\n")
        for tmp in asm_sp:
            if len(tmp.split("\t"))<3 和 '00' 在其中时:
                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)

汇编指令应采用以下格式:

:\nOPERATIONS\nOPERATIONS\n

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

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

反编译: 使用 LLM4Decompile 将汇编指令转换为 C 语言代码:

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,新令牌数量应在范围内
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}')

Docker 设置

# 构建 Docker
docker build -t llm4decompile .

# 使用 GPU 运行 Docker
docker run --gpus all -it --name llm4decompile llm4decompile /bin/bash

# 运行 demo.py(运行前请根据您的资源选择合适的模型)
cd ghidra
python demo.py

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年5月13日)
  • 对主流语言/平台及配置的支持。
  • 对可执行二进制文件的支持。(已完成:2024年5月13日)
  • 与反编译工具(如 Ghidra、Rizin)的集成。

许可证

此代码仓库采用 MIT 许可证和 DeepSeek 许可证授权。

引用

@misc{tan2024llm4decompile,
      title={LLM4Decompile: 使用大型语言模型反编译二进制代码}, 
      author={Hanzhuo Tan、Qi Luo、Jing Li、Yuqun Zhang},
      year={2024},
      eprint={2403.05286},
      archivePrefix={arXiv},
      primaryClass={cs.PL}
}

星标历史

星标历史图表

常见问题

相似工具推荐

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

154.3k|★★☆☆☆|今天
开发框架Agent语言模型

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|1周前
语言模型图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|1周前
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85.1k|★★☆☆☆|3天前
图像数据工具视频

funNLP

funNLP 是一个专为中文自然语言处理(NLP)打造的超级资源库,被誉为"NLP 民工的乐园”。它并非单一的软件工具,而是一个汇集了海量开源项目、数据集、预训练模型和实用代码的综合性平台。 面对中文 NLP 领域资源分散、入门门槛高以及特定场景数据匮乏的痛点,funNLP 提供了“一站式”解决方案。这里不仅涵盖了分词、命名实体识别、情感分析、文本摘要等基础任务的标准工具,还独特地收录了丰富的垂直领域资源,如法律、医疗、金融行业的专用词库与数据集,甚至包含古诗词生成、歌词创作等趣味应用。其核心亮点在于极高的全面性与实用性,从基础的字典词典到前沿的 BERT、GPT-2 模型代码,再到高质量的标注数据和竞赛方案,应有尽有。 无论是刚刚踏入 NLP 领域的学生、需要快速验证想法的算法工程师,还是从事人工智能研究的学者,都能在这里找到急需的“武器弹药”。对于开发者而言,它能大幅减少寻找数据和复现模型的时间;对于研究者,它提供了丰富的基准测试资源和前沿技术参考。funNLP 以开放共享的精神,极大地降低了中文自然语言处理的开发与研究成本,是中文 AI 社区不可或缺的宝藏仓库。

79.9k|★☆☆☆☆|5天前
语言模型数据工具其他

gpt4all

GPT4All 是一款让普通电脑也能轻松运行大型语言模型(LLM)的开源工具。它的核心目标是打破算力壁垒,让用户无需依赖昂贵的显卡(GPU)或云端 API,即可在普通的笔记本电脑和台式机上私密、离线地部署和使用大模型。 对于担心数据隐私、希望完全掌控本地数据的企业用户、研究人员以及技术爱好者来说,GPT4All 提供了理想的解决方案。它解决了传统大模型必须联网调用或需要高端硬件才能运行的痛点,让日常设备也能成为强大的 AI 助手。无论是希望构建本地知识库的开发者,还是单纯想体验私有化 AI 聊天的普通用户,都能从中受益。 技术上,GPT4All 基于高效的 `llama.cpp` 后端,支持多种主流模型架构(包括最新的 DeepSeek R1 蒸馏模型),并采用 GGUF 格式优化推理速度。它不仅提供界面友好的桌面客户端,支持 Windows、macOS 和 Linux 等多平台一键安装,还为开发者提供了便捷的 Python 库,可轻松集成到 LangChain 等生态中。通过简单的下载和配置,用户即可立即开始探索本地大模型的无限可能。

77.3k|★☆☆☆☆|3天前
语言模型开发框架