나의 성장기 보안/코딩$

안드로이드 진단 - 난독화 솔루션에 대하여...

App 진단
@2021-10-25 00:55:25

난독화 솔루션의 종류

1. 에러기반 난독화

  • 리패키징 방지 기능
  • 오픈소스 APKProtect가 존재함(취약점이 발견되어 개발 중단되었음)

Smali 코드에서 Java Code로 변환할 때 사용되는 Dex2jar Tool의 에러를 유발시킴

2. 소스코드기반 난독화

  • 자바 코드의 Class, Method, Field, 변수명을 임의의 문자(a, b, c)로 치환
  • 오픈소스 ProGuard가 존재

3. 문자열기반 난독화

  • 중요 정보를 다루는 평문의 문자열을 암호화하여 숨김(대칭키)
  • 꼭 필요한 구간에 난독화를 적용해야 하며, 모든 곳에 적용하면 앱 설치 및 기능이 정상적으로 동작하지 않는다.
  • 상용 솔루션 존재

4. 멀티덱스기반 난독화

  • 실질적인 App을 구동하기 위한 코드, 원본 코드가 존재
  • 원본 Code는 Resource파일에 암호화해서 숨긴다.
  • 상용 Dexguard가 존재한다.

소스코드 및 멀티덱스 난독화 (난독화 솔루션)

1. ProGuard

  • 대표적인 소스코드 난독화 솔루션이다.
  • 특정 프로그램을 이용하면 일부 난독화 해제 기능을 제공한다.
  • 분석가는 특정 프로그램을 이용하지 않는다.(경험으로인하여 평문 수준의 소스코드 확인이 가능하다.)

2. DexGuard

  • 대표적인 멀티덱스 상용 난독화 솔루션이다.
  • 실제 앱을 구동하기 위한 코드를 숨기거나 삭제할 때 취약점이 발생한다. (취약점 조치)

쓰레기 코드 삽입(코딩)

불필요한 Class, Method, overriding, 변수 등 쓰레기 코드 삽입

앱 구동 시 필요한 코드, 비슷한 코드, 의미 없는 코드등 삽입

전혀 의미 없는 암호화 코드 삽입

 

중요 변수 인코딩/암호화(코딩)

아이디, 패스워드, 결재, 대칭키, 서명 값 등 중요 정보를 다루는 변수는 인코딩/암호화

char[]형 배열로 처리하지 말것 (메모리 덤프 시 평문 확인 가능

 

검증 코드 은닉(코딩)

예상하기 어려운 함수 내부에 검증 코드 구현

쓰레기 검증 코드를 쉽게 확인이 가능한 곳에 위치

 

문자열 조립(코딩)

문자열 검색을 피하기 위해 문자열을 조립해서 사용

검증 루팅의 경우 평문의 문자열을 사용하지 말고, 한 글자씩 비교

superuser.apk(X)

"s" + "up" + "e" + "r" + "u"....(O)

 

의미 없는 클래스명(코딩)

프로가드는 일부 클래스, 메소드, 변수만 치환

그 외의 것들은 치환되지 않으므로 전혀 의미 없는 이름으로 치환

CryptoClass.java, Autofill.java 등 -> cc.java, aa.java

 

NDK(코딩)

중요 정보는 NDK를 이용해 개발

JNI 이용


Android Proguard에 대하여

  1. 코드 난독화를 통해 Decompile시 본인의 코드가 노출되는 것을 방지할 수 있다.
  2. 불필요한 Method를 제거하여 MultiDex를 피할 수 있다.(용량 감소)

※ MultiDex란?

- 안드로이드 앱을 구성하는 코드는 Complie되어 Dex파일로 만들어진다. 하나의(dex)파일에는 최대 65536개의 Method만 참조할 수 있다.

만약 프로젝트의 코드가 65536개의 Method를 초과하게 되면 덱스(Dex)파일이 여러개가 생성된다.

그러면 Multi Dex를 사용하여 컴파일 할 수 있지만, Build과정에서 App내의 파일을 여러개의 Dex파일로 나누어야 하므로 빌드 속도가 느려지고 APK의 용량이 커지게 된다.

 

안드로이드 난독화 대응 방안으로 쉽게 수행할 수 있는 프로가드를 적용하는 방법을 소개한다.

 

보통 프로가드만 적용할 경우 분석가에 의해 7~80%이상의 원본 수준의 소스코드를 확인할 수 있다. 하지만, 최소한 프로가드는 적용해야 한다.

 

프로가드를 적용하려면 안드로이드 스튜디오 좌축 프로젝트의 Gradle Scripts 항목에서 build.gradle을 더블클릭하면 기본적으로 minifyEnable의 속성이 "false"로 설정되어 있다. 이 속성을 "true"로 변경하면 프로가드가 적용된다.


코드 난독화 및 APK 최적화를 위한 Android Proguard사용법

1. Bulild Type을 디버깅과 릴리즈 버전으로 나눠준다.

Debug와 Release로 나눔

minifyEnabled 값을 true로 바꿔주면 Proguard가 적용된다.

디버그 시 Proguard-debug.pro를 추가해 줌으로써 난독화 및 라인 지워지는 것을 예외처리 할 수 있다.

 

2. 프로가드 활성화 및 debug.pro추가

전체 적용된 코드로 빌드타입을 위와 같이 적용해 준다.

minifyEnabled 값을 true로 바꿔 주면 프로가드가 적용된다.

디버그 시 proguard-debug.pro를 추가해 줌으로써 난독화 및 라인 지워지는 것을 예외 처리 할 수 있다.

3. 프로가드 적용 결과

 

사용 전

프로가드를 사용하기 전에는 용량이 37.2MB였으며 classes.dex 파일이 무려 3개나 있다.

classes.dex의 Method 개수를 보면 65501개이며 이와 같은게 classes2.dex에도 존재한다.

classes3.dex에는 1505개의 Method가 존재한다.

사용 후

프로가드 적용 후 3개로 나뉘어져 있던 dex 파일이 classes.dex파일 하나로 변경되었다. Method 개수도 56673으로 프로가드를 적용 안한 APK보다 반이상이나 줄어들었다. 또한 용량도 37.2MB에서 33.7MB로 변경됨을 확인할 수 있다.

 


Proguard - 디컴파일 및 방법

  • Proguard의 디컴파일 형태는 다음과 같다

Proguard Decompile

보는바와 같이 약간의 난독화가 적용되어 있는데, 이 난독화를 풀 수있다.

http://apk-deguard.com/

 

DeGuard: Statistical Deobfuscation for Android

DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.

apk-deguard.com

위의 사이트에 접근하여 APK파일을 올리게되면 디컴파일된 소스코드를 볼 수 있게 된다.

그래서 Proguard의 유료 버전인 Dexguard라는 것이 존재한다.

  • Proguard에 비하여 Dexguard는 정적, 동적 분석에 대해 보호를 더 하고 있다.
  • Proguard는 난독화를 최소화만 하고, Dexguard는 여러 Layer 암호화 및 난독화를 수행한다.
  • Proguard는 Byte Code에 집중되있지만 Dexguard는 모든 Component를 처리한다.
  • Proguard는 Open Source이고, Dexguard는 Enterprise 제품이다.