APK란?
APK(Android app PacKage)는 Android 가상머신 (a.k.a. Dalvik) [3] 에서 실행되는 소프트웨어 배포용 패키지 파일이며 ".apk" 확장자를 사용한다.
APK 내부 구조
내부 확인 방식 : Zip 방식으로 압축 되어 있기 때문에 확장자를 zip으로 변환하고 압축 해제하면 내용물 확인 가능
- META-INF : 인증 서명 (sign)과 관련한 정보가 담겨 있는 디렉토리
- assets : 입 실행에 필요한 자원들이 저장되는 디렉토리, 동영상같은 상대적으로 용량이 큰 파일 위주
- res : 앱 실행에 필요한 자원들이 모여있는 디렉토리, 아이콘 같은 상대적으로 용량이 작은 파일 위주
- lib : 라이브러리 파일이 저장되는 디렉토리
- AndroidManifest.xml : 설치된 앱의 정보(패키지 명, 버전) 가 저장된 ‘파일’, 바이너리 형식의 xml로 인코딩되어 저장되어 있어 내용 바로 확인하기 어려움(디컴파일을 통해 xml 정보 확인 가능) )
- classes.dex : .dex 파일은 안드로이드의 가상머신(달빅)이 인식할 수 있도록 .class 파일을 byte 코드로 변환시킨 소스 ‘파일’
- Resources.arsc : rec의 정보들이 기록되어 있음
+) AndroidManifest.xml파일이 중요한 이유는 c/c++언어의 경우 분석 시 main()부터 진행하는데 안드로이드는 main activity에 oncreate 함수부터 시작된다. Main activity는 이름 변경이 가능한데 모든 activity는 AndroidManifest.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를 배포하지 목하도록 보안적 이유로 진행한다.
'4-6. 2022-1 심화 스터디 > 모바일 게임 해킹' 카테고리의 다른 글
[2022.05.14] 치트엔진으로 포켓몬스터 파이어 레드 게임 해킹하기 (0) | 2022.05.14 |
---|---|
[2022.05.07] 치트 엔진(Cheat Engine)을 활용한 게임 해킹 강좌 (0) | 2022.05.14 |
치트 엔진(Cheat Engine)을 활용한 게임 해킹 강좌 튜토리얼 1~5 정리 (0) | 2022.04.04 |
[2022.03.26] 모바일 게임 해킹(Unity편) - Part 2.2 ~ Part 3.2 (0) | 2022.03.27 |
[2022.03.19] 모바일 게임 해킹(Unity편) - Part 0 ~ Part 2.1 (0) | 2022.03.19 |