LLM4Decompile - LLM kullanan ikili kod decompile teknolojisi
(github.com/albertan017)- LLM4Decompile, Linux x86_64 ikililerini GCC O0~O3 optimizasyon seviyelerinde insanların okuyabileceği C kaynak koduna geri döndüren açık kaynaklı bir büyük dil modeli projesidir
- Yaklaşımı, ikiliyi Objdump ile assembly’ye dönüştürdükten sonra LLM’in bunu C koduna decompile etmesi şeklindedir; ayrıca Ghidra çıktısı pseudo-code’u iyileştiren LLM4Decompile-Ref serisini de sunar
- Modeller 1.3B~22B ölçeğinde yayımlanmıştır ve llm4decompile-9b-v2, Decompile benchmark’ında %64,9 yeniden çalıştırılabilirlik oranı kaydetmiştir
- Değerlendirme metriği, decompile edilmiş kodun önceden tanımlanmış testleri geçerek düzgün çalışıp çalışmadığını ölçen yeniden çalıştırılabilirlik oranıdır; benchmark olarak HumanEval-Decompile’daki 164 C fonksiyonu ve ExeBench’teki 2.621 fonksiyon kullanılır
- Proje 2025’te decompile-bench ve SK²Decompile’ı yayımlamış olup daha fazla mimari, ayar ve decompile aracı entegrasyonunu hedefleyerek genişlemektedir
LLM4Decompile’ın hedefi ve destek kapsamı
- LLM4Decompile, decompile işlemine özelleşmiş açık kaynaklı bir büyük dil modeli projesidir
- Mevcut sürüm, Linux x86_64 ikililerini GCC optimizasyon seviyesi O0~O3 aralığında insanların okuyabileceği C kaynak koduna decompile eder
- Proje, daha geniş mimari ve ayarları desteklemek için genişletilmektedir
- İki ana kullanım biçimi vardır
- LLM4Decompile-End: İkilileri doğrudan decompile eden model ailesi
- LLM4Decompile-Ref: Ghidra’nın decompile ettiği pseudo-code’u LLM ile iyileştiren model ailesi
Decompile eğitim ve değerlendirme akışı
- Derleme süreci C kaynak kodundan başlar; önişleme, derleme, assembly’ye çevirme ve linkleme aşamalarından geçerek çalıştırılabilir dosya üretir
- Decompile işlemi bu süreci tersinden izler ve ikili kodu yeniden kaynak dosyaya dönüştürür
- LLM ikili verileri doğrudan işleyemediğinden ikilinin önce Objdump ile assembly diline disassemble edilmesi gerekir
- README, ikili ile disassemble edilmiş ASM’nin birbirine dönüştürülebildiği için eşdeğer kabul edildiğini açıklar
- Eğitimde decompile edilmiş kod ile özgün kaynak kod arasındaki kayıp hesaplanır; değerlendirmede ise test assertion’larını geçip geçmediğine bakılarak işlevsellik doğrulanır
Değerlendirme metrikleri ve benchmark’lar
- Temel metrik Re-executability’dir
- Decompile edilmiş kodun düzgün çalışıp çalışmadığını kontrol eder
- Önceden tanımlanmış tüm test vakalarını geçip geçmediğini değerlendirir
- HumanEval-Decompile, yalnızca standart C kütüphanesine bağımlı 164 C fonksiyonundan oluşan bir koleksiyondur
- ExeBench, gerçek projelerden alınmış 2.621 fonksiyonluk bir koleksiyondur
- Kullanıcı tanımlı fonksiyonlar, struct’lar ve macro’lar içerir
Yayımlanan modeller ve performans
- LLM4Decompile, 1.3B~33B parametre ölçeğinde modeller içerir ve modeller Hugging Face’te yayımlanmıştır
- Başlıca modellerin yeniden çalıştırılabilirlik oranları şöyledir
- 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 serisinin 15B token’lık daha büyük bir veri kümesi ve 4.096 maksimum token uzunluğu ile eğitildiği, önceki modellere kıyasla %100’den fazla performans artışı sağladığı belirtilir
- V2 serisi Ghidra tabanlıdır ve Ghidra’nın ürettiği decompile pseudo-code’unu iyileştirmek üzere 2B token ile eğitilmiştir
- 22B-V2’nin 6.7B-V1.5’e göre ek olarak %40,1 daha yüksek performans gösterdiği belirtilir
Yakın zamanda yayımlananlar
- 4 Ekim 2025’te SK²Decompile yayımlandı
-
- aşama Structure Recovery, yani Skeleton aşaması, ikiliyi veya pseudo-code’u obfuscate edilmiş bir ara temsile dönüştürür
-
- aşama Identifier Naming, yani Skin aşaması, anlamlı identifier’lara sahip, insanların okuyabileceği kaynak kod üretir
- Model bağlantıları: sk2decompile-struct-6.7b, sk2decompile-ident-6.7
-
- 20 Mayıs 2025’te decompile-bench yayımlandı
- Eğitim için 2 milyon ikili-kaynak fonksiyon çifti içerir
- Değerlendirme için 70 bin fonksiyon çifti içerir
- Ayrıntılar decompile-bench klasöründe bulunur
- 17 Ekim 2024’te decompile-ghidra-100k yayımlandı
- Her optimizasyon seviyesi için 25.000 olmak üzere toplam 100.000 eğitim örneği içerir
- Tek bir A100 40G GPU’da yaklaşık 3,5 saatte çalışan bir eğitim betiği sunar
- Hızlı yeniden üretim maliyeti toplamda 20 doların altındadır ve 0,26 yeniden çalıştırılabilirlik oranına ulaşır
- 23 Eylül 2024’te LLM4Decompile-9B-v2 yayımlandı
- Yi-Coder-9B temel alınarak fine-tune edilmiştir
- Decompile benchmark’ında 0,6494 yeniden çalıştırılabilirlik oranına ulaşmıştır
Kullanım akışı
- Hızlı başlangıç; depoyu klonlama, Conda ortamı oluşturma ve
requirements.txtkurulumundan oluşur - Önişleme aşaması, C kodunu GCC ile ikiliye derledikten sonra
objdump -dile assembly komutlarını çıkarır - Fonksiyon adı, örnekteki
func0yerine decompile edilecek fonksiyon adıyla değiştirilmelidir - Girdi assembly’sinin şu biçimde olması beklenir
<FUNCTION_NAME>:- Ardından gelen birden çok satır assembly komutu
- Decompile aşaması,
transformersiçindekiAutoTokenizerveAutoModelForCausalLMile Hugging Face modelini yükleyip assembly prompt’unu C koduna dönüştürür - Docker kullanımı da mümkündür
- İmaj derlendikten sonra container GPU seçenekleriyle çalıştırılır
ghidradizinindedemo.pyçalıştırma akışı sunulur
HumanEval-Decompile veri biçimi
- HumanEval-Decompile verileri
llm4decompile/decompile-eval/decompile-eval-executable-gcc-obj.jsoniçinde JSON listesi biçiminde saklanır - Örnek sayısı, 164 fonksiyon ile O0, O1, O2, O3 optimizasyon seviyelerinin çarpımı olan 164*4 adettir
- Her örnekte 5 anahtar bulunur
task_id: problem ID’sitype: O0, O1, O2, O3’ten biri olan optimizasyon aşamasıc_func: HumanEval probleminin C çözümüc_test: C test assertion’ıinput_asm_prompt: assembly komutları ve prompt
- Değerlendirme betiği evaluation klasöründe bulunur
Devam eden işler ve lisans
- Devam eden işler arasında daha büyük eğitim veri kümesi ve temizleme süreci, popüler dil/platform/ayar desteği, çalıştırılabilir dosya desteği ve Ghidra/Rizin gibi decompile araçlarıyla entegrasyon yer alır
- Daha büyük eğitim veri kümesi ve çalıştırılabilir dosya desteği, 13 Mayıs 2024’te tamamlanan maddeler olarak işaretlenmiştir
- Kod deposu MIT License ve DeepSeek License ile lisanslanmıştır
- Makale arXiv:2403.05286 adresindedir; proje ayrıca Colab ve YouTube materyalleri de sunar
1 yorum
Hacker News görüşleri
İlginç bir fikir, ancak sonuçların güvenilir olup olmayacağı merak konusu
Yeniden derlendiğinde farklı makine kodu ortaya çıkabileceği için halüsinasyonları tespit etmek zor olabilir; özellikle de kodun özünü oluşturan yeni yapılarda sessizce başarısız olmasından endişe ediliyor
Üretici şekilde çalışırken LLM’in belirli bölümler için güven skorunu da verip veremeyeceği merak ediliyor ve sonuçta insan doğrulaması gerekecek gibi görünüyor
İkili dosya kaynak koda decompile edildikten sonra yeniden ikiliye derlendiğinde orijinal ikili dosyanın çıkması gerekir; kayıp kabul edilebilir seviyeye inene kadar bu süreç tekrarlanabilir
Bu tür sorunlara pekiştirmeli öğrenme çok iyi uyuyor ve gerçekten de bu tip alanlarda olağanüstü etkili olduğu biliniyor
Günümüzde yaygın olan “LLM kullanalım gitsin” mem’ini keşfetmeye yönelik bir deney olabilir, ancak daha güçlü karşı argüman şu: mevcut decompiler’lar zaten çok daha az hesaplama ile daha iyi iş çıkarıyor
Sonrasında doğrulama aracıyla, LLM’in sunduğu kanıta göre sonucun doğru olup olmadığı kontrol edilebilir
Elbette böyle bir kanıt üretebilen bir LLM kurup eğitmek daha da büyük bir zorluk olurdu, ama halüsinasyonları güvenli biçimde yakalamanın bir yolu olabilir
Dolayısıyla sadece o birkaç fonksiyonu yeniden derlemek yeterlidir
Uygulamayı geliştiren kişileri biliyorsanız, onların geçmiş kodlarını eğitim verisi olarak kullanıp bir decompilation modülü eğitmenin mümkün olup olmayacağı ilginç
Örneğin Super Mario 64 ve Zelda 64 tamamen decompile edildi, başka N64 oyunlarında da çalışmalar sürüyor; bu iki oyunda çalışan geliştiricileri eşleyip kimin hangi modülü yazdığını tahmin ederek bunu başka oyunların decompile edilmesinde kullanmak mümkün mü diye merak ediliyor
Bu iş gerçekten iyi seviyeye gelirse, PC içindeki tüm ikili blob’ları çözmek, sürücüleri açığa çıkarmak ve hatta işletim sistemlerini bile açmak mümkün olabilir
Linux’la yetinmeyip Windows XP’yi yeniden canlandırıp modern güvenliği ve uygulama uyumluluğunu geri taşımak, Microsoft’un Windows 11’ini ise olduğu gibi bırakmak bile hayal edilebilir
Eğer LLM mevcut decompiler’larla aynı işi yapabiliyorsa, hukukçular bunu büyük olasılıkla eşdeğer bir süreç olarak değerlendirecektir
Asıl sorun teknik değil, hukuki ve politik
Bunun gerçekten faydalı kullanıldığı örnekleri çok bilmiyorum, ama kişinin kodlama stilinin derleme sürecinden sonra da iz bırakması ve bu sayede derlenmiş programların birbirinden ayırt edilebilmesi etkileyici
Sonuç orijinale çok benzeyecektir ama birçok kod stili unsuru kaybolur; görünürde kalan stil de çoğunlukla halüsinasyona yakın olur
Açık C koduyla büyük miktarda girdi/çıktı çifti veri kümesi oluşturmak kolay olduğundan, bu LLM ince ayarı için çok iyi bir kullanım örneği
Normalde sentetik eğitim verisinin kalitesi büyük bir endişe kaynağıdır, ama burada esas önemli nokta kodun derlenebilmesidir
Sonuç görselindeki yeniden çalıştırılabilirlik değerlerini doğru okuyorsam, fikir harika ama pratikte pek iyi çalışmıyor gibi görünüyor
https://raw.githubusercontent.com/albertan017/LLM4Decompile/...
Ek bilgi olarak, yeniden çalıştırılabilirlik anlamsal doğruluğu ölçen temel metrik
Decompile edilen sonuç yeniden derlenip test vakaları çalıştırılarak program mantığının ve davranışının korunup korunmadığı değerlendiriliyor; yeniden derlenebilirlik ve yeniden çalıştırılabilirlik sırasıyla sözdizimsel geri kazanımı ve anlamın korunmasını ifade ediyor
Bu problem en az iki açıdan ilgi çekici
Birincisi, ideal bir decompiler tescilli kaynak kodun önemini azaltabilir
İkincisi, herkese açık C kodu bol olduğu için assembly ile kaynak kodun eşleştirilmiş veri kümelerini oluşturmak kolay; ayrıca optimizasyon seviyesi, derleyici ve platform çeşitliliği de var
Yine de yazarların neden DeepSeek-Coder üzerinde ince ayar yaptığı merak ediliyor
Benzer bir veri kümesiyle bir LLM’i sıfırdan eğitmenin mümkün olup olmadığı, ne kadar büyüklüğe ihtiyaç duyulacağı ve yerelde çalıştırmanın mümkün olup olmadığı da merak konusu
İstenen görev başlangıç modeline tam yakın olmasa bile, rastgele başlatma yerine önceden eğitilmiş bir modelden başlamak neredeyse her zaman daha iyidir
Derleyici bilgi kaybettirdiği için bir anlamda asla var olamaz; hatta bunu “çıktı kodunun yüksek seviyeli anlaşılması” gibi daha esnek bir açıdan ele alsanız bile bu, bilgisayar güvenliği alanında AGI düzeyinde bir sorun
Henüz hiç kimse buna yaklaşabilmiş değil
Llama2 2 trilyon token ile geliştirildi, oysa bu veri kümesi yaklaşık 4 milyar token düzeyinde
Uygun model boyutunu belirlemek de kolay değil; deneylerde 7 milyar parametreli model %21 çalıştırılabilirlik gösterirken 1 milyar parametreli model %10’da kaldı
Buna karşılık yeniden derlenebilirlik açısından ikisi birbirine epey yakın
1 milyar parametreli model en az 2GB GPU belleği istiyor, bu yüzden çoğu GPU’da çalışabilir; 7 milyarlık model ise 14GB gerektiriyor ve 3090/4090 sınıfına daha uygun
33 milyarlık model için tek kartta seçenek A100 80GB; teknik olarak MacBook’ta da mümkün olabilir ama pratikte kimsenin bunu istemesi beklenmez
Ayrıca bu, fikri doğrulamak için bir başlangıç noktası da olabilir
Python bayt kodu için LLM tabanlı bir geri derleyici üzerinde çalışılıyor: https://github.com/kukas/deepcompyle
Bu araştırma yönünde çalışan çok kişi yok gibi görünüyor, ancak özellikle uzun attention context mümkün hale gelmişken bunun oldukça ilginç olabileceğini düşünüyorum
Bu alanda çalışan bir ekip bilen varsa iş birliğiyle ilgileniyorum
Deneyimime göre Python bayt kodu yeterince yüksek seviyeli; kaynak koda doğrudan dönüştürülebilir
Python'un büyük bir açık kaynak kütüphane ekosistemi var, ancak ikili biçimde dağıtılan yazılımlarda çok kullanıldığını düşünmüyorum
LLM tabanlı olup olmadığı da net değil
İkiliye derlenen Python projesi çok fazla yok gibi
Ben de böyle bir şey denemeyi planlıyordum
Bir gün birileri ikili girdi → iyi kaynak kod çıktısı hattını çözecek, ancak bunun için hâlâ birkaç yıl var gibi görünüyor
Bunu böyle düşünmemin nedeni, bu problemin sonunda devasa bir para yığını görünmemesi; ama yanılıyor olabilirim
İyi bir geçici yaklaşım, Ghidra'yı headless modda çalıştıran bir geri derleme hattı kurmak ve geri derleyicinin katı sözdizimsel doğruluğunu LLM'nin sezgisel yetenekleriyle birleştirmek olurdu
AlphaGeometry'de olduğu gibi geri derleyici ile LLM birbirinin zayıf yönlerini telafi etmeli: https://deepmind.google/discover/blog/alphageometry-an-olymp...
Ayrıca C kaynak üretimini orkestre etmek için AICI gibi bir şeyi yapıştırıcı olarak kullanmak gerekir: https://github.com/microsoft/aici
LLM'nin ağırlıklarını dilbilgisel olarak doğru C kaynak üretmek için kullanmak yerine, değişken adları, snippet kalıpları ve mimari seçimleri üzerine düşündürmek; geri kalanını ise Ghidra veya LLVM gibi araçlara bırakmak daha doğru olur
Biraz el kol hareketiyle anlatılan eski bir yüksek lisans öğrencisinin koltuk yorumuna benziyor olabilir, ama bu araştırmacıların bu işe girişmiş olması etkileyici ve yazarların gelecekteki çalışmalarda Ghidra entegrasyonundan bahsetmesi, yönün doğru olduğunu düşündürüyor
6 milyarlık modelin 33 milyarlık modelden daha iyi olduğu noktalar olması ilginç
Bunun, 33 milyarlık modelin daha fazla eğitim verisine ihtiyaç duyduğu anlamına gelip gelmediğini merak ediyorum
Yaklaşık 1 milyon C programıyla ön eğitim almış bir modeli, trilyonlarca token üzerinde eğitilmiş DeepSeek-Coder ile karşılaştırınca veri miktarında birkaç basamak fark var
LLM olmayan çözümlerle kıyaslandığında durumun nasıl olduğunu da merak ediyorum
Çoğu LLM ciddi biçimde eksik eğitilmiş durumda ve 7 milyarlık modeller, ana akım modeller arasında nispeten daha az eksik eğitilmiş oldukları için LLM fine-tuning topluluğunda yaygınlaştı
Standart yöntemle yapılan basit naif fine-tuning yaklaşımında büyük modelleri eğitmek zordur; yalnızca veri miktarı değil, veri temizleme, öğrenme oranı ve decay gibi tüm unsurlar nihai performansı etkiler
Bunun için söz konusu C programlarının ortalama boyutunun 2 milyon token'dan birkaç basamak küçük olduğunu varsaymak gerekir; pratikte bu mümkün olsa da kulağa epey iyimser bir varsayım gibi geliyor
Başarılı olursa bunun, derleyicinin makine kodunu 1:1 kopyalamak anlamına gelip gelmediğini merak ediyorum
Eğer öyleyse bu, tam kodun latent uzay içinde olasılık dağılımı olarak var olabileceği anlamına gelir
Ya da daha muhtemel olarak yalnızca mantığı kopyalayıp sonra hedef dile çeviren bir yapı olabilir
Derleme için anahtar veya hash gibi deterministik olmayan girdiler gerektiren ikililer muhtemelen bozulacaktır
Gerçekten çok ilginç
GPT-4'ün karşılaştırmada hâlâ oldukça iyi performans göstermesi şaşırtıcı
Bu modelden çok daha iyi derlenebilir kod üretebiliyor, ancak davranışı doğru olan kodu yeniden üretme doğruluğu daha düşük
Yine de oldukça etkileyici
Modeli geliştiriyoruz, o yüzden güncellemeleri takip etmeye devam edin