본문 바로가기
SW 개발/Android

Android apk Decompile 과 분석 tool: apktool 사용법

by Kibua20 2021. 1. 14.

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에 대한 설명과 활용 사례는 아래 그림과 유튜브 동영상을 참고해주세요.

Apktool 설명 (출처: https://ibotpeaches.github.io/Apktool/)

 

출처: www.youtube.com/watch?v=9niiMznwV_k

 

 

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사용이 가능합니다.

 

  1. Wrapper script 다운로드 Linux script , Window script , MacOS script(마우스 오른쪽 메뉴로 'apktool.sh'로 저장)
  2. 최신 apktool.jar 파일 다운로드 (최신 apktool.jar)
  3. 다운로드한 Jar파일을 apktool.jar로 이름을 변경
  4. 실행 권한 ($ chmod +x apktool.sh) 추가 및 (필요시) 실행 Path 설정 
  5. 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

 

 

apktool로 디커파일한 결과

 

Java code 확인 방법

apktool은 dex파일을 smali 파일 코드로 변환하기 때문에 코드 분석이 어려울 수 있습니다. Java code로 여러 가지 변환 tool이 있으며 이중에서 GUI로 구성된 Bytecode Viewer 또는 jd-gui사용을 추천드립니다.

 

Bytecode Viewer

$ java -jar Byteocde-Viewer-2.9.22.jar

Bytecode viewer

 

JD-GUI

$ java -jar jd-gui-1.1.6.jar 

jd_gui

 

관련 글

[모바일 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] - Android apkanalyzer 에러: java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema

[모바일 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에 설치하기

 




댓글