관리 메뉴

개발새발 블로그

R8 난독화 적용하기 & apk 디컴파일 확인하기 본문

android

R8 난독화 적용하기 & apk 디컴파일 확인하기

SeanBlog 2020. 3. 29. 18:02

안녕하세요 개발새발 블로그입니다.

 

오늘은 R8 난독화 적용 및 예외처리 방법.

이후 apk 파일을 디컴파일하여 난독화가 잘 적용됬는지 확인해보겠습니다.

 

 

 

난독화를 하였을때 장점

 

코드 축소(또는 Tree Shaking): 앱에서 사용하지 않는 클래스, 필드, 메서드, 속성 및 라이브러리 종속성을 감지하여 안전하게 삭제합니다(64k 참조 제한을 해결하기 위한 유용한 도구). 

 

리소스 축소: 앱의 라이브러리 종속성에서 사용하지 않는 리소스를 포함하여 패키징된 앱에서 사용하지 않는 리소스를 삭제합니다. 리소스 축소는 코드 축소와 함께 사용하여 사용하지 않는 코드를 삭제하고 마찬가지로 더 이상 참조되지 않는 리소스도 안전하게 삭제할 수 있습니다.

 

난독화: 클래스와 멤버 이름을 줄여 DEX 파일 크기를 줄입니다.

 

최적화: 코드를 검사하고 다시 작성하여 앱 DEX 파일의 크기를 더 줄입니다. 예를 들어, if/else 구문의 else {} 브랜치가 전혀 사용되지 않음을 R8에서 감지한 경우 R8이 else {} 브랜치 코드를 삭제합니다.

 

악용적으로 사용자가 코드를 뜯었을때 난독화처리를하여 읽을수 이해하기 어렵게 만드는 장점도 있습니다.

 

 

 

 

방법

 

1. 난독화 옵션 키기

 

buildgradle <app> 

1
2
3
4
5
6
7
8
9
10
    buildTypes {
        getByName("release") {
            minifyEnabled true
            shrinkResources true
            proguardFiles(
                    getDefaultProguardFile("proguard-android-optimize.txt"),
                    "proguard-rules.pro"
            )
        }
    }
 

위와 같이

minifyEnabled true
shrinkResources true

로 설정해주면 R8 난독화를 간단하게 사용할 수 있습니다.  (Android Gradle 플러그인 3.4.0 이상에서)

 

 

2. 난독화 적용 후 예외처리.

  - 사실 난독화는 적용이 어렵다기보단 난독화를 하지않아야할 class 및 함수를 예외처리하는데 신경을 많이써야한다는 점이 어렵습니다.

 

예) Google에 remote config 를 통한 값을 가져오는 통신에서 data에 난독화가 적용되어 정상적인 값을 못가져오는 현상

 

 

난독화 하지않을 부분은 위쪽 코드 proguardFiles에 명시된 곳에 예외처리를 해줘야합니다.

 

 

ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.
#
# For more details, see
 
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}
 
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
 
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
 
 
 
# 광고 적용
 
 
# 데이터 통신
-keep com.xwray.groupie.* {*;}
 
 

 

-dontwarn 패키지명.** : 지정해서 경고 무시

-keep class 패키지명.** : 난독화가 필요하지 않은 경우

-ignorewarnings : 경고 무시

-dontoptimize : 최적화 하지 않기

-dontshrink : 사용하지 않는 메소드 유지

-keepclassmembers : 특정 클래스 멤버 원상태 유지

-keepattributes : 내부 클래스 원상태 유지 적용

 

 

 

이후 apk 를 빌드하고 제대로 난독화가 적용됬는지 확인해 보겠습니다.

 

 

순서:

1. apk 파일을 jar파일로 변환해 줍니다.

2. jar 파일을 툴을 이용하여 Open 하여 확인.

 

 

1. Dex2Jar

apk파일를 jar파일로 변환해 줍니다.

 

dex2jar - Browse Files at SourceForge.net

VPN은 해킹을 방지하고 온라인 트래픽 흐름을 위한 암호화된 터널이라고 상상해 보세요. 아무도 터널 안을 통해 볼 수 없으며 사용자의 인터넷 데이터를 손에 넣을 수 없습니다. NordVPN은 공용 Wi-Fi를 사용하거나, 밖에서 개인 계정과 직장 계정에 액세스하거나, 또는 자신의 인터넷 사용 기록을 비공개로 안전하게 유지합니다.

sourceforge.net

2. jd-gui

jar 파일의 내용(소스코드)보여 주는 툴

 

java-decompiler/jd-gui

A standalone Java Decompiler GUI. Contribute to java-decompiler/jd-gui development by creating an account on GitHub.

github.com

 

 

 

 

 

 

가이드.

 

1. apk 파일을 다운받은 dex2jar-2.0 폴더안에 넣어줍니다.

(저는 test.apk 파일이라고 넣어줬습니다.)

 

 

 

 

 

2. CMD 창을 열어 apk 파일이 있는 dex2jar-2.0 폴더로 이동합니다.

 

 

 

3. 명령어를 이용하여 apk 파일을 jar 파일로 만들어줍니다.

 

명령어 : 

d2j-dex2jar.bat -f -o (생성될 jar 파일이름 설정).jar (디컴파일할 APK 파일 이름).apk

 

 

 

 

4. 다운받은  jd-gui 를 통해 생성된 jar 파일을 Open 해줍니다.

 

 

 

아래 화면처럼 모든 변수 및 작성한 변수 및 함수명이 그대로 보인다면 난독화가 적용되지않은 것.

난독화 적용 전

 

아래 이미지 처럼 class 명 부터  변수 및 함수명이 모드 변하게됩니다.( ※ proguard 파일에서 예외처리한 부분 제외 )

난독화 적용 후

 

 

 

 

 

이상 난독화 (R8) 적용에 대한 예시 및 디컴파일 확인 방법 가이드였습니다.

 

감사합니다.

 

Comments