LLM4Decompile

albertan017MIT更新放缓

用大语言模型把编译后的二进制代码还原成可读源码,为逆向工程提供自动化反编译能力。

Reverse Engineering: Decompiling Binary Code with Large Language Models

暂无版本7,281star +14 / 7 天585fork同步于 2026-11-10 17:33 UTC

怎么上手

由 README 提炼,执行前请确认
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
硬件要求按 README 说明

README 示例用 torch.bfloat16 加载模型并 .cuda(),需 NVIDIA GPU;训练脚本称单张 A100 40G 约 3.5 小时,未给出各模型推理显存下限。

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

用大模型把 Linux x86_64 二进制反编译回可读 C 源码的开源模型与工具链

用大语言模型把编译后的二进制代码还原成可读源码,为逆向工程提供自动化反编译能力。

核心能力

  • 提供 LLM4Decompile-End 直接反编译二进制
  • 提供 LLM4Decompile-Ref 精修 Ghidra 伪代码
  • 用 objdump 反汇编后送入模型生成 C 代码
  • 发布 1.3B 到 33B 多尺寸模型权重
  • 附带 HumanEval-Decompile 与 ExeBench 评测基准

容易踩的坑

需从 Hugging Face 另行下载模型权重,仓库不含权重;反汇编前要把 func0 替换成实际函数名,否则会报编译失败;Ref 系列依赖 Ghidra 生成的伪代码,需先装好 Ghidra 后端。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

0 个版本

