2012-10-27 18 views
16

Olası Çoğalt:
hiding strings in Obfuscated codeGizleme: java kodlanmış değerleri gizlemek

Ben zor koda için yapmak benim app bazı statik Strings sırayla biraz saklamaya çalışıyorum Bu şekilde şifreleme algoritmaları gibi sabitler, gizlenmiş kodda bulmak zorlaşır.

gibi şeyler kabul ettik:

String CONCAT= "concat"+"string"; 
String RAW_STRING= "raw_string"; 
String FROM_BYTES=new String("from_bytes".getBytes()); 
String FROM_CHARS=new String(new char[]{'f','r','o','m','_','c','h','a','r','s'}); 
String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50}); 

Ve son iki seçenekten ham seçeneği daha "karanlık" olarak görünüyor ama bu yapmak için daha iyi yollar vardır düşünün.

Bunu nasıl geliştirebilirim? Teşekkür

+1

Android için hiç programlanmamıştım, ancak sorunun ne olduğunu göremiyorum. Eğer kullanıcı nasıl derleneceğini bilmiyorsa, kodu sadece Not Defteri'nden okuyabiliyorsunuz, sadece bazı kullanılmayan algoritma isimleri koyuyorsunuz ve hangisinin gerçekten dahil olduğunu bilmeyecek. Eğer nasıl derleneceğini bilirse, kütüphane çağrısını değiştirmeyi engelleyebilecek bir sakınca yoktur (sanırım şifreli bir metod adıyla iyi bilinen bir kütüphane kullanırsınız). out.println. – ignis

+0

Basit gradle işlevi kullanarak bu tür dizeleri saklıyorum. Sadece çıplak gözle korur, ama her halükârda iyidir: https://gist.github.com/shomeser/68f4fe360be0edac95e4 –

cevap

9

İlk olarak, sadece

String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50}); 

Char dizisi aslında bir dize olduğunu ölü vermek-uzakta yazma olmamalıdır.

Sen aşağıdakilerden bir arada yapabileceği

:

  1. veya daha da iyisi, birkaç int diziler içine
  2. hesapla sizin Dize kırmak int [] dizi içinde "String" koymak/manipüle Uygulamanın çeşitli aşamasında dizinin değerleri, bu nedenle değeri sadece bir çalışma zamanı sırasında belirli bir aralıkta geçerli olacak, bu kod (
  3. dizileri/kaynak kodları ayrıştırılarak meraklı bir bakışta deşifre edilmeyeceğini garanti eder yerel değişkenler aracılığıyla ileri geri k değişkenleri için k, nihayet dizileri String yapıcısına iletilecek tek bir diziye dönüştürmeden önce, derhal String'i kullanıldıktan sonra null değerine ayarlayın, sadece gerçek String'in çalışma zamanında varolduğu süreyi kısaltmak için
+0

# 3 için herhangi bir desen veya örnek kod? # 5 nasıl yardımcı olur? – Nicholas

+0

# 5, birisinin kodunuzu koda dönüştürebiliyor olması, bunun da bunları çalıştırabileceği, hata ayıklayıcı bayraklarını yerlere vb. Ekleyebileceği anlamına gelir. Bu nedenle, çalışma zamanı denetimlerine de karşı koruma sağlamalısınız. Bu, gerçek String'inizin daha az zamanının, meraklı gözlerden daha güvenli olduğu anlamına gelir. # 3 için – Kai

+0

, ben bu kadar kendim gitmedim, ama sen deneyebilirsiniz [this] (http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/658ab629-e603-4e6f- 985c-2bb8c1669b27 /) _or_, dizelerinizi bayt dizilerine "zip etmek" için "jzlib" (http://www.jcraft.com/jzlib/) gibi bir şey kullanın ve gerektiğinde bunları çıkartın. Android'in zip lib'sini kullanmayın çünkü metod isimleri gizlenemez ve tüm işletmeyi oldukça açık hale getirir. – Kai

2

Ben uncrypt gerçekten iyi bir şifre çözme algo veya biraz daha zayıf bir base64 decode nerede olabilir şey

class ... 
    String CONCAT; 

    static { 
    CONCAT = uncrypt ("ahgsdhagcf"); 
    } 

gibi algo bir şifre çözme kullanarak statik (sınıfı) in başlatıcısı değerini ayarlamak için tercih ediyorum .

Her durumda ilk önce dizenizi kodlamak için basit bir programa ihtiyacınız vardır.