license: mit
tags:
- 反编译
- 二进制
widget:
- text: "# 这是汇编代码:\n:\nendbr64\nlea (%rdi,%rsi,1),%eax\nretq\n# 对应的源代码是什么?\n"
1. LLM4Decompile 简介
LLM4Decompile 致力于将 x86 汇编指令反编译为 C 代码。最新发布的 V1.5 系列模型采用更大规模的数据集(150 亿 tokens)和 4096 的最大 token 长度进行训练,相较于前代模型性能显著提升(最高达 100%)。
2. 评估结果
模型/基准测试 |
HumanEval-Decompile |
|
|
|
|
ExeBench |
|
|
|
|
优化级别 |
O0 |
O1 |
O2 |
O3 |
AVG |
O0 |
O1 |
O2 |
O3 |
AVG |
DeepSeek-Coder-6.7B |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0.0000 |
GPT-4o |
0.3049 |
0.1159 |
0.1037 |
0.1159 |
0.1601 |
0.0443 |
0.0328 |
0.0397 |
0.0343 |
0.0378 |
LLM4Decompile-End-1.3B |
0.4720 |
0.2061 |
0.2122 |
0.2024 |
0.2732 |
0.1786 |
0.1362 |
0.1320 |
0.1328 |
0.1449 |
LLM4Decompile-End-6.7B |
0.6805 |
0.3951 |
0.3671 |
0.3720 |
0.4537 |
0.2289 |
0.1660 |
0.1618 |
0.1625 |
0.1798 |
LLM4Decompile-End-33B |
0.5168 |
0.2956 |
0.2815 |
0.2675 |
0.3404 |
0.1886 |
0.1465 |
0.1396 |
0.1411 |
0.1540 |
3. 使用方法
以下是使用本模型的示例(适用于 V1.5 版本)。
注意:请将 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'
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:
raise ValueError("编译失败")
asm = '<'+'func0'+'>:' + asm.split('<'+'func0'+'>:')[-1].split('\n\n')[0]
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)
反编译步骤: 使用 LLM4Decompile 将汇编指令翻译为 C 代码:
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_path = 'LLM4Binary/llm4decompile-1.3b-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:
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=4000)
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}')
4. 许可证
本代码仓库采用 MIT 许可证。
5. 联系
如有疑问,请提交 issue。