Android 소스 난독화, 꼭 필요한 걸까?

Android 앱 소스 난독화가 무엇인지, 왜 필요한지, 난독화 라이브러리에는 어떤 것이 있는지, 그리고 적용 시 어떤 장점이 있는지에 대한 내용을 정리해 보았습니다.

작성일 2023년 05월 08일

안녕하세요.
IMQA 개발팀 SDK 파트에서 Android SDK를 개발하는 김성윤 연구원입니다.

Android 앱 개발을 하다 보면 'Android 앱 소스 난독화를 적용해달라'는 요청을 한 번씩은 들어보실 텐데요. 이번 글에서는 Android 앱 소스 난독화가 무엇인지, 왜 필요한지, 난독화 라이브러리에는 어떤 것이 있는지, 그리고 적용 시 어떤 장점이 있는지에 대한 내용을 공유하고자 합니다.

Android 소스 난독화란 무엇일까?

“앱의 소스 코드를 난독화하는 기술”

안드로이드 앱 소스 난독화는 안드로이드 앱의 소스 코드를 분석하기 어렵게 만들기 위한 기술입니다. 이를 통해 앱의 소스 코드를 더욱 안전하게 보호할 수 있습니다.

아래 이미지처럼 소스 코드 난독화를 사용하면 디컴파일러가 코드를 해석하기 어려워지므로, 해커가 앱의 코드를 이해하고 악성 기능을 추가하는 것을 어렵게 만들 수 있습니다.

  • 난독화 전
  • 난독화 후

대표적으로는 ProGuard가 있으며, 이를 사용하면 코드의 변수 이름, 메소드 이름, 클래스 이름 등을 변경하고 불필요한 코드를 제거하여 앱의 크기를 줄이고, 디컴파일러로부터 보호할 수 있습니다. 또한 DexGuard와 같은 상용 소프트웨어를 사용하여 앱의 보안 수준을 높일 수도 있습니다.

Android 소스 난독화, 꼭 필요한 걸까?

안드로이드 앱의 보안 수준을 높일 수 있다..? 굳이 배포된 앱의 소스 코드를 보호해야 하는 이유가 있을까요?

이 부분에 대해서는 예시 상황을 통해 알아보겠습니다.

앱 난독화 미적용으로 인한 가짜 앱과 고객 정보 유출?

모바일 안드로이드 마켓에서 유명 앱을 내려받은 가정주부 박모씨는 최근 집으로 날라온 신용카드 명세서를 받아보고 깜짝 놀랐다. 전혀 사용한 적 없는 현금서비스와 물품거래 등으로 수천만원에 달하는 카드값이 청구됐기 때문이다.
영문을 몰라 경찰 수사를 의뢰한 결과, 해당 앱에서 수차례 결제한 것이 화근이었다. 사용한 앱이 뒤늦게 가짜 앱인 것으로 드러난 것이다. 가짜 앱을 통해 박씨의 카드 개인정보가 해커에게 모조리 넘어갔던 것으로 나타났다.

(위 내용은 난독화 없는 앱에 대한 문제를 다룬 기사에서 언급한 가상 상황입니다.)

위와 같이 이미 서비스하고 있는 앱과 완전히 똑같은 앱이 Google Play Store에 배포될 수 있을까요?

누구나 따라 만들 수 있어요.

Play Store에 배포된 Android 앱의 경우, 누구나 자유롭게 해당 앱을 다운로드 받아 APK를 추출하는 건 누구나 가능합니다. 개발자가 아닌 일반 사용자도 구글링만 해도 충분히 할 수 있습니다.

여기서 추출된 APK를 디컴파일(Decompile)하여 소스 코드를 보는 것도 dex2jar, JD-GUI 등 라이브러리를 통해 진행할 수 있습니다.

이 말은 즉, 만약 소스 코드가 난독화 되어있지 않을 경우, 악의를 가진 사용자가 해당 앱을 다운로드 받아 APK를 추출하고 디컴파일하여 해당 소스 코드를 그대로 가져와서 앱을 출시할 수 있다는 의미겠죠.

그럼, 위 상황을 보았을 때 여러분은 앱 소스 난독화가 선택 사항이라고 생각하시나요? 아마 이젠 앱을 배포하게 될 경우 앱 소스 난독화는 꼭 필요하다고 느끼실 겁니다.

실제 난독화 되지 않은 APK를 디컴파일하는 과정

지금부터 익명의 해커가 되어 난독화 되지 않은 앱의 소스 코드를 가져오는 과정을 보여드리겠습니다.

1. Play Store에서 APK Extractor 다운로드

Play Store에서 APK Extractor 다운로드

2. APK Extractor를 실행하여 설치된 앱 중 APK로 추출할 앱 선택
(해당 앱은 예시 앱으로 IMQA는 별도의 앱 서비스를 운영하고 있지 않습니다.)

APK Extractor를 실행하여 설치된 앱 중 APK로 추출할 앱 선택

3. APK 추출

APK 추출

4. dex2jar 다운로드

5. 터미널을 통해 해당 경로 이동

터미널을 통해 해당 경로 이동

6. 아래 명령어를 통해 APK 파일에서 jar 파일 추출

아래 명령어를 통해 APK 파일에서 jar 파일 추출

7. jar 파일 추출 확인

jar 파일 추출 확인

8. jar 파일 압축 해제

jar 파일 압축 해제

9. 압축 해제 후 소스 코드가 나오는 것을 확인

압축 해제 후 소스 코드가 나오는 것을 확인

10. IDE (intelij) 를 통해 해당 경로를 열어 소스 코드 내용 확인

IDE (intelij) 를 통해 해당 경로를 열어 소스 코드 내용 확인

