한 걸음 두 걸음

Android / 안드로이드 ] Proguard 프로가드 본문

FrontEnd/Android

Android / 안드로이드 ] Proguard 프로가드

언제나 변함없이 2019. 9. 7. 22:33
반응형

프로가드!를 적용시켜보자.
프로가드가 뭔데 왜 적용시키는 걸까?

프로가드란!

널리 사용되고 있는 코드를 난독화 및 최적화 시켜주는 오픈소스 툴입니다. GPL라이센스를 갖고 있으며 어떠한 제약 조건 없이 사용할 수 있는 것이 특징입니다.

ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or for Java Micro Edition.

프로가드를 왜 사용해야할까?

자바는 JVM(자바 가상머신)위에서 바이트코드 형태로 컴파일됩니다. 이 때 컴파일된 코드에는 자바 소스코드 정보가 그대로 포함되어있기 때문에 디컴파일을 해주면 쉽게 코드를 얻을 수 있습니다. 이러한 자바의 특징을 이용하여 play store에서 얻은 apk파일을 디컴파일링하여 apk파일 내의 클래스형태의 바이트코드를를 자바형식으로 바꾸어 소스를 볼 수 있는데요! 그러면 열심히 짜놓은 코드를 다른 사람들이 쉽게 가져가버리고 말겠죠.. 그렇기 때문에 난독화를 시켜줌으로써 디컴파일링을 통해 사람 또는 분석도구가 이해하거나 분석하기 힘들도록 만들어주어야 합니다 : )

참고로 프로가드는 안드로이드 스튜디오에서 SDK의 일부로 기본적으로 제공하고 있습니다. Proguard는 무료이지만 유료 버전으로 dexguard도 있어요ㅎㅎ 참고해주세요

프로가드를 적용시켜보자!

어플리케이션을 Proguard를 적용한 경우 / 아닌 경우 2가지로 컴파일 한 뒤 디컴파일하여 차이를 알아보도록 하겠습니다.

프로가드 적용!
gradle(app)에서 다음과 같이 minifyEnabled 를 true로 바꿔줍니다.

  buildTypes {
        debug {
            minifyEnabled true
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

릴리즈한 버전 뿐만 아니라 디버그 한 버전에서도 프로가드가 적용되도록 true하여 개인 개발시에도 프로가드가 적용되는 모습을 확인할 수 있도록 하였습니다.

디컴파일 하기!

단, 이와같이 프로가드를 적용시켰음에도, String 문자열은 그대로 노출되는 경우가 많으므로, 모두 상수화시켜서(value폴더 내의 String으로 모아놓는 등의 방법으로) 보안을 높이는 것을 추천드립니다.

Jadx 사용하는 방법

https://github.com/skylot/jadx/releases/tag/v1.0.0

다운받아서 압축푼다음에 jadx-gui.bat을 실행시켜서 apk을 넣어주면 끝!

프로가드 적용시키기 전 / 후 사진입니다. 살펴보면 확연히 코드 차이가 많이 난다는 것을 확인하실 수 있습니다.


엇.. dedex2jar-2.0를 사용하는 방법은 에러났다 ㅌㅌ


최적화 요인

  1. 컴파일 된 바이트 코드 에서 사용되지 않은 명령어 및 중복 코드를 제거
  2. 제어 흐름 분석 , 데이터 흐름 분석 , 부분 평가 , 정적 단일 할당 , 전역 값 번호 매기기 및 라이브 니스 분석 과 같은 기술을 사용하여 최적화

ETC

자바는 왜 JVM위에서 돌아가나요?
인터넷이 발전하면서 다양한 컴퓨터와 운영체제들이 함께 쓰이기 시작했습니다. JAVA는 이에 발맞추어 개발된 언어로, JVM이라는 가상 운영 체제와 통신하여 사용되기 때문에 운영체제 및 하드웨어와 독립적으로 사용됩니다. 때문에 java로 작성된 프로그램은 JVM이 이해할 수 있는 형식으로 변환되어 전달되며 JVM이 설치된 어느 곳이든 사용할 수 있어 이식성이 보장됩니다.

이러한 중개자 역할을 하는 JVM이 있기 때문에 다른 언어에 비해 속도가 느리다는 단점이 있지만, 메모리관리를 자동으로 해주기 때문에 간편하고 멀티스레딩을 구현하기 용이하다는 장점이 있습니다.
동적로딩을 통해 필요한 라이브러리 클래스를 그 때 그 때 불러와서 사용합니다.

Java프로그램 실행과정

  1. 실행 시 JVM은 OS로부터 메모리를 할당받고
  2. javac가 java code를 바이트코드(.class)로 변환시킵니다.
  3. class Loader가 class바이트코드를 jvm위에 load하고
  4. 로딩된 파일은 execuion engine을 통해 해석되어 runtime data area(1에서 할당받은 메모리)에서 실행됩니다.

레퍼런스

프로가드

  1. 위키피디아
    https://en.wikipedia.org/wiki/ProGuard_(software)
  2. 적용
    https://medium.com/ics-lab/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1-%EB%82%9C%EB%8F%85%ED%99%94-proguard-dexguard-%EB%A5%BC-%ED%95%B4%EB%B3%B4%EC%9E%90-1-%ED%94%84%EB%A1%9C%EA%B0%80%EB%93%9C-%ED%8E%B8-799999a43c4d
  3. 프로가드 공식 홈페이지
    https://www.guardsquare.com/en/products/proguard
  4. 프로가드 source force 소개
    https://sourceforge.net/projects/proguard/
  5. 사전검증이란
    https://code-examples.net/ko/q/1e865c

디컴파일

1. jadx

https://m.blog.naver.com/PostView.nhn?blogId=ndb796&logNo=221162559976&proxyReferer=https%3A%2F%2Fwww.google.com%2F

자바

  1. JVM
    https://asfirstalways.tistory.com/158
반응형