• APK 파일은 앱 Code 및 Resource와 앱 Manifest 파일을 포함하는 컨테이너 파일
  • APK는 ZIP 파일 (자바 JAR를 확장한 포맷이며, JAR 파일은 널리 사용되는 ZIP 압축 파일 포맷을 확장한 것)
  • ZIP 포맷을 지원하는 어떤 압축 유틸리티를 사용해도 쉽게 파일을 추출해 내용을 볼 수 있음
  • application/vnd.android.package-archive MIME 형식에 연결

  • 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) * (기타)