Disassembly ve decomplier efsaneleri gerçekleşiyor.

  • Disassembly = makine kodunu okunabilir assembly diline çevirir.
  • Decomplier = assembly yada IL yada IR dillerini okunabilen kaynak koda çevirir. Mesela C,C++,C#,Delphi,Ocaml,Rust,... Kodlarına çevirir.

Gerçekten yazılan kodları tekrar elde edebileceğimiz araçlar var mıdır? Peki gerçekten böyle araçlar yapmanın amacı nedir? Elimde hazır optimizme edilmiş kaynak kod varken niye bir daha çalışan programdan kaynak kod elde etmeye çalışayım? Nasıl yapabilirim?

  • Amaçlar;

  1. Derlenmiş yazılımdaki zararlı davranışlar varsa analiz etmek ve davranışın gerçekleşmemesini sağlamak. Bu arada gerekiyorsa kullanıcıya risk altında olduğunu haber vermek.
  2. Yazılım geliştirirken hata ayıklama(debug) işlemini mümkün kılmak. Etrafta daha derleyicisi olmayan bir sürü programlama dili var. Bir dilin kullanılmasını hata ayıklama özelliği sağlıyor.
  3. (Attach to software)Yazılım dağıtıldıktan sonra hedef bilgisayarda hata ayıklamak. Böylece gerçekleşen senaryo analiz edilebilir.
  4. Kaynak kodları kaybolan yada olmayan üzerinde tekrar çalışılması gereken yazılım parçasından kodları çıkartmak ve üzerinde yazılımcıların çalışabileceği hale getirmek.
  5. Programlama dilleri arasında dönüşüm sağlamak. F# |> C# dönüşümü gibi .net dilleri arasında dönüşüm mümkün oluyor. Ayrıca makine koduna derlenmiş kütüphane benzer yollarla .net yada jvm ortamına aktarılabiliyor.
  6. Emulator yapmak. Bugün arm mimarisinde android telefonu x86 mac üzerinde çalıştırabiliyorsak Qemu yazılımına teşekkür etmemiz gerekir. arm makine kodlarını JIT ile anlık x86 makine kodlarına dönüştürüyor.
  7. CUDA gibi kapalı kaynak ve tek bir donanımda yazılım parçalarını taşınabilir hale getirmek.
  8. Autovectorizm ve autoparallelizm işlemlerini hazır yürütülebilir program üzerinde uygulamak. 
  9. Crack dosyası üretmek. İşte gizli ama asıl amaç. Çözülen kod içinde işimize gelmeyen lisans kontrollerini atıp programı kullanmak. Buna karşı önlem olarak artık demo yazılımı dağıtıyor. Böylece yazılımın tamamını korumuş oluyorlar?! yada kodları çevrilse de anlaşılmayacak karmaşıklığa getirmeye uğraşıyorlar.
  10. Bu seçeneğin oldukça fantastik geleceğine eminim. Qemu projesini araştırın. Arm yürütüler dosyayı x86 işlemci üzerinde yürütmeye yarıyor ama jit ile. Peki jit olmadan yürütmek istiyorsanız yani BİNARY TRANSLATION" işlemiyle tek dosya üretmek yapmak istiyorsanız ne yapacağız? Aslında oldukça zor. Bununla uğraşmak yerine c kodları ne kadar karmaşık olsa da tekrar geri elde edilmeye çalışılır ve sonra arm için derlenmeye çalışır. Bir takım hatalar çıkmasını bekliyorum tabi ama düzelttiğinizde arm üzerinde program çalışmaya başlar. Gerçek hayatta uygulanması düşünülüyor. Ayrıca bakınız: Link
  11. Varsa aklınıza gelen lütfen yoruma yazın.
  • Öncelikle burada oldukça fazla soru var. Uzun zamandır Python kullanan dünya derleyicinin önemini ve içeriğini unuttu. Python da hemen hemen ihtiyacımız olan her şey "pip install ..." diye indirip kullanabiliyorduk. Çözemediğimiz mesele olursa İnternetten cevapları alabiliyorduk. Python varken derleyiciye ihtiyaç da kalmıyordu!? Peki bu paketler nereden geliyordu? Bazı bilgili sihir insanlar yapıyor ve paket oluşuyor. Bir Python paket derleyicisi işleri hallediyor, gerekli verileri bir araya getirip tek yada daha az dosya halinde işlenebilir hale getiriyor. Derleyici(complier) ve birleştirici(assembler) işlemi de aynı işlevi görür. Aslında assembly dili makine kodlarının karşılığıdır. Her işlemcide değişebilir. Assembler sonucunda makine kodları derlenip çalıştırılabilen tek dosya haline gelir. Makine kodları assembly dilinden çok daha uzundur. Aynı işlem complier için de geçerlidir. assembly dili ne zaman çok uzun gelmeye başladı daha üst düzey diller çıktı. C/C++ dilleri yetmedi Nim dili çıktı. Nim c/c++ dillerini üretmeye başladı. Böylece 3-5 satır kod yazarak aynı işlemleri yaptırabilir olduk. Complier yazdığınız her satır programlama dilinin assembly kod karşılığı vardır prensibiyle çalışır. En temel bilgiyi aldığımızı varsayıyorum.
  • Teoriye göre bu işlem tersine döndürebilir. Makine kodunun assembly karşılığı, assemblinin Üst düzey dildeki karşılığı vardır. Peki gerçekten yazdığım kod gibi elde edebilir miyim? Derleyicinin yaptığı işleri daha derinden incelediğimizde önce derleyici "name mangling" dediğimiz işlemi gerçekleştirir. Tanımlı olan ad yerine rastgele bir isim verir böylece aynı adda değişkenlerin ve fonksiyonların isimleri birbirine karışmaz. .Sonra CFG(Control Flow Graph), ast(abstraction syntax tree) ve ctf(command tree api) tablolarını çıkarır. Ayrıntılı incelemeye aldıktan sonra kullanıcının verdiği talimatlar varsa çıkarılan tabloların(graph) optimizasyonu yapabilir böylece algoritma derleyici tarafından optimize edilir. Bu işlem derleme süresini uzatır. Eğer llvm gibi bir ara dil kullanılıyorsa llvm ır kodları oluşturulur. Böylece birden fazla bağımsız yapım dil ve araç IR yada IL ile birbirlerine arayüz oluşturur. IR ve IL hala okunabilir formattadır. Çalışma zamanı kütüphaneleri varsa bu dosyalar JIT ile yürütülebilir ama makine kodu gibi hızlı çalışmaz. En son yeni derleyici seçeneklerine göre optimizasyonlar uygulanır ve makine kodu çıktısı alınır.
  • JIT dediğimiz işlem ise kodu parça parça makine koduna dönüştürür ve çalıştırır. Kovanın ağzına hortum takmaya benzer. Çalıştırma işlemi kontrol altında tutularak bir takım optimizasyonlar ve güvenlik kontrolleri yapılır. Aynı zamanda taşınabilirlik sağlanabilir. En önemli örnekleri VM alt yapılarıdır. Mesela; JVM, CLR, LLVM, python, ruby, erlang,...
  • Eğer ki bu kadar işlemi Makine kodundan(native) tersine çevirmek isterseniz ilk anda yazıldığı gibi kod yapısını, değişken ve fonksiyon isimlerini göremezsiniz. İlk olarak derleyici sonra ters derleyici(decomplier) rastgele isimler atayacaktır. Paket dosyaları ön işlemciden geçtikten sonra tek dosya haline getirilmişti. C dilinde çalışıyorsan kabarık olan "stdio" kütüphanesinin tamamı içine kopyalanmıştı. Geri getirme halinde kütüphane isimlerinin hiçbirini tekrar göremezsin. Ama benim için sorun yok diyorsan etrafta birçok araç var. En meşhurları ollydbg, IDA PROcapstone engine,JEB. Capstone programlarınızın içine dahil edebiliyorsunuz. IDA PRO ise gui aracı ve ticari bir araç. LLVM ve Clang araçlarını incelemenizi tavsiye ederim. 
  • .net ve java kodlarını geri döndüren araçlar var ama gördüğüm .net ortamında kodları geri döndürdüğünde daha okunabilir kod üretiliyor.

Yorumlar

Popüler Yayınlar