2012-10-27 11 views
16

Powiel możliwe:
hiding strings in Obfuscated codezaciemniania: ukryć wartości jawnie wpisanej w Javie

próbuję ukryć trochę niektóre statyczne Struny mojej aplikacji w celu utrudnić dekompilować w ten sposób, podobnie jak stałe, takie jak algorytmy szyfrowania, nazwy są trudniejsze do znalezienia w zaciemnionym kodzie.

mam uznać takie rzeczy jak:

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

i dwóch ostatnich opcji wydaje się być „ciemniejsza” niż opcja surowego, ale wyobrażam sobie, że są lepsze sposoby na to robi.

Jak mogę to poprawić? Dzięki

+1

Nigdy nie programowałem dla Androida, ale nie widzę sensu pytania. Jeśli użytkownik nie wie, jak przeprowadzić dekompilację, może tylko odczytać kod za pomocą Notatnika, wystarczy podać kilka nieużywanych nazw algorytmów i nie będzie wiedział, który z nich jest naprawdę zaangażowany. Jeśli wie, jak dekompilować, to nie ma zaciemniania, które może uniemożliwić zastąpienie wywołania biblioteki (domyślam się, że używasz dobrze znanej biblioteki z dobrze znaną nazwą metody do utworzenia szyfru) z Systemem. out.println. – ignis

+0

Ukrywam takie struny za pomocą prostej funkcji gradowania. Chroni tylko gołym okiem, ale w każdym razie jest to lepsze niż nic: https://gist.github.com/shomeser/68f4fe360be0edac95e4 –

Odpowiedz

9

Z jednej strony, nie należy po prostu napisać

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

to ślepy wsypa, że ​​tablica char jest rzeczywiście String.

Można zrobić kombinację poniższych:

  1. umieścić swoje "string" w int [] tablicy
  2. lub nawet lepiej, przełamać swój ciąg na kilka int tablic
  3. obliczyć/manipulować wartości tablicy na różnych etapach aplikacji, więc jej wartość stanie się ważna tylko w określonym przedziale czasowym w czasie wykonywania, gwarantując, że nie zostanie odszyfrowana na zaciekawiony rzut oka przez dekompilację kodu
  4. przekazuje tablicę (s) tam iz powrotem, za pomocą zmiennych lokalnych, bac k do zmiennych instancji, itp., zanim ostatecznie konwertuje tablice na pojedynczą tablicę, która ma zostać przekazana do konstruktora String,
  5. natychmiast ustawia String na wartość null po użyciu, aby zmniejszyć ilość czasu istniejącego String w czasie rzeczywistym
+0

Jakieś wzory lub przykładowy kod dla # 3? Jak pomaga # 5? – Nicholas

+0

# 5 pomaga, ponieważ jeśli ktoś może zdekompilować twój kod, oznacza to, że może go uruchomić, umieścić flagi debuggera w miejscach itp. Dlatego też należy chronić się przed inspekcjami wykonawczymi. Oznacza to, że im krótszy jest twój aktualny Łańcuch, tym bezpieczniejsze jest ono od wścibskich oczu. – Kai

+0

dla # 3, nie posunąłem się aż tak daleko, ale możesz spróbować [this] (http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/658ab629-e603-4e6f- 985c-2bb8c1669b27 /) _ lub _ użyj czegoś takiego jak [jzlib] (http://www.jcraft.com/jzlib/), aby "zipować" twoje Struny w tablice bajtowe i rozpakować je w razie potrzeby. Nie używaj lib zip z Androidem, ponieważ jego nazwy metod nie mogą być zaciemniane, przez co całe przedsięwzięcie jest dość oczywiste. – Kai

2

wolałbym, aby ustawić wartość w statycznym (klasa) inicjatora przy użyciu szyfrowania algo Coś

class ... 
    String CONCAT; 

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

gdzie uncrypt może być naprawdę dobry algo unencryption lub nieco słabszy dekodowania base64 .

W każdym razie potrzebny jest prosty program do zakodowania łańcucha znaków.

Powiązane problemy