본문 바로가기

4-6. 2022-1 심화 스터디/모바일 게임 해킹

[2022.03.12] APK 구조 분석 및 decompile&repackaging

APK?

APK(Android app PacKage) Android 가상머신 (a.k.a. Dalvik) [3] 에서 실행되는 소프트웨어 배포용 패키지 파일이며 ".apk" 확장자를 사용한다.

 

 

APK 내부 구조

내부 확인 방식 : Zip 방식으로 압축 되어 있기 때문에 확장자를 zip으로 변환하고 압축 해제하면 내용물 확인 가능

  1. META-INF : 인증 서명 (sign)과 관련한 정보가 담겨 있는 디렉토리
  2. assets : 입 실행에 필요한 자원들이 저장되는 디렉토리, 동영상같은 상대적으로 용량이 큰 파일 위주
  3. res : 앱 실행에 필요한 자원들이 모여있는 디렉토리, 아이콘 같은 상대적으로 용량이 작은 파일 위주
  4. lib : 라이브러리 파일이 저장되는 디렉토리
  5. AndroidManifest.xml : 설치된 앱의 정보(패키지 명, 버전) 가 저장된파일’, 바이너리 형식의 xml로 인코딩되어 저장되어 있어 내용 바로 확인하기 어려움(디컴파일을 통해 xml 정보 확인 가능) )
  6. classes.dex : .dex 파일은 안드로이드의 가상머신(달빅)이 인식할 수 있도록 .class 파일을 byte 코드로 변환시킨 소스파일
  7. Resources.arsc : rec의 정보들이 기록되어 있음

+) AndroidManifest.xml파일이 중요한 이유는 c/c++언어의 경우 분석 시 main()부터 진행하는데 안드로이드는 main activity oncreate 함수부터 시작된다. Main activity는 이름 변경이 가능한데 모든 activityAndroidManifest.xml파일 내부에 기록되어야 사용가능함. 따라서 AndroidManifest.xml  참조하여 Entry Point를 찾을 수 있음.

 

 

apk 파일 생성 절차 구조도

 

디컴파일: 바이너리를 고급 프로그래밍 언어로 변형하는 것.

리패키징: 소스코드를 수정하고 다시 apk 파일로 만드는 것.

+) 이미 만들어진 apk 파일의 소스를 수정하려면 디컴파일 과정을 무조건 거쳐야 함

 

 

APK decompile&repackaging tool

* apktool: apk 파일을 디컴파일 및 리패키징해주는 도구이다. (https://ibotpeaches.github.io/Apktool/)

* dex2jar, jd-gui: 디컴파일링한 apk 파일을 java 코드로 읽을 수 있게 해주는 도구이다.

(dex2jar: https://code.google.com/p/dex2jar/downloads/list)

(jd-gui: http://jd.benow.ca/)

 

 

**apk 파일 decompile하기**

1. apktool을 사용하여 apk 파일을 decompile한다.

           >apktool d <파일명.apk> -o <디렉토리명>

(완료 후 지정 경로에 생성된 폴더 내에 smali 폴더가 만들어지는데 소스 코드 수정 시 이 폴더 내에 있는 파일을 수정)

 

1-1.        이후 디렉토리에 smali라는 폴더가 생성되는데 이 폴더에 있는 파일에서 소스코드를 수정할 수 있다. 이때 smali 코드를 해석하기 위해 dex2jar jd-gui를 사용한다.

1-2.        Elipse로 소스 코드 수정 (2단계에서 언급한 smali 폴더에 들어가면 jadx-gui로 확인한 소스 코드 경로와 일치하는 경로로 파일들이 존재 -> java 문서 편집기 실행하여 그 경로에 있는 파일을 열어 수정 작업한다. )

 

 

**수정한 apk 파일 repackaging하기**

1. apktool을 사용하여 수정한 파일을 repackaging한다.

           >apktool b <리패키징할 디렉토리명> -o <수정후파일명.apk>

 

 

**apk 서명하기>**

0. 수정한 apk 파일을 안드로이드로 옮겨 실행하면 설치되지 않는다. 이는 apk가 서명되지 않았기 때문이다.

0-1.추가적인 도구 설치 없이 JDK에 포함된 standard tool을 이용해 apk를 서명할 수 있다.

1. keytool을 이용해 key를 만든다.

           >keytool -genkey -v -keystore <keystore> -alias <alias> -keyalg <key알고리즘> -keysize <key사이즈>

2. jarsigner를 이용해 apk 파일에 서명한다.

           >jarsigner -verbose -sigalg <서명알고리즘> -digetalg <digest알고리즘> -keystore <keystore파일> <서명할apk파일> <alias>

 

+) APK파일에 서명하는 이유는 apk파일이 누구에 의하여 서명되었는지 확인이 가능하다. 이로 인해서 apk의 원래 소유자로부터 인증이 가능해진다. 이 과정은 누군가 조작된 apk를 배포하지 목하도록 보안적 이유로 진행한다.