이런 식으로 큰 시간을 들이지 않고 매우 간단하게 소스 난독화를 처리하지 않은 앱의 소스 코드를 확인할 수 있습니다.

Android 소스 난독화 라이브러리는 어떤 것이 있을까?

지금까지 Android 소스 난독화에 대해 알아보았습니다. 그렇다면 소스 난독화를 해주는 라이브러리는 어떤 것이 있을까요?

Android 앱 소스를 난독화해주는 대표적인 라이브러리로는 ProguardAllatori가 있습니다.

Proguard는 Android Studio 내에서 제공해 주는 무료 라이브러리로 Android에서 기본적으로 제공하는 기능입니다. Proguard의 기능으로는 코드 난독화, 코드 최적화, 리소스 압축, 디버깅 정보 제거 등이 있습니다.

Allatori는 코드 난독화, 리소스 암호화, 디버깅 정보 제거 기능들이 있습니다.

두 가지 라이브러리의 난독화 기능을 비교하기 위해 간단하게 난독화 종류에 대해 간단히 정리해 보았습니다.

  • 식별자 난독화 (Renaming): 식별자 변환, 클래스/메소드의 이름을 특정 키워드로 대체(a,b,c,  aab, abc 등)
  • 제어 흐름 변환 (Control Flow): 기존 A->B로 되어있는 로직 순서를 A-C-B 형태로 중간에 다른 구문을  추가하는 기법
  • 문자열 암호화 (String Encrption): 문자열을 암호화된 문자열로 대체하고 사용 시 치환
  • API 은닉 (API Hiding): 특정 라이브러리, 함수 호출을 Reflection으로 대체하여 숨김 처리
  • 클래스 암호화 (Class Encrption) : 클래스 파일 내용 전체를 암호화하여 저장해 두었다가 동적으로 복호화

그럼, Proguard와 Allatori가 어떤 난독화를 지원하는지 알아볼까요?

Proguard Allatori
식별자 난독화 (Renaming) O O
제어 흐름 변환 (Control Flow) X O
문자열 암호화 (String Encrption) X O
API 은닉 (API Hiding) X X
클래스 암호화 (Class Encrption) X X

이렇게 비교해서 보면 소스 코드 난독화로 봤을 때 Allatori가 좀 더 앱 보안에 있어서 좀 더 좋은 것 같죠?

하지만 Allatori는 Proguard와 다르게 무료가 아닌 유료 라이브러리입니다. 또한 Allatori는 Android 소스 난독화 외에도 자바 어플리케이션 난독화에 주로 사용됩니다.

이 외에도 API 은닉, 클래스 암호화를 지원하는 난독화 라이브러리로는 DexGuard가 있습니다. 이 라이브러리는 Proguard의 업그레이드 버전으로 유료입니다. (앱 보안을 위해선 어쩔 수 없이 돈을 써야 하는 현실..)

Proguard를 통한 난독화 적용 확인하기

실제로 Proguard를 적용하여 난독화 적용 전/후 비교를 통해 어떤 식으로 확인할 수 있는지 볼까요?

우선 난독화를 적용하지 않고 Android Studio에서 제공해 주는 APK Profiling 기능을 통해 APK를 Profiling해서 보겠습니다.

단순히 APK를 Android Studio에서 Proifling 기능을 통해 열어줬을 뿐인데도 해당 APK 안에 class 파일명이 무엇인지 확인이 가능하죠? 그럼, 난독화를 적용했을 경우에는 어떤식으로 확인할 수 있는지 보겠습니다.

난독화가 적용되어있을 경우 이런 식으로 어떤 클래스 파일인지, 어떤 패키지 com.imqa.sample인지 전혀 알 수 없다는 것을 확인할 수 있습니다.

한 개의 난독화 라이브러리만 사용하지 않는 경우도 있어요.

현재는 예제로는 간단하게 Proguard만 적용하여 보여드렸지만, 금융권 앱 같은 경우에는 한가지 라이브러리만 적용하는 것이 아니라 여러 가지 난독화 라이브러리를 적용하여 앱 소스가 유출되지 않게 하고 있습니다.

잘 되던 기능들이 안 될 수 있어요.

Proguard나 Allatori와 같은 소스 난독화 라이브러리를 적용하게 되면 잘 동작했었던 기존 로직들이 동작하지 않거나 앱 내에서 Crash가 발생하여 앱이 종료되는 현상이 발생할 수 있습니다. 그래서 난독화를 적용하게 되는 경우 QA도 확실하게 진행해 주셔야 합니다!

IMQA SDK 설치 지원을 하면서 앱 소스 난독화가 적용되어 있지 않은 고객사를 본 적이 없었습니다. 뿐만 아니라 여러 가지 난독화 라이브러리를 섞어서 사용하는 곳도 있었습니다. 그만큼 앱 소스 난독화가 앱 서비스를 운영하는 데 있어 얼마나 중요한 건지 이번 글을 쓰면서 다시 느꼈습니다.

이번 포스팅이 Android App 개발자들에게 도움이 이번 포스팅이 도움이 됐길 바랍니다.

* IMQA에서는 Proguard, Allatory를 비롯한 난독화된 앱도 문제 없이 모니터링할 수 있는데요. IMQA의 기능은 블로그 > IMQA이야기에서 자세히 확인하실 수 있습니다.


IMQA와 관련하여 궁금하신 사항은 언제든 아래 연락처로 문의해 주시면 상세히 안내해 드리겠습니다. 이미지를 클릭하시면 1:1 채팅 창으로 이동합니다.

  • 02-6395-7730
  • support@imqa.io
IMQA 가격 안내 배너

Share on

Tags

IMQA 뉴스레터 구독하기

국내외 다양한 기술 소식을 선별하여 매월 전달해드립니다. IMQA 뉴스레터를 통해 기술 이야기를 함께해보세요.

구독하기