본문 바로가기
FE Development/React-Native

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

by 개발자 데이빗 2021. 11. 14.

적용 배경

업무 중 클라이언트 측 보안 정책에 위반되는 항목 중 소스코드 난독화가 되지 않은 점이 있어 난독화를 적용하게 되었다.

클라이언트 측에서는 안드로이드 앱에서의 난독화만 요청하였는데

일단 보안은 굉장히 중요한 부분이고 React Native로 개발을 하고 있기 때문에 조만간 IOS, JS 소스코드 난독화도 적용 후 기록할 예정이다.

 

적용 과정

Proguard 적용 알아보기

Proguard란 ?

소스코드를 난독화 및 최적화 해주는 무료 오픈소스 툴이다.

Android grade plugin 3.4.0 이상 버전에서는 기본적으로 R8 컴파일러를 사용한다.

R8은 프로젝트의 자바 바이트 코드를 Android 플랫폼에서 실행되는 DEX 형식으로 변환하는 기본 컴파일러입니다. 

R8 대신 proguard 사용시 android.enableR8=false 로 proguard를 사용할 수 있다.

 

def enableProguardInReleaseBuilds = true

android{
	buildTypes{
		signingConfig signingConfigs.debug
		minifyEnabled enableProguardInReleaseBuilds
		shrinkResources enableProguardInReleaseBuilds
		proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
	
	}
}

 

minifyEnabled: 축소, 난독 화 및 코드 최적화를 활성화 / 비활성화한다.

shrinkResources: 라이브러리 종속성에서 사용되지 않는 클래스, 필드, 메서드 속성을 감지하고 제거한다.

getDefaultProguardFile('proguard-android.txt’): Android Gradle 플러그인과 함께 패키지 된 기본 ProGuard 규칙 파일이 포함되어 있다.

proguard-rules.pro: 프로젝트 레벨에 pro guard-rules.pro 파일을 만들고 축소, 난독화 제외 클래스, shrink 여부 등에 관한 룰을 작성한다.

난독화 제외가 필요한 서드파티 라이브러리의 경우 공식 doc 또는 github README에서 proguard 룰에 관해 찾아보면 필요한 규칙을 찾을 수 있다.

React Native 또한 기본적으로 필요한 규칙이 github에 제공되어 있다.

 

프로가드 룰 적용방법

 

-keep: 지정된 클래스와 해당 멤버에 대해 축소 및 난독화를 적용하지 않는다.

-keepclasseswithmembers: -keep과 동일하나 차이점은 클래스 사양의 모든 멤버가있는 클래스에만 적용이 된다.

-keepnames:클래스와 멤버의 축소를 허용하지만 난독화는 허용하지 않는다. 사용하지 않는 코드는 삭제하지만 클래스의 이름은 그대로 유지된다.

-keepclasseswithmembernames: -keepnames와 동일하나 차이점은 클래스 사양의 모든 멤버가있는 클래스에만 적용이 된다.

-keepclassmembers: 축소 구문에서 클래스가 제거되지 않은 경우 보존 할 클래스 멤버를 지정한다.

-keepclassmembernames: 축소 구문에서 클래스가 제거되지 않은 경우 이름을 유지할 클래스 멤버를 지정한다. 클래스 멤버를 사용하지 않으면 제거된다.

디컴파일 해보기

디컴파일을 위해 필요한 툴 다운로드

 

1. Apktool 다운로드

https://ibotpeaches.github.io/Apktool/install/

Wrapper script를 apktool.sh 로 저장

다운로드한 jar파일 apktool.jar로 수정

 

2. 편한 경로에 디렉토리를 만들고 두 파일을 옮긴 후에 실행권한을 추가한다.

chmod +x apktool.sh

chmod +x apktool.sh

3. 해당 경로에서 디컴파일한다.

java -jar apktool.jar decode my_app.apk

 

디컴파일 하면 디컴파일 된 소스코드를 포함하는 폴더가 생성된다.

4. gui로 확인하기 

 

맥용 Jd-gui를 다운로드 받는다. 

http://java-decompiler.github.io/

 

Java Decompiler

The “Java Decompiler project” aims to develop tools in order to decompile and analyze Java 5 “byte code” and the later versions. JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files. You can browse the reco

java-decompiler.github.io

맥에 설치된 자바 경로 지정를 지정한다.

자바 버전 확인 및 경로 확인

java -version

/usr/libexec/java_home -v 1.8

 

Gd-gui 앱 패키지 내용보기를 통해 Content/MacOS/universalJavaApplication.sh 수정

확인한 경로를 붙여넣기 한다.

 

예시 

JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

 

 

dex_jar를 다운로드 받는다.

apk 파일을 jar 파일로 변환해준다.

https://github.com/pxb1988/dex2jar/releases

 

해당 파일을 다운 받고

cd dex2jar-2.0

chmod u+x d2j-dex2jar.sh
chmod u+x d2j_invoke.sh

위와 같이 권한설정을 해준 후

./d2j-dex2jar.sh my_app.apk

실행하면 carpet-dex2jar.jar 파일이 생성된다.

 

이 파일을 jh-gui를 통해 열어보면 아래와 같이 정상적으로 난독화 되었음을 확인할 수 있다.

jd-gui

 

성과

소스코드 난독화로 해독이 불가능 하지는 않지만 매우 어려워져 안전성이 강화되었다.

소스코드 난독화 및 최적화를 진행하며 앱의 크기가 축소 되었다.

first.apk의 경우 난독화 및 최적화를 적용하지 않음

second.apk의 경우 minifyEnabled만 true로 설정

final.apk의 경우 minifyEnabled와 shrinkResources 모두 true로 설정

 

앱 난독화 및 최적화 과정

 

메모

  1. 코드 축소 (Shrink):   라이브러리 종속성에서 사용되지 않는 클래스, 필드, 메서드  속성을 감지하고 제거한다.
  2. 리소스 축소: 앱의 라이브러리 종속성에서 사용되지 않는 리소스를 포함하여 패키지 앱에서 사용되지 않는 리소스를 제거한다.
  3. 코드 난독화: 의미없는 이름을 통해 클래스, 필드  메서드의 이름을 변경하여 DEX 파일 크기를 줄인다.
  4. 코드 최적화: 바이트 코드를 최적화하고 사용하지 않는 명령어를 제거한다.
  1. mapping.txt:  파일은 원본  난독   클래스, 메서드  필드 이름 간의 변환을 제공한다.  매핑 파일에는  번호를 원래 소스 파일  번호에 다시 매핑하는 정보도 포함되어 있다.
  2. seed.txt:  파일에는 난독화되지 않은 클래스  클래스 멤버 목록이 있다.
  3. usage.txt:  파일에는 APK에서 제거  코드가 포함되어 있다. 

댓글