C# ile geliştirilen Windows Forms uygulamaları (.NET Framework veya .NET tabanlı), derlendikten sonra doğrudan makine koduna dönüşmez. Bunun yerine Microsoft Intermediate Language (MSIL/IL) adı verilen ara dile çevrilir. Bu sayede uygulamalar farklı platformlarda çalıştırılabilirken, aynı zamanda decompile edilmeleri de oldukça kolay hale gelir. dnSpy, ILSpy veya dotPeek gibi araçlarla bir .NET uygulamasının sınıfları, metotları ve hatta lisans kontrol mekanizmaları büyük ölçüde okunabilir.
Özellikle ticari masaüstü yazılımlar geliştiren geliştiriciler için bu durum ciddi bir güvenlik riskidir. Lisans algoritmaları, API anahtarları, özel iş kuralları ve ticari sır niteliğindeki kodlar kötü niyetli kişiler tarafından analiz edilebilir. Bu nedenle .NET uygulamalarında yalnızca lisans sistemi oluşturmak yeterli değildir. Aynı zamanda uygulamanın kaynak yapısını mümkün olduğunca okunamaz hale getirmek gerekir.
Bu rehberde, C# WinForms uygulamalarını Obfuscar kullanarak güvenli hale getirme sürecini baştan sona anlatacağız. Ayrıca kurulum sırasında karşılaşılabilecek hatalar, doğru yapılandırma dosyası, dağıtıma çıkmadan önce yapılması gerekenler ve profesyonel güvenlik önerileri de yer almaktadır.
Obfuscar Nedir?
Obfuscar, .NET uygulamalarında kullanılan ücretsiz ve açık kaynak kodlu bir obfuscation aracıdır. Obfuscation işlemi; uygulamanın çalışmasını bozmadan sınıf, metot, alan ve diğer üyelerin isimlerini anlamsız hale getirerek kodun analiz edilmesini zorlaştırır.
Örneğin normalde aşağıdaki gibi görünen bir sınıf:
public class LicenseManager { public bool CheckLicense() { ... } }
Obfuscation sonrasında aşağıdakine benzer bir yapıya dönüşebilir:
internal class a { internal bool b() { ... } }
Böylece dnSpy ile uygulama açıldığında kodun hangi bölümünün lisans kontrolü yaptığı ilk bakışta anlaşılmaz.
Neden Kod Koruması Yapılmalıdır?
Birçok geliştirici uygulamasını derledikten sonra güvenli olduğunu düşünmektedir. Ancak .NET uygulamalarında durum tam tersidir.
Koruma yapılmadığında;
- Lisans algoritmaları kolayca bulunabilir.
- Sunucu adresleri görülebilir.
- API anahtarları okunabilir.
- Metot isimleri analiz edilebilir.
- Uygulama patch edilerek lisans kontrolü devre dışı bırakılabilir.
Obfuscation bu saldırıları tamamen engellemez ancak saldırganın işini ciddi ölçüde zorlaştırır.
Obfuscar Kurulumu
İlk olarak bilgisayarda .NET SDK kurulu olmalıdır. Daha sonra Komut İstemi açılarak aşağıdaki komut çalıştırılır.
dotnet tool install --global Obfuscar.GlobalTool
Kurulum tamamlandıktan sonra araç aşağıdaki komut ile çalıştırılabilir.
obfuscar.console
Yeni sürümlerde komut adı obfuscar değil obfuscar.console olarak kullanılmaktadır.
Obfuscar XML Dosyası Nasıl Hazırlanır?
Projenizin bulunduğu klasöre obfuscar.xml isimli bir dosya oluşturmanız gerekir.
Temel yapı aşağıdaki gibidir.
<?xml version="1.0" encoding="utf-8"?>
<Obfuscator>
<!-- Derlenmiş (Release) dosyalarının bulunduğu klasör -->
<Var name="InPath" value="bin\Release" />
<!-- Korunan dosyaların oluşturulacağı klasör -->
<Var name="OutPath" value="bin\Protected" />
<!-- .NET Framework DLL'lerini bulabilmesi için -->
<AssemblySearchPath path="C:\Windows\Microsoft.NET\Framework\v4.0.30319" />
<!-- Projenizde kullanılan DLL dosyalarının bulunduğu klasör -->
<AssemblySearchPath path="bin\Release" />
<!-- Korunacak ana uygulama (EXE)
Program.exe kısmını kendi EXE adınızla değiştirin. -->
<Module file="$(InPath)\Program.exe" />
<!-- Metot isimlerini rastgele değiştir -->
<Var name="RenameMethods" value="true" />
<!-- Sınıf içerisindeki değişken (Field) isimlerini değiştir -->
<Var name="RenameFields" value="true" />
<!-- Event isimlerini değiştir -->
<Var name="RenameEvents" value="true" />
<!-- WinForms Designer sorun yaşamaması için Property isimlerini değiştirme -->
<Var name="RenameProperties" value="false" />
<!-- Public üyeleri koruyarak uygulamanın bozulmasını önle -->
<Var name="KeepPublicApi" value="true" />
<!-- Private üyeleri gizle -->
<Var name="HidePrivateApi" value="true" />
<!-- String ifadeleri şifrele -->
<Var name="StringEncryption" value="true" />
<!-- Kod akışını karmaşıklaştırarak okunmasını zorlaştır -->
<Var name="ControlFlow" value="true" />
<!-- ILDASM ile açılmasını zorlaştır -->
<Var name="SuppressIldasm" value="true" />
<!-- Settings, Resources vb. dosyaları koruma dışında bırak -->
<SkipType name="*.Properties.*" />
<!-- WinForms formlarını koruma dışında bırak -->
<SkipType name="*.Form*" />
<!-- Ana formu koruma dışında bırak -->
<SkipType name="*.MainForm" />
</Obfuscator>
Daha gelişmiş kullanımda ise String Encryption, Control Flow, Rename Methods ve Assembly Search Path gibi ayarlar da eklenebilir.
Obfuscation İşlemini Çalıştırma
Release modunda derleme aldıktan sonra CMD üzerinden proje klasörüne geçilir.
cd /d "D:\Projeler\OrnekProje"
Daha sonra aşağıdaki komut çalıştırılır.
obfuscar.console obfuscar.xml
İşlem başarılı olursa Protected klasörü içerisinde korunmuş EXE dosyası oluşacaktır.
Dağıtıma Çıkmadan Önce Yapılması Gerekenler
Birçok geliştiricinin yaptığı en büyük hata yalnızca Protected klasöründeki EXE dosyasını dağıtmaktır.
Doğru yöntem şu şekildedir:
- Protected klasöründeki obfuscate edilmiş EXE kullanılmalıdır.
- Release klasöründeki DLL dosyaları Protected klasörüne kopyalanmalıdır.
- Config dosyaları Release klasöründen alınmalıdır.
- Mapping.txt dosyası dağıtıma dahil edilmemelidir.
- Debug klasöründeki hiçbir dosya kullanılmamalıdır.
| Dosya | Kaynak |
|---|---|
| Program.exe | Protected |
| DLL Dosyaları | Release |
| Config Dosyaları | Release |
| Mapping.txt | Dağıtıma Dahil Edilmez |
Profesyonel Güvenlik Önerileri
Lisans Kodlarını Ayrı Bir DLL İçerisinde Tutun
Lisans algoritmasını doğrudan ana EXE içerisinde bulundurmak yerine ayrı bir Class Library projesine taşımanız daha güvenli olacaktır.
Public Yerine Internal Kullanmayı Tercih Edin
Obfuscation araçları public API'leri korumaya çalışır. Bu nedenle dışarıya açılması gerekmeyen sınıf ve metotlarda internal erişim belirleyicisini kullanmak daha etkili sonuç verir.
String Sabitlerini Kod İçinde Tutmayın
API anahtarları, lisans anahtarları veya kritik URL'leri doğrudan kod içerisine yazmak yerine mümkün olduğunca sunucu tarafında saklayın.
Sunucu Doğrulaması Kullanın
Gerçek lisans doğrulaması mümkün olduğunca istemci tarafında değil, sunucu tarafında gerçekleştirilmelidir.
Sık Sorulan Sorular
Obfuscar kodları tamamen gizler mi?
Hayır. Hiçbir obfuscation aracı %100 koruma sağlamaz. Ancak kodun okunmasını ve değiştirilmesini ciddi ölçüde zorlaştırır.
DLL dosyaları da obfuscate edilmeli mi?
Kendi geliştirdiğiniz kritik DLL'ler obfuscate edilebilir. Ancak üçüncü parti kütüphanelerin obfuscate edilmesi önerilmez.
Debug dosyaları dağıtıma dahil edilmeli mi?
Hayır. Dağıtıma yalnızca Release klasöründeki dosyalar kullanılmalıdır.
Mapping.txt dosyası silinmeli mi?
Evet. Mapping.txt yalnızca geliştirici içindir. Son kullanıcıya gönderilmemelidir.
Obfuscar ücretsiz mi?
Evet. Obfuscar açık kaynak kodlu ve ücretsiz olarak kullanılabilen popüler .NET obfuscation araçlarından biridir.


Yorum Yap