2012-10-27 4 views
16

가능한 중복 :
hiding strings in Obfuscated code난처 : 자바에서 하드 코드 된 값을 숨길

내가 열심히 디 컴파일 할 수 있도록 내 응용 프로그램의 일부 정적 문자열 위해 조금 숨기기 위해 노력하고있어 , 암호 알고리즘 이름과 같은 상수와 같은이 방법은 난독 화 된 코드에서 찾기가 더 어렵습니다.

는 내가 좋아하는 일을 생각했습니다

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

그리고 마지막 두 옵션 원시 옵션보다는 "어두운"것 같다하지만 난이 일을 더 나은 방법이 상상한다.

어떻게 향상시킬 수 있습니까? 감사합니다

+1

Android 용으로 프로그래밍 한 적이 없지만 문제의 요점을 볼 수 없습니다. 사용자가 디 컴파일하는 방법을 모르고 메모장을 통해서만 코드를 읽을 수 있다면 사용하지 않은 알고리즘 이름을 넣고 실제로 연관되어있는 코드 이름을 알지 못합니다. s/he가 디 컴파일하는 방법을 알고 있다면 시스템으로 라이브러리 호출을 대체 할 수 없도록하는 난독 화가 없습니다 (잘 알려진 메소드 이름을 가진 잘 알려진 라이브러리를 사용하여 암호를 인스턴스화하는 것 같습니다). out.println. – ignis

+0

간단한 gradle 함수를 사용하여 이러한 종류의 문자열을 숨기고 있습니다. 그것은 육안으로 만 보호 할 수 있지만 어떤 경우에도 아무것도 아닌 것보다 낫습니다. https://gist.github.com/shomeser/68f4fe360be0edac95e4 –

답변

9

하나를 들어, 당신은 단지

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

그것은 char 배열 실제로 문자열입니다 죽은 공짜의 쓰기는 안된다.

당신은 다음의 조합 할 수

:

  1. 또는 더 나은, 여러 INT 배열로
  2. 계산을하여 문자열을 파괴하는 int [] 배열에 "문자열"을 넣어/조작 배열의 값은 응용 프로그램의 다양한 단계에서 그 값이 런타임 동안 특정 간격에서만 유효하므로 코드를 디 컴파일하여 호기심을 자극하지 않도록 보장합니다.
  3. 은 배열을 전달합니다. 앞뒤로, 지역 변수를 통해, 박쥐 k를 인스턴스 변수로 변환하기 전에 배열을 단일 배열로 변환하여 문자열 생성자에 전달하기 전에
  4. 런타임시 실제 문자열이있는 시간을 줄이기 위해 String을 즉시 사용 후 null로 설정합니다.
+0

# 3에 대한 패턴이나 예제 코드는 무엇입니까? # 5는 어떻게 도움이됩니까? – Nicholas

+0

# 5 누군가가 코드를 디 컴파일 할 수 있다면, 개발자가 코드를 디 컴파일 할 수 있기 때문에 디버거 플래그를 장소에 넣을 수도 있기 때문에 런타임 검사를 막아야합니다. 즉, 실제 String이 존재하는 시간이 짧을수록 눈을 뗄 때 더 안전합니다. # 3에 대한 – Kai

+0

, 나는 지금까지 이대로 나간 적이 없지만 [this] 시도 할 수 있습니다. (http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/658ab629-e603-4e6f- 985c-2bb8c1669b27 /) _or_ [jzlib] (http://www.jcraft.com/jzlib/)와 같은 것을 사용하여 문자열을 바이트 배열로 "압축"하고 필요할 때 압축을 풉니 다. 메소드 이름을 모호하게 만들 수 없기 때문에 Android zip lib를 사용하지 마십시오. 전체 엔터프라이즈를 매우 분명하게 만듭니다. – Kai

2

내가 복호화에 정말 좋은 unencryption의 너 한테 나 다소 약한 base64로 디코딩 할 수있는 곳 뭔가

class ... 
    String CONCAT; 

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

처럼 너 한테 암호 해독을 사용하여 정적 (클래스) 초기화의 값을 설정하는 것을 선호 .

어쨌든 문자열을 먼저 인코딩하는 간단한 프로그램이 필요합니다.

관련 문제