暂无 release 数据(可能没有发版,或尚未同步)。

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Reverse Engineering: Decompiling Binary Code with Large Language Models

    GitHub Tread

    Updates

    • [2025-10-04]: Release SK²Decompile: LLM-based Two-Phase Binary Decompilation from Skeleton to Skin. Phase 1 Structure Recovery (Skeleton): Transform binary/pseudo-code into obfuscated intermediate representations 🤗 HF Link. Phase 2 Identifier Naming (Skin): Generate human-readable source code with meaningful identifiers 🤗 HF Link.
    • [2025-05-20]: Release decompile-bench, contains two million binary-source function pairs for training, and 70K function pairs for evaluation. Please refer to the decompile-bench folder for details.
    • [2024-10-17]: Release decompile-ghidra-100k, a subset of 100k training samples (25k per optimization level). We provide a training script that runs in ~3.5 hours on a single A100 40G GPU. It achieves a 0.26 re-executability rate, with a total cost of under $20 for quick replication of LLM4Decompile.
    • [2024-09-26]: Update a Colab notebook to demonstrate the usage of the LLM4Decompile model, including examples for the LLM4Decompile-End and LLM4Decompile-Ref models.
    • [2024-09-23]: Release LLM4Decompile-9B-v2, fine-tuned based on Yi-Coder-9B, achieved a re-executability rate of 0.6494 on the Decompile benchmark.
    • [2024-06-19]: Release V2 series (LLM4Decompile-Ref). V2 (1.3B-22B), building upon Ghidra, are trained on 2 billion tokens to refine the decompiled pseudo-code from Ghidra. The 22B-V2 version outperforms the 6.7B-V1.5 by an additional 40.1%. Please check the ghidra folder for details.
    • [2024-05-13]: Release V1.5 series (LLM4Decompile-End, directly decompile binary using LLM). V1.5 are trained with a larger dataset (15B tokens) and a maximum token length of 4,096, with remarkable performance (over 100% improvement) compared to the previous model.
    • [2024-03-16]: Add llm4decompile-6.7b-uo model which is trained without prior knowledge of the optimization levels (O0~O3), the average re-executability is around 0.219, performs the best in our models.

    About

    • LLM4Decompile is the pioneering open-source large language model dedicated to decompilation. Its current version supports decompiling Linux x86_64 binaries, ranging from GCC's O0 to O3 optimization levels, into human-readable C source code. Our team is committed to expanding this tool's capabilities, with ongoing efforts to incorporate a broader range of architectures and configurations.
    • LLM4Decompile-End focuses on decompiling the binary directly. LLM4Decompile-Ref refines the pseudo-code decompiled by Ghidra.

    Evaluation

    Framework

    During compilation, the Preprocessor processes the source code (SRC) to eliminate comments and expand macros or includes. The cleaned code is then forwarded to the Compiler, which converts it into assembly code (ASM). This ASM is transformed into binary code (0s and 1s) by the Assembler. The Linker finalizes the process by linking function calls to create an executable file. Decompilation, on the other hand, involves converting binary code back into a source file. LLMs, being trained on text, lack the ability to process binary data directly. Therefore, binaries must be disassembled by Objdump into assembly language (ASM) first. It should be noted that binary and disassembled ASM are equivalent, they can be interconverted, and thus we refer to them interchangeably. Finally, the loss is computed between the decompiled code and source code to guide the training. To assess the quality of the decompiled code (SRC'), it is tested for its functionality through test assertions (re-executability).

    Metrics

    • Re-executability evaluates whether the decompiled code can execute properly and pass all the predefined test cases.

    Benchmarks

    • HumanEval-Decompile A collection of 164 C functions that exclusively rely on standard C libraries.
    • ExeBench A collection of 2,621 functions drawn from real projects, each utilizing user-defined functions, structures, and macros.

    Results

    Models

    Our LLM4Decompile includes models with sizes between 1.3 billion and 33 billion parameters, and we have made these models available on Hugging Face.

    ModelCheckpointSizeRe-executabilityNote
    llm4decompile-1.3b-v1.5🤗 HF Link1.3B27.3%Note 3
    llm4decompile-6.7b-v1.5🤗 HF Link6.7B45.4%Note 3
    llm4decompile-1.3b-v2🤗 HF Link1.3B46.0%Note 4
    llm4decompile-6.7b-v2🤗 HF Link6.7B52.7%Note 4
    llm4decompile-9b-v2🤗 HF Link9B64.9%Note 4
    llm4decompile-22b-v2🤗 HF Link22B63.6%Note 4

    Note 3: V1.5 series are trained with a larger dataset (15B tokens) and a maximum token size of 4,096, with remarkable performance (over 100% improvement) compared to the previous model.

    Note 4: V2 series are built upon Ghidra and trained on 2 billion tokens to refine the decompiled pseudo-code from Ghidra. Check ghidra folder for details.

    Quick Start

    Open In Colab

    Setup: Please use the script below to install the necessary environment.

    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
    

    Here is an example of how to use our model (Revised for V1.5. For previous models, please check the corresponding model page at HF). Note: Replace the "func0" with the function name you want to decompile.

    Preprocessing: Compile the C code into binary, and disassemble the binary into assembly instructions.

    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'#compile the code with GCC on Linux
        subprocess.run(compile_command, shell=True, check=True)
        compile_command = f'objdump -d {output_file}.o > {output_file}.s'#disassemble the binary file into assembly instructions
        subprocess.run(compile_command, shell=True, check=True)
        
        input_asm = ''
        with open(output_file+'.s') as f:#asm file
            asm= f.read()
            if '<'+func_name+'>:' not in asm: #IMPORTANT replace func0 with the function name
                raise ValueError("compile fails")
            asm = '<'+func_name+'>:' + asm.split('<'+func_name+'>:')[-1].split('\n\n')[0] #IMPORTANT replace func0 with the function name
            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:])  # remove the binary code
                tmp_asm = tmp_asm.split("#")[0].strip()  # remove the comments
                asm_clean += tmp_asm + "\n"
        input_asm = asm_clean.strip()
        before = f"# This is the assembly code:\n"#prompt
        after = "\n# What is the source code?\n"#prompt
        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)
    

    Assembly instructions should be in the format:

    <FUNCTION_NAME>:\nOPERATIONS\nOPERATIONS\n

    Typical assembly instructions may look like this:

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

    Decompilation: Use LLM4Decompile to translate the assembly instructions into C:

    from transformers import AutoTokenizer, AutoModelForCausalLM
    import torch
    
    model_path = 'LLM4Binary/llm4decompile-6.7b-v1.5' # V1.5 Model
    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:#optimization level 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)### max length to 4096, max new tokens should be below the range
    c_func_decompile = tokenizer.decode(outputs[0][len(inputs[0]):-1])
    
    with open(fileName +'.c','r') as f:#original file
        func = f.read()
    
    print(f'original function:\n{func}')# Note we only decompile one function, where the original file may contain multiple functions
    print(f'decompiled function:\n{c_func_decompile}')
    

    Docker setup

    # build docker
    docker build -t llm4decompile .
    
    # run docker with GPU
    docker run --gpus all -it --name llm4decompile llm4decompile /bin/bash
    
    # run demo.py (choose a model suitable for your resources before running)
    cd ghidra
    python demo.py
    

    HumanEval-Decompile

    Data are stored in llm4decompile/decompile-eval/decompile-eval-executable-gcc-obj.json, using JSON list format. There are 164*4 (O0, O1, O2, O3) samples, each with five keys:

    • task_id: indicates the ID of the problem.
    • type: the optimization stage, is one of [O0, O1, O2, O3].
    • c_func: C solution for HumanEval problem.
    • c_test: C test assertions.
    • input_asm_prompt: assembly instructions with prompts, can be derived as in our preprocessing example.

    Please check the evaluation scripts.

    On Going

    • Larger training dataset with the cleaning process. (done:2024.05.13)
    • Support for popular languages/platforms and settings.
    • Support for executable binaries. (done:2024.05.13)
    • Integration with decompilation tools (e.g., Ghidra, Rizin)

    License

    This code repository is licensed under the MIT and DeepSeek License.

    Citation

    @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 History

    Star History Chart