APKTool과 디컴파일
1. apktool이란?
: 안드로이드 어플리케이션의 APK 파일을 디컴파일하여 리소스 파일과 소스 코드를 추출하는 데 사용되는 오픈 소스 도구이다.
- 난독화가 수행된 안드로이드 앱의 개발 코드를 원복 수준의 형태로 되돌릴 수 있게 도와주며, 앱을 다시 설치하여 실행시킬 수 있게 도와주는 역공학 도구이다.
-> 이 도구 사용하면 거의 오리지널 코드에 가깝게 디컴파일 할 수 있다.
+) 역공학(리버스 엔지니어링) : 프로그램을 복제하거나 기능 향상, 유지보수 등을 위해 분해해보는 과정이다. (역공학 단계에서 중요한 역할을 하는 것이 디컴파일 과정)
- AKP?
: 안드로이드 플랫폼에서 어플리케이션 설치를 위해 배포되는 패키지 파일이다.
- ZIP 파일 포맷 형태로 구성되어 있으며, 다양한 구성 요소들을 포함하고 있다.
<APK의 구성 요소>
- AndroidManifest.xml : 어플리케이션에 대한 설명 및 실행권한 등의 정보를 가진 파일이다.
- calsses.dex : 달빅 가상머신에서 동작하는 바이너리 실행 파일이다.
- /res : 컴파일되지 않은 리소스 파일들이 포함된 폴더이다.
- assets : 앱 실행에 필요한 자원들이 저장되는 디렉토리이다. (주로 용량이 큰 파일이 저장된다.)
- META-INF : 배포시 인증서로 서명한 내용이다.
- resources.arse : 컴파일된 리소스 파일이다.
- lib : 라이브러리 파일(*.so)이 저장되는 디렉토리이다.
+) 이미 만들어진 APK 파일의 소스를 수정할 수 있다.
수정하기 위해서는 먼저 디컴파일을 진행하여 수정하고, 수정이 끝나면 다시 앱으로 사용할 수 있도록 리패키징 과정을 통해 apk로 만들어줘야 한다.
- 디컴파일 : APK 파일이 어떤 소스들로 구성되어 있는지 확인하는 과정
- 리패키징 : 소스를 수정하고 다시 APK 파일로 만들어내는 과정
2. 디컴파일
디컴파일이란?
컴파일과는 반대로, 실행 가능한 프로그램 코드를 사람이 읽을 수 있는 고급 프로그래밍 언어로 변환하는 것이다.
- 역공학(리버스 엔지니어링)이라고도 부른다.
+)컴파일 : 사람이 이해할 수 있는 언어를 컴퓨터가 이해할 수 있는 언어(기계어)로 바꿔주는 것이다.
디컴파일의 원리
디컴파일의 원리를 이해하기 위해서는 컴파일 과정에 대해 먼저 이해가 필요하다.
예를 들어, C#이나 자바는 소스 코드를 바이트코드(중간언어)로 컴파일한 후, 이를 기계어로 변환한다.
-> 여기서 바이트코드를 역어셈블하여 사람이 알 수 있도록 변환하는 것이 바로 디컴파일이다.
<안드로이드에서 디컴파일>
안드로이드는 APK파일을 가지고 디컴파일이 가능하다.
APK 파일은 자바 기반으로 이루어져 있기 때문에 소스코드를 컴파일한 후 바이트코드를 디컴파일할 수 있다.
APK 파일을 디컴파일하는 방법은 다양하다. 앞에서 말한 방식인 apktool을 사용하여 하거나, apk 파일을 저수준 언어(smail 코드)로 디컴파일 가능하다.
디컴파일을 하는 이유
디컴파일은 소스 코드를 더 이상 사용할 수 없을 때 컴퓨터 코드에서 수행 가능하다. 추가적으로 컴퓨터 보안, 상호 운용성 및 오류 수정을 위해 디컴파일을 사용한다.
<디컴파일이 사용되는 경우>
1. 손실된 소스 코드를 복구하는 경우
2. 새로운 하드웨어 플랫폼으로 어플리케이션 마이그레이션하는 경우
3. 프로그램에서 바이러스 또는 악의적인 코드의 존재 여부를 결정하는 경우
4. 응용 프로그램 소유자가 수정할 수 없는 상황에 오류 수정을 위한 경우
5. 다른 사람의 소스 코드를 복구하는 경우
'Android - 이론' 카테고리의 다른 글
안드로이드 부팅 시 작동 순서 (0) | 2023.03.20 |
---|---|
JNI와 NDK (0) | 2023.03.11 |
안드로이드에서 사용하는 자바와 코틀린 (0) | 2023.03.10 |
안드로이드 개념 및 4대 구성요소 (0) | 2023.03.08 |