2013-09-25 4 views
5

난독 화 문제가 있습니다. 더 나은 상상력의 경우 : 내가 암호화 된 버전을 출시 할 때까지JNI proguard 난독 화

자바 코드

class JniTest... 

public void test() 
{ 
    //some code 
} 

public void runJniCode() 
{ 
    //here I call native code 
} 

네이티브 코드

JNIEXPORT void JNICALL 
Java_path_to_class_test(JNIEnv* env, jobject obj) 
{ 
    //here I call test method from Java 

} 

모든 것이 잘 작동합니다. 이 클래스의 Java 클래스 (예 : JniTest)와 test의 이름은 "a"와 "a()"로 이름이 바뀌었지만 (항상 같지는 않을 수 있음) 원시 코드에서는 메소드의 원래 이름

jmethodID mid = env->GetMethodID(cls, "test", "someSignature"); 

... 동적 메소드 이름을 설정할 수있는 방법이있다 :이 문자열로 하드 코딩 있기 때문에 수업처럼, 남아?

+0

안녕하세요, 해결책을 찾았습니까? –

+0

아니요,이 방법을 유지하기 위해 proguard의 설정을 변경해야했습니다. ( – cecan89

답변

5

정확하게 똑같은 문제를 연구하면서 합리적인 해결책이라고 생각했습니다. 불행하게도이 솔루션은 요청에 따라 Java 코드와 JNI 메소드를 자동으로 난독 화하지 않지만 여전히 공유 할 가치가 있다고 생각했습니다. 소스에서

인용구 : 상대적으로 소스 코드를 유지하면서

내가, 여기에 자바와 네이티브 측면 모두에서 이름을 의미없는하는 방법 이름을 이름을 변경의 JNI 층의 난독을 수있는 간단한 트릭을 제시 읽기 쉽고 유지 보수가 가능하며 성능에 영향을주지 않습니다.

이의이 예를 생각해 보자, 초기 상황 : Proguard와 위의 예에서
class Native { 
    native static int rotateRGBA(int rgb, int w, int h); 
} 

extern "C" int Java_pakage_Native_rotateRGBA(JNIEnv *env, jclass, int rgb, int w, int h); 

자바 측과 기본면에 계속 표시 메소드 이름 rotateRGBA을 당황하게 할 수 없다.

해결 방법은 코드의 가독성과 유지 관리를 방해하지 않도록 직접 소스에 의미없는 메서드 이름을 사용하는 것입니다.

class Native { 
    private native static int a(int rgb, int w, int h); //rotateRGBA 

    static int rotateRGBA(int rgb, int w, int h) { 
     return a(rgb, w, h); 
    } 
} 

// rotateRGBA 
extern "C" int Java_pakage_Native_a(JNIEnv *env, jclass, int rgb, int w, int h); 

의 JNI 방법은 무의미한로 변경된다. 그러나 자바 측의 호출은 의미있는 이름의 메소드 인 rotateRGBA에 의해 래핑됩니다. Java 클라이언트는 이름 변경으로 전혀 영향을받지 않고 이전과 마찬가지로 Native.rotateRGBA()를 계속 호출합니다.

흥미로운 점은 새 Native.rotateRGBA 메소드가 더 이상 기본이 아니므로 Proguard에서 마음대로 이름을 변경할 수 있다는 것입니다. 결과는 Dalvik과 네이티브 측에서 난이 한 코드에서 rotateRGBA라는 이름이 완전히 사라진다는 것입니다. 게다가 Proguard는 래퍼 메서드를 최적화하여 네이티브 호출을 래핑하는 성능에 미치는 영향을 무시합니다.

결론 : 읽기 쉽도록 성능에 영향을주지 않으면 서 난독 화 코드 (Dalvik 바이트 코드와 네이티브 라이브러리 모두)에서 JNI 메서드 이름을 제거했습니다.

출처 : Obfuscating the JNI surface layer

내가 자동으로 기본 자바 코드와 관련 JNI를 당황하게 할 수있는 도구에 대한 사냥을 계속 해요.

+1

대상 페이지가 변경되는 경우를 대비하여 답변의 링크 된 페이지를 인용하십시오. – mhlester

+0

아, 원래 게시물을 만들 때 이것을 고려했지만 존경하기로 결정했습니다. 원저자와 소원 함의 관계에 있습니다. 링크가 다운되면이 대답이 쓸모 없게된다는 이론적 근거는 완벽합니다. – AndrewJC

관련 문제