C ++ uygulama kodunu gizlemek önemli mi?


11

Java dünyasında, bazen bir sorun gibi görünüyor, ama, C ++ ne olacak? Farklı çözümler var mı?

Birisi belirli bir işletim sisteminin C ++ kitaplığı aynı kitaplığın farklı bir sürümüyle değiştirebilir, ama kodumu ne yaptığını anlamak için hata ayıklama simgeleriyle dolu olduğunu düşünüyordum. Standart veya popüler kütüphaneleri kullanmak iyi bir şey midir?

Bu aynı zamanda Windows altında bazı dll kütüphanesi ile o kütüphanenin "hata ayıklama sürümü" ile değiştirilebilir. Statik derlemeyi tercih etmek daha mı iyi? Ticari uygulamalarda, uygulamalarının çekirdeği için her şeyi statik olarak derlediklerini ve çoğunlukla dll'lerin (genel olarak dinamik kütüphaneler) korsanlığa karşı çözümler gibi bazı üçüncü taraf teknolojilerini sunmak için kullanıldığını görüyorum (bunu birçok oyunda görüyorum) ), GUI kitaplığı (Qt gibi), OS kitaplıkları vb.

Statik derleme Java dünyasındaki gizlemeye eşdeğer midir? Daha iyi bir ifadeyle, kodunuzu korumak için en iyi ve en uygun fiyatlı çözüm mü?


4
Unutmayın, ne yaparsanız yapın, çok fazla zamanı olan biri deobfuscate / decompile edebilecektir
Zavior

13
Birçok derleyici bir /Ogizleme anahtarıyla birlikte gelir . Hatta bazılarında birden fazla gizleme seviyesi vardır /O3;)
MSalters

@MSalters No, g ++ vardır -O3;)
BЈовић

@Zavior Veya sadece tersine mühendislikle, sade ve basit. İkilinin kendisini bile gerektirmez, sadece yazılımın kapsamlı bir analizini yapar.
John Weisz

Yanıtlar:


28

Savaşları Kaybetmek İçin Zamanınızı Boşa harcamayın

C ++ ve diğer diller için birçok benzer cevapta belirtildiği gibi, bu çoğunlukla işe yaramaz .

Daha fazla okuma

Konuyla ilgili seçilmiş okumalar (tümü C ++ 'a özgü değildir, ancak genel ilkeler geçerlidir):

StackExchange Yanıtları

kâğıtlar

Şaşkınlıkla İlgili Ünlü Alıntılar:

Son olarak, kod gizliliği sorunu var. Bu kayıp bir nedendir. Kararlı bir hacker'ın programınızı anlamasını engelleyecek bir dönüşüm yoktur. Bu, tüm dillerdeki tüm programlar için doğrudur, JavaScript ile daha açık bir şekilde doğrudur, çünkü kaynak formda sunulur. Gizlemenin sağladığı gizlilik yararı bir yanılsamadır. Kullanıcıların programlarınızı görmesini istemiyorsanız sunucunuzun fişini çekin. - Douglas Crockford


Asla?

Asla gizlememeniz gerektiğini ve bunun iyi bir nedeni olmadığını söylemiyorum, ama çoğu durumda buna olan ihtiyacı ve maliyet etkinliğini ciddi olarak sorgularım.

Ayrıca, şaşırtmanın fiili bir gereklilik olduğu durumlar da vardır. Örneğin, virüs yazarsanız, açıkça gizleme (ve tercihen dinamik bir virüs) programınızın hayatta kalması için çoğaltma yeteneği kadar iyi bir şeydir. Ancak, bu pek yaygın bir durum değildir ...


Bir zamanlar tüm dongle fonksiyon çağrılarını engellemeye yönelik bir lisanslama gereksinimi olan bir donanım dongle'ı kullandık - ve bunu yapmak için bir araç sağladılar. Her zaman beni 'korumalarının' kalitesi konusunda biraz şüpheli hale getirdim!
Martin Beckett

@MartinBeckett: gerçekten biraz tuhaf.
haylem

3

Hayır, bu çabaya değmez ve bence tamamen gereksiz. Aradığınız işlevler sağladığınız işlevle tahmin edilebilir.

Java için gizleme araçlarının var olmasının nedeni, Java bayt kodu ile Java kaynak kodu arasındaki eşlemenin oldukça iyi tanımlanmış olması ve tüm işlevlerin ve üye değişkenlerin adlarının bayt kodunda depolanmasıdır (genel, özel veya korumalı olmalarına bakılmaksızın) ) böylece bir Java bayt kodu yorumlayıcısı, orijinal kaynağın yapısını belirsiz bir kaynak için oldukça iyi gösteren bazı genel Java sunabilir.

