Proguard / 암호화 / 난독화

똘이주인·2021년 8월 9일
0

난독화 솔루션의 종류

  1. 에러기반 난독화

    리패키징 방지 기능

    smali 코드에서 자바 코드로 ㅂㄴ환할 때 사용되는 dex2jar 도구의 에러를 유발

  2. 소스코드기반 난독화

    자바 코드의 클래스, 메소드명, 필드명, 변수명 등을 임의의 문자(a, b, c)로 치환

    오픈소스 Proguard가 존재

  3. 문자열기반 난독화

    중요 정보를 다루는 평문의 문자열을 암호화하여 숨김(대칭키)

    꼭 필요한 구간에 난독화를 적용해야 하며, 모든 곳에 적용하면 앱 설치 및 기능이 정상적으로 동작하지않음

  4. 멀티덱스기반 난독화

    실질적인 앱을 구동하기 위한 코드, 원본 코드가 존재

    원본 코드는 리소스 파일에 암호화하여 숨김

    상용 Dexguard가 존재

소스코드 및 멀티덱스 난독화 (난독화 솔루션)

  1. 프로가드

    대표적인 소스코드 난독화

    특정프로그램을 이용하면 일부 난독화 해제 기능 제공

    분석가는 특정 프로그램을 이용하지 않음(경험으로 인해 평문 수준의 소스코드 확인 가능)

  2. 덱스가드

    대표적인 멀티덱스 상용 난독화

    실제 앱을 구동하기 위한 코드를 숨기거나 삭제할 때 취약점 발생

Android Proguard 가 필요한 이유

  1. 코드 난독화를 통해 디컴파일시 본인의 코드가 노출되는 것을 방지 할 수 있다.

  2. 불필요한 메서드를 제거하여 멀티덱스를 피할 수 있다.

  • 멀티덱스란?

    안드로이드 앱을 구성하는 코드는 컴파일 되어 덱스(dex) 파일로 만들어 진다. 하나의 덱스(dex) 파일에는 최대 65536개의 메소드만 참조 할 수 있다. 만약 프로젝트의 코드가 65536개의 메소드를 초과하게 되면 덱스(dex)파일이 여러개가 생성된다.

    그러면 멀티 덱스를 사용하여 컴파일 할 수 있지만, 빌드 과정에서 앱 내의 파일을 여러개의 덱스파일로 나누어야 하므로 빌드 속도가 느려지고 APK 의 용량이 커지게 된다

코드 난독화 및 APK 최적화를 위한 Android Proguard 사용법

  1. 빌드타입을 디버깅과 릴리즈 버전으로 나눠 준다.
buildTypes {

    debug {
        // 프로가드 활성화
        minifyEnabled true

        // 기본 프로가드 설정
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
   
    }

    release {
        // 프로가드 활성화
        minifyEnabled true

        // 기본 프로가드 설정
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

       
    }
}

minifyEnabled 값을 true 로 바꿔 주면 프로가드가 적용된다.

디버그 시 proguard-debug.pro 를 추가해 줌으로써 난독화 및 라인 지워지는 것을 예외 처리 할 수 있다.

  1. 프로가드 활성화 및 debug.pro 추가
buildTypes {
   
    debug {
        // 프로가드 활성화
        minifyEnabled true

        // 기본 프로가드 설정
        proguardFile getDefaultProguardFile('proguard-android.txt')
        // 프로젝트에 필요한 프로가드 설정
        proguardFile 'proguard-rules.pro'
        // 디버그에 필요한 프로가드 설정
        proguardFile 'proguard-debug.pro'
    }

    release {
        // 프로가드 활성화
        minifyEnabled true

        // 기본 프로가드 설정
        proguardFile getDefaultProguardFile('proguard-android.txt')
        // 프로젝트에 필요한 프로가드 설정
        proguardFile 'proguard-rules.pro'
    }
}

전체 적용된 코드로 빌드타입을 위와 같이 적용해 준다.

minifyEnabled 값을 true 로 바꿔 주면 프로가드가 적용된다.

디버그 시 proguard-debug.pro 를 추가해 줌으로써 난독화 및 라인 지워지는 것을 예외 처리 할 수 있다.

// proguard-debug.pro
# Begin: Debug Proguard rules

-dontobfuscate                              #난독화를 수행하지 않도록 함
-keepattributes SoureFile,LineNumberTable   #소스파일, 라인 정보 유지

# End: Debug ProGuard rules

//roguard-debug.pro 파일로 똑같이 작성하면 된다.
  1. 적용 결과 확인

프로가드 사용 전

프로가드를 사용하기 전에는 용량이 37.2MB 였으며 classes.dex 파일이 무려 3개나 있다.

classes.dex 의 메소드 개수를 보면 65501 개이며 이와 같은게 classes2.dex 에도 있다

classes3.dex 는 1505 개의 메소드가 있다.

프로가드 적용 후

프로가드 적용 후 3개로 나뉘어져 있던 dex 파일이 classes.dex 파일 하나로 바뀌었습니다. 메소드 개수도 56673 으로  프로가드를 적용 안한 APK 보다 반이상이나 줄어들었다. 또한 용량은 기존 37.2MB 에서 33.7MB 로 감소하였다

0개의 댓글