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

김태현·2023년 2월 24일
0

Android

목록 보기
1/3
post-thumbnail

📜 **난독화를 하였을때 장점**

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

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

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

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

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

🖥 개발 내용

**1. 난독화 옵션 키기**

buildTypes {
        getByName("release") {
            minifyEnabled true
            shrinkResources true
            proguardFiles(
                    getDefaultProguardFile("proguard-android-optimize.txt"),
                    "proguard-rules.pro"
            )
        }
    }

위와 같이

minifyEnabled trueshrinkResources true

로 설정해주면 R8 난독화를 간단하게 사용할 수 있습니다. 

 (Android Gradle 플러그인 3.4.0 이상에서)

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

  • 사실 난독화는 적용이 어렵다기보단 난독화를 하지않아야할 class 및 함수를 예외처리하는데

신경을 많이써야한다는 점이 어렵습니다.

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

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

ex)

# 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
#   http://developer.android.com/guide/developing/tools/proguard.html
 
# 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 summit.lol.couter.scene.Ads {*;}
-keep summit.lol.couter.scene.view {*;}
 
 
# 데이터 통신
-keep com.xwray.groupie.* {*;}
  • dontwarn 패키지명. : 지정해서 경고 무시**
  • keep class 패키지명. : 난독화가 필요하지 않은 경우**
  • ignorewarnings : 경고 무시
  • dontoptimize : 최적화 하지 않기
  • dontshrink : 사용하지 않는 메소드 유지
  • keepclassmembers : 특정 클래스 멤버 원상태 유지
  • keepattributes : 내부 클래스 원상태 유지 적용

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

3**. APK 디컴파일**

순서:

  1. apk 파일을 jar파일로 변환해 줍니다.
  2. jar 파일을 툴을 이용하여 Open 하여 확인.

1. Dex2Jar

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

2. jd-gui

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

가이드.

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

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

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

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

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

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

                                      <난독화 적용 >

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

                                     <난독화 적용 >
profile
Android 개발자

0개의 댓글