Dyrandy
[Android Fundamentals, Reversing Tools] 안드로이드 APK 기본 개념 본문
[Android Fundamentals, Reversing Tools] 안드로이드 APK 기본 개념
Dyrandy 2020. 9. 7. 10:53What is an APK?
APK는 Android Package의 약자로 안드로이드 OS에서 사용하는 애플리케이션을 위한 하나의 패키지다.
APK의 파일 시그니처 값을 확인 해보면, ZIP파일과 동일한 값이라는 것을 확인 할 수 있다. (PK)
(그렇다고 ZIP으로 바꾸고 푼다고 100% 정상적으로 풀리는 것은 아니다)
Types of APP
- Pure Native App
- 어떠한 웹 통신을 하지 않고, 오로지 순수 앱 자체만으로 구동하는 앱
- 게임, 간단 기능 앱, 등
- Hybrid App
- Web과 Native를 동시에 사용하는 앱
- 가장 흔하게 볼 수 있는 앱
- 대부분의 웹 취약점들이 요기에도 동일하게 적용 된다
- Web Wrapper App
- App을 통해 Web을 보여주는 역할을 하는 App
- 대부분의 웹 취약점들이 동일하게 적용 된다
- 모바일과 Web Server의 통신을 위한 창구 역할을 한다
** 잘 보면, APK들은 대부분 웹과 밀접한 관련이 있는 것을 알 수 있다. 실제로 현업에서 일을 해보면 웹 취약점들이 고스란히 APP안에서 발견할 수 있고, 그 구조 또한 매우 비슷한 구조로 이루어져있는 것을 확인 할 수 있다.
APK File Structure
APK 파일의 기본 구조는 아래와 같다.
생각보다 많은 구성요소가 없는 것을 확인 할 수 있지만, 그 안에 내용과 코드는 APP마다 다양하다.
구성요소의 내용을 살표보면 아래와 같다.
핵심적으로는 AndroidManifest.xml과 classes.dex가 있겠다. 다른 코딩 프레임워크를 사용해보았으면 Manifest가 먼지 대충 짐작이 갈 것이다.
Manifest 파일은 APP의 구조와 MetaData, 구성요소, 요구사항, 등을 정의한다.
DEX 파일은 안드로이드용으로 작성된 컴파일된 코드가 포함된 형식으로 저장된 실행 파일이다. 기술적으로 'Dalvik Executable'이라고 하며, 달빅 가상 머신으로 해석할 수 있다.
그 외에는 직관적이다.
** APK 파일을 열어보면 Activity라는 파일을 보게 될 것이다. 이것은 MVC구조에서 Controller을 생각하면된다. 어떤 기능들이 어떤 동작을 할 것인지 구현한 부분이고, MainActivity가 가장 기본 Activity가 된다.
How to Reverse APK?
이제 APK 구조를 대충 파악했으니, 실제로 열어보면 된다. APK를 열기 위해서는 다양한 툴들이 존재하지만 핵심으로는 3가지가 있다.
- JADX-GUI: APK파일을 올리면 사람이 읽기 편한 코드형태로 바꾸어 준다. (JAVA 코드) 가장 많이 쓰이는 디컴파일러로 한번에 2단계 (SMALI -> DEX -> JAVA)를 거치기 때문에 편리 하다. 다만 코드 수정은 불가능하다. (IDA와 비슷하다고 보면 된다)
- DEX2JAR: DEX파일 형식을 JAR로 바꿔주는 역할을 한다. 파일 내용을 수정하고 싶을 때 자주 사용한다. (역으로도 가능)
- APKTOOLS: Android Studio를 설치하면 까리는 기본 중에 기본 툴이다. APK를 까서 Smali코드를 보여준다.
*Smali? 이건 assembly언어라고 보면 편하다.
APK Hooking?
APK Hooking은 리버싱에서 사용하는 API Hooking을 생각해주면 편하다. APK파일에서 내가 실행하고자 하는 함수를 호출 할 수 있고, Overwrite/Overload가 가능하고, 변수들을 조작가능하며, 결과값을 열람할 수 있다.
대표적인 APK Hooking 툴로는 Frida가 있다.
** Ross Marks의 FridaLab을 통해 연습 가능하다.
Emulator
안드로이드 가상 환경을 보여주기 위한 일종의 VM이다. 데스크탑에서 안드로이드 파일을 실행 가능하게 해주며, Android Studio, Know, Genymotion등 수 많은 에뮬레이터가 존재한다.
** 개인적으로 안드로이드 스튜디오의 에뮬을 추천하고 그 외에 Root 권한을 획득하기 위한 (Frida사용하기 위해) Genymotion을 추천한다.