- LLM4Decompile은 Linux x86_64 바이너리를 GCC O0~O3 최적화 수준에서 사람이 읽을 수 있는 C 소스 코드로 되돌리는 오픈소스 대형 언어 모델 프로젝트임
- 접근 방식은 바이너리를 Objdump로 어셈블리로 변환한 뒤 LLM이 C 코드로 디컴파일하는 흐름이며, Ghidra 출력 의사코드를 정제하는 LLM4Decompile-Ref 계열도 제공함
- 모델은 1.3B~22B 규모로 공개되어 있고, llm4decompile-9b-v2는 Decompile 벤치마크에서 재실행 가능률 64.9%를 기록함
- 평가 지표는 디컴파일된 코드가 미리 정의된 테스트를 통과해 제대로 실행되는지 보는 재실행 가능률이며, HumanEval-Decompile 164개 C 함수와 ExeBench 2,621개 함수가 벤치마크로 사용됨
- 프로젝트는 2025년에 decompile-bench와 SK²Decompile을 공개했으며, 더 많은 아키텍처·설정·디컴파일 도구 연계를 목표로 확장 중임
LLM4Decompile의 목표와 지원 범위
- LLM4Decompile은 디컴파일에 특화된 오픈소스 대형 언어 모델 프로젝트임
- 현재 버전은 Linux x86_64 바이너리를 GCC 최적화 수준 O0~O3 범위에서 사람이 읽을 수 있는 C 소스 코드로 디컴파일함
- 프로젝트는 더 넓은 아키텍처와 설정을 지원하기 위한 확장을 진행 중임
- 두 가지 주요 사용 방식이 있음
- LLM4Decompile-End: 바이너리를 직접 디컴파일하는 모델 계열
- LLM4Decompile-Ref: Ghidra가 디컴파일한 의사코드를 LLM으로 정제하는 모델 계열
디컴파일 학습·평가 흐름
- 컴파일 과정은 C 소스 코드에서 시작해 전처리, 컴파일, 어셈블, 링크를 거쳐 실행 파일을 생성함
- 디컴파일은 이 과정을 반대로 따라가며, 바이너리 코드를 다시 소스 파일로 변환함
- LLM은 바이너리 데이터를 직접 처리하지 못하므로, 바이너리를 먼저 Objdump로 어셈블리 언어로 디스어셈블해야 함
- README는 바이너리와 디스어셈블된 ASM이 서로 변환 가능하므로 동등하게 취급된다고 설명함
- 학습에서는 디컴파일된 코드와 원본 소스 코드 사이의 손실을 계산하고, 평가는 테스트 어서션을 통과하는지로 기능성을 확인함
평가 지표와 벤치마크
- 핵심 지표는 Re-executability임
- 디컴파일된 코드가 제대로 실행되는지 확인함
- 미리 정의된 모든 테스트 케이스를 통과하는지 평가함
- HumanEval-Decompile은 표준 C 라이브러리에만 의존하는 164개 C 함수 모음임
- ExeBench는 실제 프로젝트에서 가져온 2,621개 함수 모음임
- 사용자 정의 함수, 구조체, 매크로를 포함함
공개 모델과 성능
- LLM4Decompile은 1.3B~33B 파라미터 규모의 모델을 포함하며, 모델은 Hugging Face에 공개됨
- 주요 모델의 재실행 가능률은 다음과 같음
- llm4decompile-1.3b-v1.5: 1.3B, 27.3%
- llm4decompile-6.7b-v1.5: 6.7B, 45.4%
- llm4decompile-1.3b-v2: 1.3B, 46.0%
- llm4decompile-6.7b-v2: 6.7B, 52.7%
- llm4decompile-9b-v2: 9B, 64.9%
- llm4decompile-22b-v2: 22B, 63.6%
- V1.5 계열은 15B 토큰의 더 큰 데이터셋과 최대 토큰 길이 4,096으로 학습되었고, 이전 모델 대비 100% 이상 성능 향상이 있었다고 밝힘
- V2 계열은 Ghidra 기반이며, Ghidra가 만든 디컴파일 의사코드를 정제하도록 2B 토큰으로 학습됨
- 22B-V2는 6.7B-V1.5보다 추가로 40.1% 높은 성능을 보였다고 밝힘
최근 공개 항목
- 2025년 10월 4일 SK²Decompile이 공개됨
- 1단계 Structure Recovery, 즉 Skeleton 단계는 바이너리나 의사코드를 난독화된 중간 표현으로 변환함
- 2단계 Identifier Naming, 즉 Skin 단계는 의미 있는 식별자를 가진 사람이 읽을 수 있는 소스 코드를 생성함
- 모델 링크: sk2decompile-struct-6.7b, sk2decompile-ident-6.7
- 2025년 5월 20일 decompile-bench가 공개됨
- 학습용 바이너리-소스 함수 쌍 200만 개 포함
- 평가용 함수 쌍 7만 개 포함
- 세부 내용은 decompile-bench 폴더에 있음
- 2024년 10월 17일 decompile-ghidra-100k가 공개됨
- 최적화 수준별 25,000개씩 총 100,000개 학습 샘플 포함
- 단일 A100 40G GPU에서 약 3.5시간에 실행되는 학습 스크립트를 제공함
- 빠른 재현 비용은 총 20달러 미만이며, 재실행 가능률 0.26을 달성함
- 2024년 9월 23일 LLM4Decompile-9B-v2가 공개됨
- Yi-Coder-9B를 기반으로 파인튜닝됨
- Decompile 벤치마크에서 재실행 가능률 0.6494를 달성함
사용 흐름
- 빠른 시작은 저장소 복제, Conda 환경 생성,
requirements.txt설치로 구성됨 - 전처리 단계는 C 코드를 GCC로 바이너리로 컴파일한 뒤,
objdump -d로 어셈블리 명령어를 추출함 - 함수 이름은 예제의
func0대신 디컴파일하려는 함수명으로 바꿔야 함 - 입력 어셈블리는 다음 형태를 기대함
<FUNCTION_NAME>:- 이어지는 여러 줄의 어셈블리 명령어
- 디컴파일 단계는
transformers의AutoTokenizer와AutoModelForCausalLM으로 Hugging Face 모델을 불러와 어셈블리 프롬프트를 C 코드로 생성함 - Docker 사용도 가능함
- 이미지를 빌드한 뒤 GPU 옵션으로 컨테이너를 실행함
ghidra디렉터리에서demo.py를 실행하는 흐름을 제공함
HumanEval-Decompile 데이터 형식
- HumanEval-Decompile 데이터는
llm4decompile/decompile-eval/decompile-eval-executable-gcc-obj.json에 JSON 리스트 형식으로 저장됨 - 샘플 수는 164개 함수에 O0, O1, O2, O3 최적화 수준을 곱한 164*4개임
- 각 샘플은 5개 키를 가짐
task_id: 문제 IDtype: O0, O1, O2, O3 중 하나인 최적화 단계c_func: HumanEval 문제의 C 해답c_test: C 테스트 어서션input_asm_prompt: 어셈블리 명령어와 프롬프트
- 평가 스크립트는 evaluation 폴더에 있음
진행 중인 항목과 라이선스
- 진행 항목에는 더 큰 학습 데이터셋과 정리 과정, 인기 언어·플랫폼·설정 지원, 실행 파일 지원, Ghidra·Rizin 같은 디컴파일 도구 통합이 포함됨
- 더 큰 학습 데이터셋과 실행 파일 지원은 2024년 5월 13일 완료된 항목으로 표시됨
- 코드 저장소는 MIT License와 DeepSeek License로 라이선스가 부여됨
- 논문은 arXiv:2403.05286에 있으며, 프로젝트는 Colab과 YouTube 자료도 제공함