본문 바로가기
  • 안아주는 다람쥐
seKUrity_Study : Andriod

[Andriod] apk는 왜 디컴파일이 가능한가?

by Sapphire. 2023. 3. 14.

1.  컴파일 ( Compile ) 이란?

먼저 프로그램을 분해하는 디컴파일에 대해 알아보기 전에 디컴파일의 반댓말인 컴파일에 대해서 알아봅시다. 컴파일이란 큰 개념에서 보자면 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정을 말합니다.

자바나 C 같은 원시 코드에서 목적코드(목적 파일) 로  바꾸어 주는 것을 컴파일 이라고 하고, 목적 파일을 실행 파일로 만드는것이 링크 라고 볼수 있습니다. 여기서 원시 코드는 우리가 작성한 코드, 그리고 목적코드는 컴퓨터가 이해할수 있도록 번역한 코드입니다.

 

2. 디컴파일 (Decompile ) 이란?

앞서 컴파일에 대해 알아 보았기 때문에 이어서 디컴파일에 대해 알아봅시다. 디컴파일은, 위에서 말한 컴파일의 반대로라고 보면 됩니다.  기계어 전용으로 적혀져 있는 프로그램들을, 인간이 볼수 있는 원시코드로 바꾸어 주는 작업을 디컴파일이라고 부릅니다. 디컴파일은 다른말로 "리버스 엔지니어링" 혹은 "역공학" 라고 부르기도 합니다.

 

3. apk 파일이란?

Android 패키지 파일(.apk)은 애플리케이션이 Android 기기에서 실행하는 데 필요한 모든 데이터와 리소스가 포함된 압축 보관 파일입니다. 

APK 파일은 일반적으로 개발자가 앱을 다른 사람과 공유하거나 Google Play에 업로드하려고 할 때 생성됩니다. 기본적으로 APK 파일은 휴대폰이나 태블릿에 앱을 설치하는 데 사용됩니다.

 

4. apk가 디컴파일이 가능한 이유

 

APK 파일은 원래 소스 코드로 다시 변환할 수 있는 형식의 컴파일된 코드를 포함하므로 디컴파일할 수 있습니다. 이는 APK 파일이 Java로 작성되고 DVM(Dalvik Virtual Machine)을 사용하여 Android 기기에서 실행되기 때문에 가능합니다.

APK 파일이 설치되면 DVM은 컴파일된 코드를 Dalvik 바이트코드로 변환합니다. 이 바이트코드는 JVM(Java Virtual Machine)에서 사용하는 바이트코드와 유사하며 Apktool 또는 JADX와 같은 도구를 사용하여 원래 소스 코드로 쉽게 디컴파일할 수 있습니다.

또한 Android 운영 체제의 보안 모델에서는 APK 파일을 실행하기 전에 확인해야 합니다. 이 확인 과정에서 APK 파일의 내용을 검사하며 디컴파일이 가능할 수 있습니다.

경우에 따라 개발자는 개발 프로세스 중에 디버깅 및 테스트를 용이하게 하기 위해 APK 파일을 디컴파일할 수 있도록 선택할 수도 있습니다.

전반적으로 APK 파일을 디컴파일하는 기능은 Android 플랫폼의 디자인과 애플리케이션 실행 방식, 개발자의 선택에 따른 결과입니다.

 

디컴파일의 원리? 

APK 디컴파일의 원리는 APK 파일에서 원본 소스 코드를 추출하기 위해 소스 코드를 바이너리 파일로 변환하는 과정을 역순으로 수행하는 것입니다.

Android 앱을 개발할 때 소스 코드는 Java, Kotlin 또는 C++와 같은 프로그래밍 언어로 작성됩니다. 이 소스 코드는 Android 기기의 DVM(Dalvik Virtual Machine)에서 실행할 수 있는 바이트코드로 컴파일됩니다.

컴파일된 바이트 코드는 이미지 및 오디오 파일과 같은 다른 리소스와 함께 APK 파일에 포함된 후 사용자에게 배포됩니다.

APK 파일을 디컴파일하기 위해 Apktool 또는 JADX와 같은 도구를 사용하여 APK 파일에서 바이트 코드를 추출하고 다시 Java 소스 코드로 변환합니다.

그러나 이 프로세스로 인해 항상 완전한 기능의 소스 코드가 생성되는 것은 아닙니다. 원본 소스 코드의 일부 요소는 컴파일 과정에서 손실되거나 쉬운 디컴파일을 방지하기 위해 개발자가 난독화할 수 있습니다.

전반적으로 APK 디컴파일의 원칙은 앱의 기능에 대한 통찰력을 얻고 잠재적으로 앱을 수정하기 위해 도구를 사용하여 컴파일된 바이트코드를 추출하고 다시 소스 코드로 변환하는 것과 관련됩니다.

 

5. 안드로이드를 디컴파일 하는 방법

APK 파일의 디컴파일 또는 리버스 엔지니어링은 생각보다 복잡하지 않습니다. 이를 위해 사용할 수 있는 몇 가지 무료 및 오픈 소스 APK 디컴파일러 도구가 있습니다. 그러나 가장 인기 있는 세 가지는 다음과 같습니다.
1.JADX
2.앱툴
3. Bytecode Viewer
기본적으로 이러한 각 APK 디컴파일러는 다르게 작동하며 고유한 장단점이 있습니다. 따라서 요구 사항에 따라 선택해야 합니다.
예를 들어 JADX는 빠르고 편리하지만 출력에서 ​​리소스 파일이 부분적으로 누락되는 경우가 있습니다. 따라서 JADX에는 몇 가지 안정성 문제가 있습니다. 반면 Apktool은 완전한 리소스 파일과 함께 소스 코드를 자세히 반환합니다.
마찬가지로 Bytecode Viewer는 파일을 더 느리게 분석하지만 6개의 디컴파일러, 2개의 어셈블러, 3개의 디스어셈블러, 2개의 APK 변환기 등과 같은 더 많은 기능을 제공합니다.


출처 :

https://hackernoon.com/apk-decompilation-a-beginners-guide-for-reverse-engineers

 

APK Decompilation: A Beginner's Guide for Reverse Engineers | HackerNoon

APK decompilation is the process of reverse engineering an APK file to retrieve its source code. It is useful for understanding how an Android app works.

hackernoon.com