Kod Karıştırma (Obfuscation)
Sözlük anlamı olarak Obfuscation sözcüğü şaşırtmaca demek. Yazılım dünyasında ise programların kaynak kodlarının işlevini hiçbir şekilde değiştirmeden anlaşılamayacak derecede karıştırılması anlamına geliyor.
Neden kod karıştırmaya ihtiyaç duyuyoruz?
Geliştirdiğimiz ticari programların fikri haklarını (intellectual property) koruma altına almak, ters mühendislik (reverse engineering) denemeleri yapılsa bile programlarımıza gömülü durumda olan bize ait özel algoritma, teknoloji vb. know-how türü bilgilerin ortaya çıkartılmasını engellemek zorundayız. Kod karıştırmanın diğer bir kullanım alanı da kodun daha iyi ve efektif hale getirilmesidir. Kod karıştırma için kullanılan araçlar kodu analiz ederek gereksiz/yararsız kodları ve metadata bölümlerini kırpabiliyor ve bu sayede kod boyutunda azalmayla birlikte performans artışı sağlanabiliyor.
Java ve .Net gibi just-in-time derleme ve çalıştırma yapılan ortamlarda kodların açık edilme riski derlenerek makina koduna çevrilen ve bu şekilde dağıtılan programlara göre çok daha büyüktür. Bu makalede özellikle .Net çalıştırılabilir dosyalarının (EXE) ve sınıf kütüphanelerinin (DLL) kodlarının ne kadar açık seçik erişilebilir olduğunu ve kod karıştırıcı kullanarak kodların nasıl anlaşılamaz hale getirilebileceğini inceleyeceğiz.
Öncelikle basit bir Windows Forms uygulaması hazırlayalım.
public partial class FormObfuscationTestMain : Form { public FormObfuscationTestMain() { InitializeComponent(); ClsTest ct = new ClsTest(); ct.Min = -98; ct.Max = 165; this.Text = "Ortalama= " + ct.Avg.ToString(); } } internal class ClsTest { private String strTest = "deneme"; private DateTime dtBaslangicTarihi; public Boolean BirOzellik { get; set; } public int Min; public int Max; public Double Avg { get { return (Min + Max) / 2; } } }
Kodda ClsTest
isimli sınıfta kasıtlı olarak değişik tipte değişkenler ve property'ler tanımlayarak bunları çeşitli şekillerde kullandık.
Şimdi derleyerek elde ettiğimiz EXE'yi Lutz Roeder tarafından geliştirilmiş Reflector isimli programı kullanarak demonte (disassemble) edelim. Programı http://www.red-gate.com/products/reflector/ adresinden ücretsiz olarak indirebilirsiniz. Demonte sonucunda uygulamamızın sınıf yapısı açık bir şekilde görülebiliyor.
Şimdi ClsTest sınıfı üzerinde sağ tuş yaparak Disassemble komutunu verelim ve sağ kenarda açılan bölümde bu sınıfın kodunun açıkça görelim.
Resimlerde görüldüğü gibi kodu eksiksiz bir biçimde, tüm değişken ve belirteç (identifier) adları aynı kalmış olarak ortaya çıkartmak çok kolay; daha gelişmiş araçlar kullanarak uygulamanın tüm kodunu eksiksiz bir şekilde elde etmek de mümkün. Yani biz her ne kadar derleme işlemine tabi tutarak EXE üretiyorsak da bu EXE'ler (ve tabi DLL'ler) makina koduna değil CLR tarafından işletilmek üzere ara koda (intermediate code) dönüştürülüyor.
Sıra geldi kod karıştırma yöntemiyle yazdığımız kodun daha doğrusu algoritmamızın gizlenmesine. Bu işlem için piyasada çok çeşitli araçlar mevcut. Birkaçının ismini vermek gerekirse:
Bu makalede {smartassembly} kullanarak kod karıştırma işlemini örnekleyeceğiz. Aşağıda {smartassembly}'nin karıştırılacak uygulama ve oluşacak yeni exe'nin adresi seçilmiş ana ekranını görüyoruz.
{smartassembly} kod karıştırmayla ilgili olarak oldukça fazla seçenek sunuyor ve her bir seçenekte de kod karmaşıklığıyla ilgili ayrıntılı seçimler bulunuyor. Bunlardan kısaca bahsetmek gerekirse:
- Dependencies Merging: Karıştırmak istediğimiz assembly'nin bağımlı olduğu diğer assembly'lerin ana assembly gövdesine dahil edilmesidir. Bunun sonucunda hem performans kazancı sağlanıyor hem de kodun karmaşıklığı artarak korunma seviyesi de artmış oluyor.
- Pruning: Yararsız kod bölümlerinin ve metadata bölümlerinin assembly'den kırpılması işlemidir.
- Obfuscation: {smartassembly}nin özellikle ilgilendiğimiz bölümü.
- Control Flow Obfuscation: Kodun akışının daha da karmaşık hale getirilmesidir. Yani bir çeşit
spagetti-kod haline çevrilmesidir. Kod boyutunda bir miktar artmaya neden olmakla birlikte kodun karmaşıklık derecesini yükselten bir işlemdir. - Strings Encoding: Kod içinde açık olarak yazılmış string ifadelerin (parolalar, SQL ifadeleri, seri numaraları vs.) şifrelenmesidir. Çalışma anında bu stringlerin gerçek değeri çözümlenerek işlem yapılmaktadır.
- Other Protections: {smartassembly} karıştırılmak istenen assembly'ye anlamsız metadata bölümleri ekleyerek daha da anlaşılmaz hale getirebilmektedir. Ayrıca Microsoft'un IL disassembler'inin de çalışmasını bozacak kodlar ekleyebilmektedir.
- Unhandled Exceptions: Yazılımcı tarafından yakalanmamış istisnaları yakalayan ve raporlayan bir kod bölümünü assembly'ye ekler.
- Other Optimizations: Alt sınıf türetilmeyen tüm sınıfların sealed olarak işaretlenmesi gibi ekstra seçenekler.
Şimdi en temel seçeneklerle, sadece obfuscation bölümünü kullanarak örnek uygulamamızın kodunu nasıl ve ne kadar karıştırabildiğimizi görelim.
Seçtiğimiz seçenekler ile her tür isimlendirmenin ekranda görüntülenmesi sorunlu olan Unicode karakterler ile gelişmiş teknikler kullanılarak yapılmasını istedik. Ayrıca, mümkün olan her koşulda farklı türdeki öğelere aynı isimlerin verilmesini istedik. Böylece kod iyice karışmış olacak.
Control Flow Obfuscation bölümünden de en güçlü karıştırma seçeneğini seçtik. Diğer ayrıntılarla fazla ilgilenmeden karıştırma işlemini yapalım ve sonucunu Reflector programıyla görmeye çalışalım.
Sol bölümde sınıf ağacından sınıf ve metod isimlerini anlamak imkansız. Denemeler yaparak ClsTest sınıfını buldum ve kodunu görmeye çalıştım. Görüldüğü üzere field ve property'lerin isimleri belli olmuyor. Bazıları ise nedense aynen duruyor. Belki de daha ayrıntılı ayarlamalar yapmamız lazım. Avg isimli property'nin get bölümünün görüntülenemediğine dikkat edin. Orada "bu kısım karıştırılmıştır ve çevrilememektedir" yazıyor. Elbette ki orada bir kod bloğu var, başka disassembler'lar kullanarak denenebilir ve ayrıntıları incelenebilir.
Sonuç ve Değerlendirme
.Net ortamında geliştirdiğimiz ticari uygulamalarımızın kodunu koruma altına almanın etkili bir yöntemi olan Kod Karıştırmayı (obfuscation) bir örnek üzerinde incelemeye çalıştık. Basit bir uygulama için kod karıştırma sorunsuzca yapılabilmekte. Kod karıştırma sonucunda üretilen Exe'yi çalıştırıp denedim, bir sorun olmadı. Ancak, kod karıştırmanın çeşitli yan etkileri de olabiliyor. Bunlardan bu makalede bahsetmeyeceğim, oldukça ayrıntılı anlatmak gerekir. Ancak .Net'in Reflection yeteneğinin yoğun olarak uygulandığı projelerde property ve metod'lara verilen Attribute'lar içerisinde String olarak belirtilen bazı bilgilerin kod karıştırmadan olumsuz etkilendiğini kısaca söylemiş olayım. Elbette ki buna tedbir alınabiliyor, özellikle bu tür teknik ve üçüncü parti araçlar kullanıyorsanız obfuscation'dan nasıl etkilendiğini öğrenmeniz yararlı olacaktır. Her build'in müşteriye dağıtılmadan önce kod karıştırmaya tabi tutulması manuel olarak yapıldığında epeyce zahmetli. Bunun için otomasyon yöntemleri kullanılması da gerekebilir. Kod karıştırma için kullandığımız {smartassembly} oldukça ayrıntılı seçenekleri ve gelişmiş özellikleri ile son derece etkili bir araç. Elbette diğer araçları da gerçek uygulamalar üzerinde deneyip ihtiyaçlarımıza uygun olan birini kullanmak gerekiyor.
- 30941 okunma
Yorumlar
21 yorumşimdi bu program exe dosyasının içindeki kodları anlaşılıcak bir biçimde çeviriyormu
Reflector vb. çeşitli programlar ile .Net assembly'leri anlaşılır olarak Dissambly edilebilir. Zaten obfuscation'ın amacı da bu tür faaliyetleri mümkün olduğunca zorlaştırmaktır.
Merhaba. Makale için teşekkürler. Fakat ben masaüstünden ziyade web üzerine projeler üretiyorum. Bu yöntemlerin bunun içinde işe yaraması mümkün mü?
Uğur, ASP.NET bile olsa işi yapan kodlar sunucuya DLL şeklinde derlenmiş halde yüklenebilir. Bu DLL'ler halindeki assembly'ler için de kod karıştırma elbette uygulanabilir. ANCAK; eski asp'ciler gibi işi yapan kodları da ASPX dosyalarına gömmek gibi bir alışkanlık varsa bu dediğim yöntem tabi ki geçerli olmayacaktır; bunu da hatırlatmış olayım.
Merhaba, Makale için teşekkürler 14 günlük deneme süresi içinde derleyip müşterimize verdiğimizde derlenmiş kodları denemesüresi bttiğinde müşteriye verdiğim kodlar çalışırmı ?? Teşekkürler
14 günlük deneme süresi programın deneme süresidir muhtemelen. Yani, 14 gün sonra kod karıştırma uyguladığınız EXE'nizin işlevini yitirmesi gibi birşey olacağını pek sanmıyorum. Ama 14 günden sonra programınızda düzeltme yapıp müşteriye tekrar EXE vermek zorunda kalmayacak mısınız? Geçici çözümlerle uğraşmayın bence. Piyasada, çok güçlü karıştırma yapmasa ücretsiz kod karıştırıcılar bulunabilir diye tahmin ediyorum, ismen hatırlamamakla birlikte araştırmalarım sırasında rastlamıştım.
Yazdıklarınızı ilgiyle okudum.
Çok teşekkür ederim uğraş verdiğiniz için...
smartassembly ile wm 6.5 da çalışan exe lerde de kod karıştırma yapılabiliyor mu
Güzel soru. Hiç denemedim. İlk bakışta dot net framwork (yani Compact Framewrok) üzerinde çalışan exe üretilmiş olduğu için olabilir gibi geliyor ama denemek lazım.
Program, kodları karıştırırken sanırım belli bir mantıkta şifreliyor, bu kod karıştırma işleminden sonra karıştırılan exe'yi ilk haline döndürmek {smartassembly} programını yapan kişiler tarafından mümkün müdür?
Hayır çünkü kodlar gerçek işleyişte sonucu etkilemeyecek şekilde değiştiriliyor, karmakarışık ediliyor, sırf karışıklık olması için araya gereksiz birtakım kodlar ekleniyor, değişken, class, metod vb. isimleri değiştiriliyor. Bunların tekrar önceki haline dönmesinin söz konusu olabileceğini sanmıyorum. Hattâ bundan eminim.
smartassembly ile wm 6.5 da çalışan exe lerde de kod karıştırma yapılıp yapılmadığını denedim ama ben başaramadım. Microsoft.VisualBasic.dll istiyor. yolu gösteriyorum ama sonuç yok. bu konuda yardımcı olur musunuz?
Bu DLL'i GAC'a kopyalamayı dener misin? Yani C:\WINDOWS\assembly klasörüne. Sonra tekrar Smartassembly'yi dene bakalım olacak mı?
Meraba ben bu smart assemblyde çok saçma bir şeye rastladım. Şimdi smart assembly programı pcmde kurulu. Exemi obfuscate ettim. Sonra reflectorde denedim. Çok güzel kodların büyük bir kısmı anlaşılmıyor çok sevindim. Sonra smart assembly programını kaldırdım kendi yazdığım programı tekrar çalıltırdım. Smart assemblynin yüklü olması gerekir gibi saçma bir mesaj aldım sonra program kapandı. Şimdi ben programı müşteriye verdiğimde smart assemblyi de mi kur diyecem? Yoksa bunun bir çözümü var mı cevabınız için teşekkürler. İşte hata mesajı:This application has been built with evaluation version of smart assembly, and therefore connot be distributed. You can install smart assembly on this computer tobe able to run this applcation.This application will now quit.
SmartAssembly'nin deneme sürümünü kullandığın için bu durum oluşmuş, mesajda öyle diyor.Tam sürüm kullanırsan tabi ki dediğin gibi müşteride smartassembly kurulu olması gerekmeyecek.
Değerli kardeşim smartasm nin sen deneme sürümünü kullandıgın icin o hatayı allıyorsun.Full sürümünü kullandıgın zaman sorun ortadasn kalkacaktır.
Merhabalar. Makaleniz çok güzel ve açıklayıcı olmuş. Bende smartassembly kullanacak exe mi şifreledim sorun çıkarmadı ama exe yi çalıştırdığımda hiç birşey yapmıyor. Boşa tıklamış gibi oluyor. sorun neden olabilir acaba?
Merhabalar. Makaleniz çok güzel ve açıklayıcı olmuş. Bende smartassembly kullanacak exe mi şifreledim sorun çıkarmadı ama exe yi çalıştırdığımda hiç birşey yapmıyor. Boşa tıklamış gibi oluyor. sorun neden olabilir acaba?
Merhabalar. Makaleniz çok güzel ve açıklayıcı olmuş. Bende smartassembly kullanacak exe mi şifreledim sorun çıkarmadı ama exe yi çalıştırdığımda hiç birşey yapmıyor. Boşa tıklamış gibi oluyor. sorun neden olabilir acaba?
Hocam ben Microsoft Visual Studio 2008 kullanarak bir visual basic programı yaptım.Programı da derleyerek .exe dosyası haline çevirdim.Program sadece bir .exe dosyasından ibaret.Ben şimdi bu programı satmak istiyorum.Baya alıcısı çıkacağına eminim.Yalnız programı kopyalamaya karşı nasıl koruyacağımı bi türlü bulamadım.Kendi işyerimdeki bilgisayarda basit bir önlem aldım.Program açılışta windows klasörü içindeki bir .txt dosyasını açıyo ve içindeki veriyi okuyo.Eğer doğruysa çalışıyo.Bu yüzden o bilgisayardan alıp başka bilgisayarda çalıştırınca çalışmıyo.text dosyasının da belli konuma kopyalanması gerekiyo.Şimdi ben bu programı nasıl satabilirim.Birincisi yazdığım programın .exe dosyasındaki kodu birileri çözebilir mi?Bunu nasıl engelleyebilirim?İkincisi sattığım kişinin başkasına verdiğinde çalışmasını nasıl engelleyebilirim?
Üstad selam,makaleni okudum çok beğendim ellerine sağlık, ancak sormak isteğim bir şey var? makalende bahsettiğin programların ikiside aynı üreticinin.Bu durumda bu üretici yarın Reflector' ün daha iyi olduğunu haline geldiğini söyleyip , sürümünde Smart Assembly güvenliğini aşamaz mı ? Nasıl güvenebiliriz. İyi çalışmalar.
Yeni yorum gönder