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에 정의해서 난독화 방지가 가능하다.
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
@Keep
annotation: 개별클래스의 난독화 방지
1
2
@Keep
data class KotlinWorld(val blogName: String)
참고 자료
R8을 이용해 안드로이드 앱을 최적화하고 코드 유출 방지하기 : minifyEnabled, shrinkResource, proguard
Android aab(앱 번들) 용량이 150MB가 넘을 때 해결법 (shrinkResources와 minifyEnabled를 쓰지않고)
React Native 보안편 소스코드 난독화 - Android
ProGuard를 통한 안드로이드 애플리케이션의 난독화
GitHub - lugg/react-native-config: Bring some 12 factor love to your mobile apps!