안드로이드 설치 파일(APK) 역공학 환경 구성
gomguk.tistory.com/16에서 작성한 앱을 역공학으로 분석해보고 동시에 apk 구조에 대한 학습
다운로드 및 설치
- APK Tool(apk → smali)
-
java 1.8 버전 이상 필요 java -version
-
apktool -v 설치확인
- Dex2Jar(dex → jar)
- https://sourceforge.net/projects/dex2jar/
- brew로도 설치 가능 brew install dex2jar
- 디컴파일 d2j-dex2jar [apk파일명]
- JD-GUI (jar → java)
위 방법으로 분석이 안될 때
- 바이트 코드 뷰어나 Jadx로 코틀린 코드 분석이 어렵다면
- 안드로이드 스튜디오 - Tools - Kotlin - Show Kotlin Bytecode
- 안드로이드 스튜디오 - Build - Analyze APK
APK Build 및 분석
APK 난독화 옵션인 Proguard 설정 없이 APK를 빌드한다.
- apk파일을 dex2jar 폴더 하위 경로로 이동
- 터미널을 열어 dex2jar 경로로 이동
- 디컴파일 명령 실행
- sh d2j-dex2jar.sh [APK 파일명]
- sh d2j-dex2jar.sh
APK 구조
-
DEX(Dalvik Executable): 달빅 코드
- 명시적인 class, method 형태
-
.so (Native Library) : 네이티브 코드
- 자바에서 C로 만들어진 코드를 호출할 때의 규약
-
AndroidManifest.xml : App metadata, Service, Activity
-
앱권한, 액티비티 목록, Intent-filter, Service목록
-
Intent? - 서로 영역에 침범할 수 없는데 필요에 따라서 공유를 해야할 때 사용
다른 앱, 같은 앱 내에서 Intent로 통신
-
-
Layout
- res/layout에 xml파일로 존재
- 가독성이 높지 않고 계층 구조를 알기 어렵지만 기능을 어떻게 구현 했는지 힌트 제공
분석
분석 전에 Flutter의 구조는 다음과 같다.
Dart 언어로 된 프레임워크로 앱을 코딩하여 C/C++ 엔진을 이용하여 컴파일한다. 다트 언어는 Ahead Of Time(AOF) 컴파일을 통해서 C, C++ 처럼 바이트 코드로 작성한다.
AndroidManifest.xml
URI Scheme 사용을 위한 intent-filter가 등록되어 있다.
MainActivity.class
앱이 실행될 때 시작점이다. AndroidManifest.xml에 클래스 명이 명시되어 있다.
URI 스키마를 통한 이벤트 채널 입력을 설정하고 이벤트 처리 구문을 확인한다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val intent = getIntent()
startString = intent.data?.toString()
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (intent.action === Intent.ACTION_VIEW) {
linksReceiver?.onReceive(this.applicationContext, intent)
}
}
fun createChangeReceiver(events: EventSink): BroadcastReceiver? {
return object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { // NOTE: assuming intent.getAction() is Intent.ACTION_VIEW
val dataString = intent.dataString ?:
events.error("UNAVAILABLE", "Link unavailable", null)
events.success(dataString)
}
}
}
[원본코드]
- onNewIntent를 오버라이드해서 각 Intent를 처리하고, 딥 링크 후속 작업인 경우 Broadcast Receiver를 통해 eventChannel로 보낸다.
- 컴파일 되면서 구조는 약간 변경되었지만 동일한 기능 수행
반응형
'Security > Mobile' 카테고리의 다른 글
[Frida] 안드로이드 루팅 탐지 우회하기 2 (0) | 2020.12.24 |
---|---|
[Frida] 안드로이드 루팅 탐지 우회하기 (4) | 2020.12.23 |
[Flutter] Webview, JSInterface 통신하기 (0) | 2020.11.20 |
[Flutter] URI Scheme 사용하는 앱 개발 (2) | 2020.11.17 |
[Frida] Nox에 frida 설치하기 (0) | 2020.11.14 |