Her masaüstü uygulaması, geliştiricisinin kontrol etmediği bir makinede çalışır. Başındaki kişi onu duraklatabilir, belleğini inceleyebilir ve istediği kadar yeniden deneyebilir. Ciddi her koruma tasarımı bu tek gerçek üzerine kurulur. İstemci tarafı koruma ile sunucu tarafı sırlar arasındaki tercihin, herhangi bir aracın seçiminden daha önemli olmasının nedeni de budur.
Bu rehberde istemci tarafı korumanın gerçekte neyi başardığını, nerede durduğunu ve string'leri, dosyaları, değişkenleri ve kararları sunucuya taşımanın yazılım kırmanın ekonomisini neden değiştirdiğini anlatıyoruz. Sonunda da bir C++ veya C# ürününe bu hafta uygulayabileceğiniz pratik bir ayrım öneriyoruz.
İstemci tarafı koruma nedir?
İstemci tarafı koruma, uygulamanızın analiz edilmesini, değiştirilmesini ya da düşmanca bir ortamda çalıştırılmasını zorlaştırmak için müşterinin makinesinde çalışan her şeydir. Dağıttığınız binary'nin içinde ya da hemen yanında yer alır.
- Obfuscation ve packing, biri dosyayı açtığında kodun ve string'lerin okunmasını zorlaştırır.
- Anti-debug kontrolleri, process'e bir debugger bağlandığını fark eder.
- Anti-VM kontrolleri, yazılımı yalıtılmış ortamda analiz etmek için sıkça kullanılan sanal makineleri fark eder.
- Bütünlük kontrolleri, bellekteki ya da diskteki kodu dağıttığınız sürümle karşılaştırır; böylece değiştirilmiş bir derleme fark edilebilir.
- Process ve pencere kara listeleri, iyi bilinen analiz araçlarıyla birlikte çalışmayı reddeder.
- Anti-dumping ve bellek koruması, çalışan programın temiz bir kopyasını almayı zorlaştırır.
Bunlar gerçek savunmalardır ve sahip olmaya değer. Birlikte sıradan korsanlığı durdurur, yetenekli saldırganları yavaşlatır ve hazır, otomatik crack araçlarının çoğunu etkisiz bırakır. qPapel Auth'ta anti-dumping rutinleri, bellek koruması ve kurcalamaya karşı sağlamlaştırma yerleşik olarak gelir; anti-VM, bütünlük, CRC32 kontrolleri ve debugger yasakları gibi korumalar da Uzaktan ayarlar üzerinden açılabilir.
İstemci tarafı koruma neyi yapabilir, neyi yapamaz?
İstemci tarafı korumayı dürüstçe değerlendirmenin yolu, onu bir maliyet çarpanı olarak görmektir. Her teknik, bir saldırıya zaman, beceri ve zahmet ekler. Hiçbiri kodun saldırganın makinesinde olduğu gerçeğini değiştirmez; çalışan kod da eninde sonunda incelenebilir.
| Teknik | İyi yaptığı iş | Sınırı |
|---|---|---|
| Obfuscation | Binary'nin okunmasını yavaşlatır | Kod yine de çalışmak zorundadır, bu yüzden gözlemlenebilir |
| Anti-debug | Sıradan canlı incelemeyi durdurur | Kendisi de process'in içindeki bir koddur |
| Bütünlük kontrolleri | Değiştirilmiş derlemeleri fark eder | En iyi, başarısızlığın başka bir yerde sonucu olduğunda çalışır |
| Kara listeler | Bilinen araçları anında engeller | Yalnızca listede olanı yakalar |
| Şifreli string'ler | Değerleri dururken gizler | Bir değer kullanılmadan önce çözülmek zorundadır |
Yalnızca istemci tarafında korunan ürünlerin hikâyesi genellikle aynıdır. Koruma bir süre dayanır, sonunda değiştirilmiş bir derleme ortaya çıkar ve o derleme süresiz olarak çalışmaya devam eder, çünkü ihtiyaç duyduğu hiçbir şey eksik değildir. Savunma sonucu ertelemiş ama değiştirmemiştir.
Bir de emek asimetrisi var. Savunan taraf, her derlemede her kontrolü doğru yapmak zorundadır. Yazılımı analiz eden kişinin ise tek bir açık bulması yeterlidir; çevrimdışı ve kendi temposunda çalışabilir, kimse fark etmeden istediği kadar deneyebilir. İstemci tarafı koruma açıkları daraltır ama makinenin kimin kontrolünde olduğunu değiştiremez.
Sunucu tarafı sırlar yazılım kırmanın ekonomisini neden değiştirir?
Saldırganlar harcayacakları emeği elde edecekleri ödülle tartar. İstemci tarafı koruma bu denklemin emek tarafında çalışır. Sunucu tarafı sırlar ise ödül tarafında çalışır. Uygulamanızın temel bir parçası hiçbir zaman binary'nin içinde dağıtılmıyorsa, değiştirilmiş bir kopya çalışan bir ürün değildir. İşe yarar hâle gelmek için hâlâ geçerli, kimliği doğrulanmış bir oturuma ihtiyaç duyan boş bir kabuktur.
Yalnızca istemcide korunan
- Sırlar ve mantık derlemenin içinde
- Lisans cevabı yerelde belirlenir
- Değiştirilmiş tek kopya herkes için çalışır
- Düzeltmek yeni bir sürüm demektir
Sırları sunucuda tutulan
- String'ler ve dosyalar oturum başına gönderilir
- Lisans cevabı sunucuda belirlenir
- Değiştirilmiş kopya sunucudan veri alamaz
- Değerler yeniden derlemeden değişir
Kırılmış bir derlemeyi paylaşmanın daha az cazip olmasının nedeni de budur. Her kopya yine de sunucunuzla konuşmak zorundadır; her oturum reddedilebilir, işin içindeki her anahtar ve cihaz merkezden yasaklanabilir. Saldırganın harcadığı emek, her şeyin dosyada durduğu senaryodaki gibi katlanarak işe yaramaz.
- Emek başka kopyalara taşınmaz. Yerel bir kontrolü kaldırmak artık çalışan bir ürün ortaya çıkarmaz, çünkü eksik veriler hâlâ sunucudan gelmek zorundadır.
- Her kopya görünür. Her oturum sunucuya bağlanır; bu yüzden bir anahtarın olağan dışı kullanımı sessizce gerçekleşmek yerine panelinizde görünür.
- Yeni sürüm yayınlamadan müdahale edebilirsiniz. Bir anahtarı yasaklamak ya da sunucu tarafındaki bir değeri değiştirmek, bir sonraki kontrolde tüm kopyalar için aynı anda geçerli olur.
Sunucuda neler tutulmalı: string'ler, dosyalar, değişkenler ve kararlar
Her şey taşınamaz, her şeyin taşınması da gerekmez. Ölçüt basittir: Bir değer ya da dosya sızsaydı değiştirilmiş bir derleme daha kullanışlı hâle gelir miydi? Cevap evetse o değer sunucuya taşınmaya adaydır.
| Sunucu tarafı varlık | Tipik örnekler | Neden işe yarar? |
|---|---|---|
| String'ler | API uç noktaları, offset'ler, yapılandırma sabitleri | Binary'den çıkarılacak işe yarar bir şey kalmaz |
| Dosyalar | Premium modüller, veri paketleri, modeller | Değiştirilmiş derlemenin parçaları eksik kalır |
| Değişkenler | Özellik anahtarları, ince ayar değerleri, limitler | Yeni derleme dağıtmadan değiştirilebilir |
| Kararlar | Anahtar geçerli mi, aktif mi, bu cihaza bağlı mı? | Mantık hiçbir zaman istemcide çalışmaz |
qPapel Auth dördünü de kapsar. SS Strings, hassas değerleri PapelShip sunucularında tutar ve yalnızca kimliği doğrulanmış oturumlara gönderir. SS Files, dosyaları uygulamanızla birlikte paketlemek yerine kimliği doğrulanmış istemcilere sunar. Uzaktan ayarlar, uygulamanızın ayarlarını ve değişkenlerini yeni bir derleme almadan değiştirmenizi sağlar. HWID bağlama dahil lisans kararının kendisi de binary'nizin içindeki bir mantıkla değil, sunucuda verilir.
Sunucu tarafındaki bir sır uygulamanıza nasıl ulaşır?
Sunucu tarafı veriler, ancak izledikleri yol kadar güçlüdür. Kanal okunabiliyor, tekrar oynatılabiliyor ya da taklit edilebiliyorsa sır yalnızca başka bir yere taşınmış olur. Güvenilir bir teslim yolunun vazgeçilmez birkaç özelliği vardır.
01Anahtar değişimi
Yeni bir oturum kurulur
02Lisans anahtarı + donanım kimliği
Şifreli ve imzalı gönderilir
03Sunucu tarafı kontroller
Anahtar, cihaz, yasak durumu, derleme
04String'ler, dosyalar, ayarlar
Yalnızca doğrulanmış bu oturum için
05Sonraki kontroller
Yasaklar ve değişiklikler bir sonrakinde geçerli
- Her seferinde yeni bir oturum. Her oturum bir anahtar değişimiyle başlar; bu yüzden eski bir oturumdan yakalanan trafik daha sonra işe yaramaz. qPapel Auth, her aktif oturum için AES-256 iletişim anahtarlarını yeniler.
- Şifreli ve imzalı mesajlar. Trafiği izleyen biri içeriği okuyamaz; sahte bir yanıt da gerçek kabul edilmez.
- Göndermeden önce kontrol. Sunucu herhangi bir şey göndermeden önce anahtarı, cihazı ve derlemeyi doğrular. qPapel Auth, değiştirilmiş yerel dosyaların sunucu verilerini okumasını engelleyecek şekilde tasarlanmıştır.
- Bellekte kısa ömür. Güvenli string'ler disk izi bırakmadan doğrudan belleğe aktarılabilir. Onları yalnızca ihtiyaç duyduğunuz süre kadar orada tutun.
Daha büyük varlıklarda aynı fikir kodun kendisine de uygulanır. Bellekte yükleme, şifreli DLL'leri diske yazmadan belleğe aktarır; böylece ürününüzün premium kısmı hiçbir zaman müşterinin diskinde bir dosya olarak durmaz.
Sunucu tarafı korumanın bedelleri
Sunucu tarafı sırların da bir bedeli var. Maliyetleri baştan net görmek, onları canlı ortamda keşfetmek yerine tasarımınızda hesaba katmanızı sağlar.
- Bağlantı. Bir özellik sunucu verisine bağlıysa bağlantı gerektirir. Hangi özelliklerin çevrimdışı ve ne kadar süreyle çalışabileceğine bilinçli olarak karar verin.
- Tasarım emeği. Birinin neyin değerli olduğuna karar vermesi ve kodu, o değeri içinde barındırmak yerine isteyecek şekilde yeniden düzenlemesi gerekir.
- Bellekte açıkta kalma. Bir değer, teslim edildikten sonra kullanıldığı süre boyunca process belleğinde durur. Çalışma zamanı izleme ve kısa ömürler bu süreyi daraltır.
- Operasyonel özen. Sunucu tarafındaki bir varlık canlı bir bağımlılıktır. Üzerindeki değişiklikleri bir sürüm yayını gibi ele alın: önce test edin, sonra yayına alın.
Bunlar çözülebilir sorunlardır ve gerçekten işe yarayan korumanın bedelidir. Alternatifi ise en değerli parçaları her müşterinin diskinde bir dosyada duran bir üründür.
Bağlantı için işe yarar bir pratik kural: Ürününüzün çekirdeği kısa kesintileri tolere edebilir, ama onu değerli kılan kısımlar her kullanıldığında sunucuya sormalıdır. Böylece müşteri deneyimi akıcı kalırken sunucuya hiç bağlanmayan bir kopya da önemli kısımları hiçbir zaman alamaz.
Pratik bir ayrım: hangi iş hangi tarafa ait?
Çoğu ürün sonunda benzer bir iş bölümüne ulaşır. İstemci, tehdidin bulunduğu yerde olması gereken işleri yapar. Sunucu ise çalınmaya değer her şeyi tutar ve önemli her kararı verir.
| Sorumluluk | Nerede? | Neden? |
|---|---|---|
| Bu lisans geçerli mi? | Sunucu | Yerel bir cevap değiştirilebilir |
| Hangi özellikler açık? | Sunucu, lisans bazında | Binary'deki bayraklar tersine çevrilebilir |
| API anahtarları ve token'lar | Sunucu, kimlik doğrulamadan sonra | Binary'deki string'ler çıkarılabilir |
| Premium modüller | Sunucu tarafı dosyalar | Binary'deki kod kopyalanabilir |
| Debugger ve VM tespiti | İstemci, sonuçları sunucuda | Tehdidin olduğu yerde çalışması gerekir |
| Bütünlük kontrolleri | İstemci, sunucu tarafından uygulanır | Başarısız bir kontrol sunucu verisini keser |
| Arayüz ve yerleşim | İstemci | Hassas değil |
- 01
Lisans kararını taşıyın
Anahtarları, süre sonunu, yasakları ve cihaz bağlamayı sunucuda doğrulayın. Kararı asla binary'nin tek başına vermesine izin vermeyin.
- 02
En önemli sırlarınızı taşıyın
API anahtarlarını, uç noktaları ve sabitleri sunucu tarafı string'lere taşıyın. .NET için adım adım anlatım için koda gömülü sırlar olmadan C# yazılım lisanslama yazısını okuyun.
- 03
Premium kısımları taşıyın
Modülleri ve veri paketlerini sunucu tarafı dosyalar olarak sunun ya da bellekte yükleyin; böylece değiştirilmiş bir derleme eksik kalır.
- 04
Geriye kalanı sağlamlaştırın
Yerelde kalan kodun analizini yavaşlatmak için anti-debug, anti-VM, bütünlük kontrolleri ve kara listeleri etkinleştirin.
- 05
Çalışma zamanında izleyin
Bilinmeyen araçlar için tespit ekleyin, çünkü statik kara listeler yalnızca bilinenleri yakalar.
Tüm katmanları sırasıyla gösteren eksiksiz tabloyu C++ ve C# için yazılım koruma katmanları rehberimizde bulabilirsiniz. Uzaktan ayarlar yeniden derleme gerektirmediği için ürününüzün neye ihtiyaç duyduğunu öğrendikçe korumayı uzaktan da güncelleyebilirsiniz.
Sıkça sorulan sorular
Önemli olanı, korunabileceği yerde koruyun
İstemci tarafı koruma saldırıları pahalı hâle getirir. Sunucu tarafı sırlar ise onları zahmetine değmez kılar. Binary'nizi inceleyen herkesi yavaşlatmak için ilkini, başarılı bir değişikliğin bile geriye eksik bir ürün bırakmasını sağlamak için ikincisini kullanın.
Küçük başlayın: Bu hafta lisans kararını ve en değerli üç değerinizi taşıyın, gerisini zamanla ekleyin. Her adım, saldırganın istediği bir şeyi onun makinesinden alır ve yeniden sizin kontrolünüze verir.
qPapel Security Team
Lisanslama ve yazılım koruması