Android apk 분석 시 사용할 수 있는 Tool은 크게 Anroid SDK에 포함된 apkanalyzer (사용법 링크), aapt2, SDK 에는 포함되지 않은 Android studio에서 사용된다고 하는 apktool이 있습니다. apktool 은 원래 Apk의 Reverse engineering을 위해서 만든 것으로 Apk를 decode 해서 code를 만들고, 이를 다시 apk를 재 빌드하는 것이 가능합니다.
Apk에 디코딩을 통해서 resources.asrc, class.dex, AndroidManifest, 리소스 xml, png 등을 추출할 수 있습니다. 이 중에서 AndroidManifest를 분석하고 해당 apk의 package name, version code, permission, intent filter 등 기본 정보를 확인할 수 있고, App을 smali (=Dalvik Byte code, DEX 파일을 사람이 읽을 수 있도록 표현) 디컴파일해서 동작 방식을 소스를 통해서 유추할 수도 있습니다.
본 포스트팅은 Apk 분석을 목적으로 하고 디컴파일 툴인 apktool에 대해서 설명하고자 합니다. 추가적으로 Java 코드를 확인하는 것이 목적이라면 dex2jar나 jd-gui, Bytecode Viewer를 활용할 수 있습니다.
※ Apktool을 활용하여 Apk를 재 빌드하는 것은 악성 코드 배포자로 오해를 받을 있으니 불법적인 사용을 하지 않도록 해야 합니다.
Apktool에 대한 설명과 활용 사례는 아래 그림과 유튜브 동영상을 참고해주세요.
PC Java 버전 사전 체크
apktool은 Java로 구현되어 있어 apktool이 구동하기 위해서 Java Version 8 버전 이상이 설치되어 있어야 합니다. java 버전은 $ java -version으로 확인 가능합니다. 만일 java가 설치되어 있지 않는다면 open-jdk를 설치해주세요.
$ java -version
openjdk version "14.0.2" 2020-07-14
→ 8 이상이 나와야 합니다. jre를 설치해야 합니다.
→ $ sudo apt install openjdk-14-jre-headless (우분투)
OpenJDK Runtime Environment (build 14.0.2+12-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 14.0.2+12-Ubuntu-120.04, mixed mode, sharing)
apktool 설치
ApkTool 은 bash or cmd script 파일과 apktool.jar 파일로 구성되어 있습니다. 현시점(2021년 1월)의 가장 최신 버전은 v2.5.0으로 최신 안드로이드 버전인 Android 11 (R-OS)를 지원하고, 문제점도 활발하게 수정 중에 있습니다.
설치 방법은 ibotpeaches.github.io/Apktool/install/에서 script파일과 apktool.jar파일을 다운로드만 하면 apktool사용이 가능합니다.
- Wrapper script 다운로드 Linux script , Window script , MacOS script(마우스 오른쪽 메뉴로 'apktool.sh'로 저장)
- 최신 apktool.jar 파일 다운로드 (최신 apktool.jar)
- 다운로드한 Jar파일을 apktool.jar로 이름을 변경
- 실행 권한 ($ chmod +x apktool.sh) 추가 및 (필요시) 실행 Path 설정
- apktoo.sh 명령어 확인
apktool 명령어 확인
$ apktool.sh을 실행하면 아래와 같이 기본 사용법을 출력합니다. apktool에서 지원하는 기능은 ① Apk decoding 명령어, ② Apk 빌드 명령어, ③ framework.apk 설치의 3가지입니다. Apk 분석을 위해서는 $ apktool.sh decode 명령어를 주로 사용할 예정입니다.
usage: apktool
-advance,--advanced prints advance information.
-version,--version prints the version then exits
usage: apktool if|install-framework [options] <framework.apk>
-p,--frame-path <dir> Stores framework files into <dir>.
-t,--tag <tag> Tag frameworks using <tag>.
usage: apktool d[ecode] [options] <file_apk>
-f,--force Force delete destination directory.
-o,--output <dir> The name of folder that gets written. Default is apk.out
-p,--frame-path <dir> Uses framework files located in <dir>.
-r,--no-res Do not decode resources.
-s,--no-src Do not decode sources.
-t,--frame-tag <tag> Uses framework files tagged by <tag>.
usage: apktool b[uild] [options] <app_path>
-f,--force-all Skip changes detection and build all files.
-o,--output <dir> The name of apk that gets written. Default is dist/name.apk
-p,--frame-path <dir> Uses framework files located in <dir>.
apktool로 Apk Decompile
Apk를 분석하기 위해서 아래와 같이 $ ./apktool.sh deocde [apk file] 명령어를 사용 하여 apk를 Decompile 합니다. 출력하는 로그를 보면 apktool이 어떻게 동작하고 있는지 확인이 가능합니다. 디커파일한 파일은 실제 사람이 이해할 수 있는 언어로 작성되어 있고, /res 하위에는 각종 layout 및 GUI 리소스를 포함하고 있습니다. lib는 native 언어로 구현되어 있어 디커파일이 없이 그대로 압축 해제 상태로 복사만 되어 있습니다.
$ ./apktool.sh deocde com.skt.tmap.ku.apk
I: Using Apktool 2.5.0 on com.skt.tmap.ku.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
→ Resource 파일 중에서 AndroidManifes.xml을 디코딩
I: Loading resource table from file: /home/kibua20/.local/share/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
→ files-resources 디코딩
I: Decoding values */* XMLs...
→ res/ 하위에 xml을 모두 디코딩
I: Baksmaling classes.dex...
I: Baksmaling classes2.dex...
I: Baksmaling classes3.dex...
I: Baksmaling classes4.dex...
→ class.dex 파일을 samli로 디코딩
I: Copying assets and libs...
→ assets과 library파일은 copy
I: Copying unknown files...
I: Copying original files...
I: Copying META-INF/services directory
→ Signing 관련된 파일을 original folder에 copy
Java code 확인 방법
apktool은 dex파일을 smali 파일 코드로 변환하기 때문에 코드 분석이 어려울 수 있습니다. Java code로 여러 가지 변환 tool이 있으며 이중에서 GUI로 구성된 Bytecode Viewer 또는 jd-gui사용을 추천드립니다.
Bytecode Viewer
$ java -jar Byteocde-Viewer-2.9.22.jar
JD-GUI
$ java -jar jd-gui-1.1.6.jar
관련 글
[모바일 SW 개발/REST API] - 자주 사용하는 curl 명령어 옵션과 예제
[모바일 SW 개발/Android] - Android apk의 분석 툴 apktool: Resources.asrc, class.dex, xml, png 분석 가능함
[모바일 SW 개발/Android] - 파이썬으로 Apk Download 자동화: Selenium기반의 Apk 크롤러
[모바일 SW 개발/Android] - 안드로이드 스마트 폰 화면 미러링 방법: scrcpy 사용법
[모바일 SW 개발/Android] - Android 에서 리눅스 App 실행: Linux Terminal Emulator (Termux) 활용
[모바일 SW 개발/Android] - Command line 기반 Android Apk 분석 툴: apkanalyzer
[모바일 SW 개발/REST API] - Google Gmail API 사용 방법 (1) - Sample code
[모바일 SW 개발/Android] - Android 소스 최적화 (100GB에서 65GB로 줄이기)
[모바일 SW 개발/Android] - Soong 빌드 시스템을 활용한 Android.bp 작성법
[모바일 SW 개발/Python] - [Tips] Python: XML Parsing 시 multiple elements on top level
[모바일 SW 개발/Android] - Android 11 기능 소개
[모바일 SW 개발/Android] - Android 11 (R-OS) Emulator에 설치하기
댓글