S: .class dosyalarımı şifrelersem ve bunları anında yüklemek ve şifresini çözmek için özel bir sınıf yükleyici kullanırsam, bu durum derlemenin çözülmesini engeller mi?
C: Java bayt kodu çözümlemesini engelleme sorunu neredeyse dilin kendisi kadar eskidir. Piyasada bulunan bir dizi gizleme aracına rağmen, acemi Java programcıları fikri mülkiyetlerini korumak için yeni ve akıllı yollar düşünmeye devam ediyor. Bu Java Soru-Cevap bölümünde, tartışma forumlarında sık sık tekrarlanan bir fikirle ilgili bazı mitleri ortadan kaldırıyorum.
Java .class dosyalarının orijinallere çok benzeyen Java kaynaklarına yeniden yapılandırılabilmesinin son derece kolay olması, Java bayt kodu tasarım hedefleri ve değiş tokuşlarla çok ilgilidir. Diğer şeylerin yanı sıra, Java bayt kodu kompaktlık, platform bağımsızlığı, ağ hareketliliği ve bayt kodu yorumlayıcıları ve JIT (tam zamanında) / HotSpot dinamik derleyicileri tarafından analiz kolaylığı için tasarlanmıştır. Muhtemelen, derlenmiş .class dosyaları programcının amacını açık bir şekilde ifade eder, o kadar net bir şekilde analiz edilmeleri orijinal kaynak kodundan daha kolay olabilir.
Derlemenin tamamen çözülmesini engellemek olmasa da en azından daha zor hale getirmek için birkaç şey yapılabilir. Örneğin, derleme sonrası bir adım olarak, bayt kodunun derlenmiş haldeyken okunmasını veya geçerli Java koduna (veya her ikisine) dönüştürülmesini zorlaştırmak için .class verilerine masaj yapabilirsiniz. Aşırı yöntem adının aşırı yüklenmesi gibi teknikler ilki için iyi işliyor ve Java sözdizimi aracılığıyla temsil edilmesi mümkün olmayan kontrol yapıları oluşturmak için kontrol akışını manipüle etmek ikincisi için iyi çalışıyor. Daha başarılı ticari obfuscatorlar, bunların ve diğer tekniklerin bir karışımını kullanır.
Ne yazık ki, her iki yaklaşım da JVM'nin çalıştıracağı kodu gerçekten değiştirmelidir ve birçok kullanıcı bu dönüşümün uygulamalarına yeni hatalar ekleyebileceğinden korkar (haklı olarak öyle). Ayrıca, yöntem ve alan yeniden adlandırma, yansıma çağrılarının çalışmayı durdurmasına neden olabilir. Gerçek sınıf ve paket adlarını değiştirmek, diğer birkaç Java API'sini (JNDI (Java Adlandırma ve Dizin Arayüzü), URL sağlayıcıları vb.) Bozabilir. Değiştirilen adlara ek olarak, sınıf bayt kodu uzaklıkları ile kaynak satır numaraları arasındaki ilişki değiştirilirse, orijinal istisna yığını izlerini kurtarmak zor olabilir.
Daha sonra orijinal Java kaynak kodunu gizleme seçeneği vardır. Ancak temelde bu, benzer bir dizi soruna neden olur. Gizlemek değil, şifrelemek mi?
Belki de yukarıdakiler, "Bayt kodunu değiştirmek yerine, derlemeden sonra tüm sınıflarımı şifrelersem ve JVM içinde anında şifresini çözersem (ki bu özel bir sınıf yükleyiciyle yapılabilir)? Sonra JVM benim orijinal bayt kodu ve yine de derlemeyi çözecek veya tersine mühendislik yapacak bir şey yok, değil mi? "
Ne yazık ki, hem bu fikri ilk ortaya atanın siz olduğunu düşünürken hem de gerçekten işe yaradığını düşünürken yanılıyorsunuz. Ve bunun nedeninin şifreleme planınızın gücüyle hiçbir ilgisi yoktur.