- quotation
- Android Reverse Engineering
- quotation
- Android Security Internals
- quotation
- 잘 짜여진 실제 앱 해부해보기
APK 파일을 압축해제하면 아래와 같습니다.
1) AndroidManifest.xml
- manifest 바이너리 XML 버전
- Contains: entry point for app, Activities, Services, Receivers, Intents, app permissions, package name, version, debuggable, 컴포넌트 및 기타 meta-data 등...
- Reverse with: axmlprinter2, apktool, jeb/jeb2, androguard, 010Editor Templates
2) classes.dex
- Dalvik 실행 파일 - VM을 위한 모든 파일
- Dalvik VM의 Native DEX 포맷
- Dalvik 클래스로 바뀐 모든 Java 클래스가 포함됨
- 최근에는 안드로이드 런타임(ART)와 미리 컴파일해주는 AOT(ahead-of-time) compilation으로 전체 전환되거나
- 부분적으로 just-in-time(JIT) 방식을 사용하므로 이들 몇몇은 같은 방식으로 사용되지 않을 수도 있지만,
- 해당 형식이 고정돼 있으므로 모두 APK에 있어야 함
- 그래서 실제로 이를 제거할 수는 없음
- 비록 전체가 아니더라도 필요한 파일이며 리버스 엔지니어링을 하는 동안 계속 존재해야 함
- Reverse with: smali/apktool, IDA pro, jeb/jeb2, androguard, enjarify, dex2jar+jad/jd, jadx, radare, 010Editor Templates
※ 파란색을 제외하고 All open sourced tools
3) resources.arsc
- 문자열과 스타일 등 앱의 컴파일된 리소스가 들어 있음
- ex) R.java / strings.xml / layouts.xml / ids.xml
- Reverse with: aapt, apktool, axmlprinter2
4) assets/ *
- raw 파일
- 폰트나 음악 파일 등 앱에 포함된 원시 asset 파일을 번들로 만들기 위해 사용함
- Sometimes 실행 가능한 payloads 또는 code가 동적으로 로드됨
※ 무엇이든 assets 이 될 수 있음. 멀웨어를 다루는 경우 실제로 코드처럼 보이지 않도록 조금 난독화되는데 거의 스테가노그래피(Steganography) 항목 수준의 것이 숨겨져 있을 수 있음. 여기에 동적으로 불러오는 것이 있을 수도 있음. 멀웨어가 종종 이런 형식을 취함.
5) lib/ *
- JNI를 통해 Native code library를 사용하는 앱은 lib/ 디렉터리를 담고 있는데
- 그 밑에는 지원하는 플랫폼 아키텍처마다 하위 디렉터리가 만들어져 있음
- 다루기 까다로운 심화 리버스 엔지니어링 내용임
- Reverse with: gdb, hopper, IDA Pro, radare
6) res/ *
- 컴파일되지 않은 리소스
- android.content.res.Resources 클래스를 통해 직접 참조하거나
- 상위 수준 API를 통해 간접적으로 참조되는 리소스가 들어 있음
- 애니메이션, 이미지, 메뉴 정의 등 리소스 형태에 따라 서로 다른 디렉터리에 들어감
7) META-INF/ *
- 출처와 무결성 확인을 위한 인증서, 서명, 파일 해시
- META-INF 디렉터리에는 많은 것을 넣을 수 있음
- 특히 APK의 서명을 나타내는 서명 파일이 위치하는 곳임
※ 여기서 재귀적인 문제가 발생함. 만약 APK를 서명하면 서명 파일을 이 디렉터리에 넣어야 하는데 이런 행동을 통해 APK의 서명이 다시 변경되면 곤란함. 따라서 이 디렉터리는 서명될 때 제외돼야 함. 즉 이 디렉터리의 내용을 수정할 수 있지만 이것이 APK의 서명을 수정하지 않음.
※ 서명을 무효로 하지 않고 이 디렉터리의 파일을 변경할 수 있음. 기본적으로 이 디렉터리는 서명을 포함하여 이를 통해 서드 파티 APK를 다운로드해서 제대로 된 것인지 확인할 수 있음.
8) * (기타)