Post

Proguard로 안드로이드 소스코드 난독화

안드로이드 앱의 보안 중요성

안드로이드 앱을 빌드하면 aab apk 파일로 만들어 진다. 이들은 단순히 우리가 작성한 코드들의 압축에 불과하다. 따라서 apk의 압축을 풀면 우리가 작성한 코드의 내부가 모두 보인다. 안드로이드 스튜디오에서 보면 아래와같이 모두 보이는것을 알 수 있다.

만약 이 상태로 앱을 출시한다면 앱의 리버스 엔지니어링이 가능하는 뜻이며, 누군가 우리의 코드를 베껴 새로운 앱을 낼 수도 있다는 이야기이다.

따라서 우리는 우리의 앱 구조를 파악하지 못하게 할 장치가 필요하다.

난독화 적용 방법

zippu/android/app/build.gradle에 들어가서 buildTypes 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 android {
 ...
    buildTypes {
            debug {
                signingConfig signingConfigs.debug
                minifyEnabled true
                proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"

            }
            release {
                signingConfig signingConfigs.release
                minifyEnabled enableProguardInReleaseBuilds
                proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
            }
        }
...
}

shrinkResources

불필요한 리소스 제거. 파일 사이즈 감소.

minifiyEnabled = true

클래스 명과 함수명들이 모두 a,b,c등으로 바뀌게 된다.

이로 인해 클래스명이나 함수명을 알 수 없어 모든 코드 구조를 알지 않는 이상 리버스 엔지니어링이 거의 불가능해진다.

소스 난독화의 동작에 관여하는 속성이 아니라, 앱의 패키징 시 사용하지 않는 리소스를 자동으로 제거할지 말지를 결정하는 것이다. 단독으로 사용되지 않으며 shrinkResources속성과 함께 사용

proguardFiles getDefualtProjuardFile을 사용해서 기본 프로가드 설정

프로가드를 사용/미사용으로 설정

enableProguardInReleaseBuilds

코드 난독화에 필요한 proguard 활성화.

코드 난독화와 동시에 코드사이즈를 줄여주어 용량이 감소.

cd android && ./gradlew app:assembleRelease --stacktrace

예외처리

proguard

난독화가 되면 안되는 클래스들은 proguard에 정의해서 난독화 방지가 가능하다.

  1. keep 문 추가

(1) 패키지에 속한 모든 클래스와 함수들의 난독화 방지.

1
2
-keep class * extends com.google.gson.TypeAdapter
-keep class com.google.googlesignin.** { *; }

(2) interface 난독화 미처리

1
2
3
4
-keep interface *{
    <methods>;
    <fields>;
}

(3) 소스파일의 라인은 섞지 않음

섞으면 stacktrace에서 라인추적이 불가능.

1
-keepattributes SourceFile,LineNumberTable

(4) 소스파일의 변수명 변경

1
-renamesourcefileattribute SourceFile
  1. @Keep annotation: 개별클래스의 난독화 방지
1
2
@Keep
data class KotlinWorld(val blogName: String)

참고 자료

R8을 이용해 안드로이드 앱을 최적화하고 코드 유출 방지하기 : minifyEnabled, shrinkResource, proguard

Android Proguard

Android aab(앱 번들) 용량이 150MB가 넘을 때 해결법 (shrinkResources와 minifyEnabled를 쓰지않고)

React Native 보안편 소스코드 난독화 - Android

ProGuard를 통한 안드로이드 애플리케이션의 난독화

Proguard로 안드로이드 소스코드 난독화 하기

GitHub - lugg/react-native-config: Bring some 12 factor love to your mobile apps!

This post is licensed under CC BY 4.0 by the author.