안드로이드 단말기에 모바일 앱을 설치하면 기본적으로 데이터 디렉토리에 APK 파일이 존재한다. adb 도구로 APK 파일을 로컬 PC로 추출 후 취약점 분석 환경에 맞게 디컴파일을 해야 한다.
기본적인 환경 구성은 apktool 도구로 APK 파일을 디컴파일을 하고, dex2jar 도구로 APK 파일을 jar 파일로 변환하고, jd-gui 도구로 jar 파일을 자바 소스코드로 변환된 상태에서 분석한다.
다양한 모바일 앱을 취약점 분석할 때마다 APK 파일 추출 > apktool > dex2jar > jd-gui 반복적인 과정을 수행해야 한다.
하지만, jadx 도구는 반복적인 과정을 단 한번에 수행할 수 있도록 세 가지 도구의 기능이 모두 합쳐있어 쉽게 소스코드를 변환할 수 있다.
jadx 도구로 디컴파일을 하는 방법을 소개하기 전 앞서 소개한 APK 파일 추출부터 세 가지 도구를 이용한 분석 환경부터 알아본다. 이후 jadx 도구를 이용했을 때 어떤 편리점이 있는지 생각해보자.
APK 파일 추출
안드로이드 단말기에 설치되어 있는 모바일 앱의 APK 파일은 기본적으로 /data/app/패키지이름 디렉토리에 저장된다. APK 파일을 로컬 PC로 다운로드 하는 방법은 여러가지 있지만 분석가라면 기본적으로 ADB 도구를 설치해서 사용한다.
ADB(Android Debug Bridge)는 로컬 PC에서 안드로이드 단말기를 제어하기 위한 용도로 사용한다.
예를 들면 로컬 PC에서 cmd를 실행해서 "adb shell"을 입력하면 안드로이드 단말기에 접속하여 쉘 명령어를 실행할 수 있다.
이 외에도 안드로이드 단말기에 APK 파일 설치, 추출, 삭제, 실행, 종료, 컴포넌트 실행, 포트 포워딩 등 다양한 기능을 수행할 수 있다.
로컬 PC에서 adb shell 명령어를 입력하여 안드로이드 단말기의 쉘에 접속한다. 추출할 APK 파일이 존재한 디렉토리로 이동하여 절대 경로를 구하고, "adb pull APK 파일이 존재한 절대경로" 명령어를 입력하면 로컬 PC로 다운로드 된다.
D:\tmp_download\1>adb shell
root@vbox86p:/ # cd /data/app
root@vbox86p:/data/app # ls
ApiDemos
GestureBuilder
com.a-1
com.android.insecurebankv2-1
com.android.vending-1
com.ext.ui-1
com.google.android.gms-2
com.magdalm.apkextractor-2
com.mwr.dz-1
vmdl2132399764.tmp
root@vbox86p:/data/app #
root@vbox86p:/data/app # exit
D:\tmp_download\1>adb pull /data/app/com.android.insecurebankv2-1
/data/app/com.android.insecurebankv2-1/: 1 file pulled. 34.3 MB/s (3545969 bytes in 0.099s)
D:\tmp_download\1>dir /b
base.apk
APK(Android Application Package) 파일은 모바일 앱을 설치할 때 사용하는 파일로 zip 형태로 압축되어 있다. 추출한 APK 파일을 압축 프로그램으로 열어보면 인증 파일, 리소스 파일, AndroidManifest.xml 파일, dex 파일이 포함되어 있다.
- META-INF : 모바일 앱의 배포자 관련 인증
- res : 모바일 앱의 리소스
- AndroidManifest.xml : 모바일 앱의 전반적인 정보, 권한, 패키지 이름, 컴포넌트 정보
- classes.dex : 달빅(Dalvik) 가상 머신에서 동작하는 실행 파일, 기계어 코드
apktool : APK > 디컴파일
apktool 도구는 APK 파일을 디컴파일을 하거나 리패키징을 할 때 사용한다. apktool d APK파일 명령어를 입력하면 디컴파일이 되고, apktool b APK파일 명령어를 입력하면 리패키징이 된다.
디컴파일을 하면 기계어 코드로 구성된 classes.dex 파일을 사람이 알아보기 쉽게 소스코드 형태로 변환하여 res, smali, AndroidManifest.xml 등의 파일이 생성된다.
smali 파일은 dex 파일과 자바 파일의 중간 형태로 사람이 알아보기 쉽게 변환된 코드이다. 해당 파일의 코드를 변조함으로써 모바일 앱 변조 현상이 발생한다.
D:\tmp_download\1>apktool d base.apk
I: Using Apktool 2.4.0 on base.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\Administrator\AppData\Local\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Baksmaling classes2.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
dex2jar : APK > jar
dex2jar(dex to jar)는 APK 파일(dex 파일)을 자바 가상머신에서 이해할 수 있는 기계어 코드(jar 확장자)로 변환한다. dex2jar APK파일 명령어를 입력하면 jar 파일이 생성된다.
D:\tmp_download\1>dex2jar base.apk
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.15
dex2jar base.apk -> base_dex2jar.jar
Done.
D:\tmp_download\1>dir /b
base
base.apk
base_dex2jar.jar
jd-gui : jar > 자바 소스코드
jd-gui 도구는 jar 파일을 사람이 이해할 수 있는 자바 소스코드로 변환해서 그래픽 환경으로 보여준다.
jd-gui 도구를 실행하고 jar 파일을 드래그 앤 드롭하면 자바 소스코드를 확인할 수 있다. jd-gui 도구를 그래픽 환경으로 자바 소스코드를 확인할 수 있는 장점이 존재하지만 검색 및 치환 기능이 부족하다.
또한, 자바 클래스 파일만 파싱해서 보여주므로 APK 파일 내부에 존재하는 AndroidManifest.xml 파일은 확인할 수 없다.
jadx-gui : APK > 자바 소스코드
jadx-gui 도구를 실행하면 Open file 창이 나타난다. 해당 도구가 지원하는 파일의 유형은 jadx, apk, dex, jar, class, smali, zip, aar, arsc 파일이다. 파일 이름 입력 폼에 분석할 APK 파일을 지정하고 Open file 버튼을 클릭한다.
jadx 기능
○ APK, dex, aar, zip 등 파일을 자바 소스코드로 변환
○ AndroidManifest.xml, 리소스 파일 확인
○ 난독화 해제 지원
○ 함수 선언부 이동
○ 소스코드 하이라이팅
○ 키워드 검색
APK 파일을 선택하면 자동으로 디컴파일을 하여 원본 수준의 자바 소스코드를 확인할 수 있으며, 하단의 AndroidManifest.xml 파일의 내용도 확인할 수 있다.
안드로이드 앱은 소소코드 보호를 하려고 난독화를 적용한다. jadx-gui 도구에서 100% 완벽한 수준으로 난독화 해제를 할 수는 없지만 어느 정도 알아보기 쉽게 해제할 수 있다.
※ 난독화 해제 : Tools > Deobfuscation
jadx는 gui, cli 두 가지 형태로 배포하고 있는데 이에 대한 구체적인 설명과 사용법은 배포자의 깃허브 사이트에서 확인하기 바란다.
▶ 안드로이드 컴포넌트 취약점 (Android Activity)
▶ 안드로이드 컴포넌트 취약점 (Android Broadcast Receiver)
▶ 안드로이드 컴포넌트 취약점 (Android Content Provider)
▶ 안드로이드 백업 취약점 (Android Backup)
▶ 안드로이드 루팅 탐지 우회 (Frida Hooking)
▶ 안드로이드 로컬 암호화 취약점 (Android Local Encryption)
▶ 안드로이드 웹뷰 취약점 (Android Webview)
▶ 안드로이드 SD카드 저장소 취약점 (Android SDCard Storage)
▶ 안드로이드 하드코딩 취약점 (Android Hardcoded Secrets)
▶ 안드로이드 HTTP 통신 취약점 (Android Insecure HTTP Connections)
▶ 안드로이드 사용자 계정 목록화 취약점 (Android Username Enumeration)
▶ 안드로이드 개발자 백도어 취약점 (Android Developer Backdoors)
▶ 안드로이드 인시큐어뱅크 앱 설치 (Android InsecureBankv2)