C ++ doğrudan makine diline derlenir. Demonte edilebilir, ancak montaj dili ile başa çıkmak oldukça sıkıcıdır. Ayrıştırma, optimizatörlerin derleme sırasında koda yaptığı tüm değişiklikler nedeniyle çok daha hilelidir.


0

Bunu düşünürken, birkaç farklı gizleme türü vardır. Tam bir zaman kaybı olan kaynak kodunun gizlenmesiyle başlayalım; Onsuz anlamak yeterince zor! Bunun yerine, teslimat paketinin gizlenmesine, kodun kullanıcıya nasıl teslim edildiğine odaklanalım.

Küçük gizleme

Sıradan kullanıcının parmaklarını içeri sokmasını ve bir şeyleri kolayca kırmasını önlemek için küçük bir gizleme vardır. Kararlı bir hacker'ı dışarıda tutmaz, ancak desteklemeniz istenen şeylerin gerçekte sunduğunuz şey olduğundan emin olmanıza yardımcı olur. Bu tür şeyler için gereken koruma seviyesi gerçekten oldukça düşüktür; teslimat paketi sadece okunabilir ve düzenlenebilir görünmemelidir (uzman araçlar olmadan) ve bu yeterince iyi.

Javascript minimizasyonu buna bir örnektir, ancak bu şekilde pazarlanmamıştır. Doğru akıllarında olan hiç kimse, yeterince kararlı / kalıcı olsanız bile teknik olarak mümkün olsa bile, küçültülmüş bir JS dosyasını okumak ve düzenlemek istemez.

Benzer şekilde Java uygulamalarının sunulmasıyla. Kodu sadece yürütülebilir bir JAR'a paketlemek, bir şehir parkındaki kibar bir “Lütfen Çimen Tutun” işaretinin tüm gücüne sahip olmasına rağmen aptallığın çoğunu durduracaktır.

C ++ kodu teslim edilirken bile, gereksiz sembollerin yürütülebilir dosyadan çıkarılması küçük gizleme olarak nitelendirilmek için yeterli olacaktır. Anahtar, sonucu bir kullanıcı olarak okumak gariptir , ancak bir bilgisayar olarak yürütmek için bir sorun değildir.

Majör şaşkınlık

Büyük gizlilik kararlı ve bilgili kullanıcıyı dışarıda tutmaktır . Aynı zamanda bir toplam kaybetme oyunu; bir bilgisayar onu çalıştırabilirse, bir kişi onu parçalara ayırabilir ve ne yaptığını çözebilir. Size en yakın programın sürekli olarak şifresini çözmek ve bir seferde yaptığı şeyi başka bir zamanda yaptığı tamamen farklı bir şeye dönüştürmek olacaktır. Böyle bir şey oluşturmak oldukça zor olurdu ve yine de gerçekten iyi bir hacker'ı dışarıda tutmayacaktı (yine de, tüm bu kendini değiştiren kodun şifresini çözmek için gereken çaba miktarıyla sonuna kadar gerçekten çapraz olacaklar).

Diğer çözümler açısından düşünmek daha iyidir. Örneğin, kodun “taç mücevherlerini” kontrol ettiğiniz sunucularda tutabilir ve yalnızca servis çağrılarına izin verebilir, bu da müşteriyi değerli parçaların ön ucu olan ücretsiz bir hediye haline getirebilirsiniz. Ya da daha fazla sözleşme / yasal rotaya gidebilir ve yürütülebilir kodları yalnızca kodunuzun içinde poke etmemeyi resmi olarak kabul eden veya bunu yaparlarsa sizi telafi etmeyi kabul eden kuruluşlara devredebilirsiniz (bu, bir çeşit NDA olacaktır). Amaç, bilgisayar korsanının bilgisayar korsanlığı yapmaması ve kullanıcıların kodu sözleşmeye bağlı olmayan bilgisayar korsanlarından uzak tutması için güçlü bir teşvik yaratmak olacaktır.

Ancak kodunuzun asla kırılamayacağını varsaymamalısınız. Sanallaştırma ile, bir yürütmenin herhangi bir program durumu incelenebilir ve izlenebilir ve bunu yenmeye çalışan herhangi bir şey (örneğin, harici bir zaman kaynağına saat takibi) yasal kullanıcılarda bilgisayar korsanlarına göre sorunlara neden olma olasılığı daha yüksektir. ( Kod, rakiplerinin eline geçtiğinde, çok kararlı bilgi yayıncılarının bile sistemlerini nasıl güvende tutamayacakları için DRM'nin geçmişine bakın .) Aslında yasal kullanıcıları mutlu etmeye odaklanmak çok daha iyi. Ara sıra meydana gelen çatlaklardan kaynaklanan kayıplar, tatmin edici müşteriler aracılığıyla getirilen ekstra paraya kıyasla hiçbir şey olmayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.