2012-10-27 12 views
16

Eventuali duplicati:
hiding strings in Obfuscated codeOffuscamento: nascondere i valori hardcoded in java

sto cercando di nascondere un po 'alcune stringhe statiche di mia app in modo da rendere più difficile decompilare in questo modo, come le costanti come i nomi degli algoritmi di cifratura, è più difficile trovare nel codice offuscato.

Ho considerato le cose come:

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}); 

E le ultime due opzioni sembra essere "più scuro" rispetto all'opzione grezzo ma immagino ci sono modi migliori per fare questo.

Come posso migliorare? Grazie

+1

Non ho mai programmato per Android, tuttavia non riesco a vedere il punto della domanda. Se l'utente non sa come decompilare, è solo in grado di leggere il codice tramite il Blocco note, è sufficiente inserire alcuni nomi di algoritmo inutilizzati e non saprà quale è realmente coinvolto. Se sa come decompilare, non c'è alcuna offuscazione che può impedire a lui/lei di sostituire la chiamata alla libreria (suppongo che tu usi una libreria ben nota con un nome di metodo ben noto per istanziare il codice) con un Sistema. out.println. – ignis

+0

Sto nascondendo questo tipo di stringhe usando la semplice funzione gradle. Protegge solo da occhio nudo, ma in ogni caso, è meglio di niente: https://gist.github.com/shomeser/68f4fe360be0edac95e4 –

risposta

9

Per uno, non si deve solo scrivere

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

E 'un morto give-away che l'array di caratteri è in realtà una stringa.

Si può fare una combinazione dei seguenti:

  1. mettere il vostro "String" in un array int []
  2. o, ancora meglio, rompere il vostro String in più array int
  3. calcolare/manipolare i valori dell'array a vari stadi dell'applicazione, quindi il suo valore diventerà valido solo a un certo intervallo durante un runtime, garantendo che non venga decifrato a una curiosa occhiata decompilando il codice
  4. passa la/e matrice/i avanti e indietro, attraverso variabili locali, bac k per istanze variabili, ecc., prima di convertire definitivamente gli array in un singolo array da passare al costruttore String
  5. imposta immediatamente la stringa su null dopo l'uso, solo per ridurre il tempo di esistenza della stringa effettiva in fase di esecuzione
+0

Qualche modello o codice di esempio per # 3? In che modo # 5 aiuta? – Nicholas

+0

# 5 aiuta perché se qualcuno può decompilare il tuo codice, significa che possono anche eseguirlo, mettere i flag di debugger in posti, ecc. Quindi dovresti fare attenzione anche alle ispezioni di runtime. Ciò significa che minore è il tempo che la tua stringa attuale esiste, più è sicuro da occhi indiscreti. – Kai

+0

per # 3, non sono andato così lontano da solo, ma puoi provare [questo] (http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/658ab629-e603-4e6f- 985c-2bb8c1669b27 /) _o_ utilizza qualcosa come [jzlib] (http://www.jcraft.com/jzlib/) per "comprimere" le tue stringhe in matrici di byte e decomprimerle quando necessario. Non utilizzare la zip zip di Android perché i suoi nomi dei metodi non possono essere offuscati, rendendo l'intera azienda abbastanza ovvia. – Kai

2

io preferirei per impostare il valore nel inizializzatore statico (classe) utilizzando un decrittazione algo Qualcosa di simile

class ... 
    String CONCAT; 

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

dove uncrypt potrebbe essere davvero una buona algo unencryption o un po 'più debole di una decodifica Base64 .

In ogni caso è necessario un semplice programma per codificare prima la stringa.