[안드로이드 모의해킹] APK 파일 정적분석 및 APK Studio 설정

직접 연구하여 작성한 자료입니다. 공식 출처가 명시되지 않은 자료의 무단 복제, 사용을 금지합니다.
공격 기법은 학습용, 허가된 환경에서 실습 바랍니다. 실 운영망 대상 공격은 처벌받습니다. (정보통신망법 제48조 1항)

1. APK(Android Application Package)

안드로이드 설치파일이다. APK 파일 구조는 그림과 같다.

APK 파일

  • Manifest(AndroidManifest.xml): 메타데이터, 앱의 실행정보, 권한, 액티비티 목록등을 제공하는 파일이다.
    • 앱의 패키지명.
    • Activity, 리소스와 같은 응용 프로그램의 모든 구성 요소.
    • 앱을 실행하는 데 필요한 권한 및 다른 응용 프로그램에서 앱의 정보에 액세스하는 데 필요한 권한(permission).
    • 호환성 기능(예: 최소 Android 버전 및 지원되는 장치).
  • Assets / res: 동영상, 큰 파일 / 아이콘, 그림, 작은파일을 포함한다. 개발자가 제어하는 폴더 계층의 앱 리소스이다.
    예를 들어 프로그램이 비디오를 표시하거나 일부 문서 템플릿과 함께 제공되는 경우 assets 폴더에 저장된다.
    또한 특정 프레임워크는 assets 폴더를 사용하여 코드와 데이터를 저장한다. 
    예: Cordova 또는 React-native 응용 프로그램은 Assets 폴더에 Javascript 코드를 저장한다.
    Xamarin 응용 프로그램은 어셈블리 폴더에 DLL 파일을 저장하며, 이는 동일한 방식으로 작동한다.
  • dex: 안드로이드 가상머신인 Dalvik이 이해할 수 있는 Code. 자바 VM 버전을 위한 구글의 독점 포맷으로, 달빅이라는 특정 바이트코드로 컴파일된 모든 자바/코틀린 코드를 포함하고 있다.
    APK 파일은 DEX 포맷의 제한으로 인해 둘 이상의 classes.dex 파일을 포함할 수 있다. 추가 파일에는 번호가 지정된다.(예: class2.dex, class3.dex 등).
    앱의 난독화 솔루션의 경우 여러 개의 dex 클래스를 생성한 후 흐름 재배치를 이용하여 덱스 파일 내에서 원래 응용 프로그램의 코드 흐름을 난독화하는 기법을 사용하기도 한다.

2. APK 파일 분석 실습

실습을 위해서 DIVA 안드로이드 앱을 다운받는다. DIVA github 페이지(https://github.com/payatu/diva-android)에서 소스코드를 내려받아 컴파일해도 되며, apk 파일로 제공되는 github 페이지(https://github.com/0xArab/diva-apk-file)에서 APK 파일만 내려받아 분석할 수 있다. 직접 개발한 안드로이드 앱을 사용해도 좋다.

2-1. Unzip

APK파일은 여러 리소스들의 집합으로 이루어진 파일이다. 그래서 단순 압축 해제로 분석 가능한 파일도 존재한다.

실습 APK 파일 다운로드 및 압축 해제

다음의 질문에 대한 해답을 얻을 수 있는지 확인한다.

  • lib 폴더에는 다양한 아키텍처 별로 미리 컴파일된 파일 존재하는가?
    • 네이티브 라이브러리(시스템 코드)가 들어 있는 폴더이다. 안드로이드는 여러 종류의 아키텍처를 지원하는 크로스 플랫폼이기 때문에 지원되는 각 프로세서에 대한 하위 폴더를 포함한다.
    • armabi – 적어도 ARMv5TE를 지원하는 이진 파일로, ndkr16(2017년 12월) 이후 사용되지 않고 ndkr17(2018년 6월)에서 제거되었다.
    • armeabi-v7a – ARMv7을 지원하는 바이너리.
    • arm64-v8a – ARMv8을 지원하는 바이너리.
    • x86 – x86을 지원하는 바이너리.
    • x86_64 – x86-64를 지원하는 바이너리.
    • mips – MIPS용 이진 파일로, ndkr17 이후 미지원.
  • res에는 다양한 기기 해상도별로 자원 파일 존재하는가?
    • 기기의 해상도, 화면 회전 해상도 등 환경에 맞는 파일을 확인할 수 있다.
  • Android Manifest.xml 열어서 구조 파악이 가능한가?
    • 파일은 존재하지만 에디터로 열었을 때 내용은 깨져서 보인다.

2-2. Decompile

압축해제를 통해 파일의 내용을 확인하였다면 패키징 이전 과정까지의 파일들을 확인한 것이다. 파일의 내용은 안드로이드 운영체제가 실행할 수 있도록 컴파일된 내용이기 때문에 사람이 읽을 수 있는 내용은 디컴파일 과정을 거쳐야 확인할 수 있다.

디컴파일이란?

APK 파일이 어떤 소스들로 구성되어 있는지 확인하는 방법이다. 개발자가 작성한 안드로이드 소스코드를 컴파일하면 java > jar > dex 과정을 거친다면, 디컴파일은 이를 역순으로 수행하여 기존의 코드를 사람이 분석 가능하도록 한다.

사용하는 디컴파일 도구에는 apktool, dex2jar, jd-gui, apk studio, jeb3 등이 있다.

3. APK Studio 사용하기

설치 및 초기설정

무료로 배포하고 있으며, Java, Apktool, Jadx 등 여러 도구들을 결합하여 하나의 도구로 사용할 수 있게 해준다. github 페이지(https://github.com/vaibhavpandeyvpz/apkstudio/releases)에서 다운받을 수 있다.

[☀주의] 설치시 유의사항으로 작업 경로 내 '한글'이 포함되어 있을 경우 오류가 발생하므로 한글이 포함되지 않도록 한다. Windows 사용자 명이 한글로 되어 있는 경우, 작업 경로 내 한글이 포함될 수 있으므로 이 점에 유의한다.

APK Studio를 처음 실행하면 설치된 여러 필수 바이너리들의 경로를 지정해야 한다. 

APK Studio 초기 설정

설치되지 않은 바이너리의 경우 다운받고, 경로를 지정해주고 APK Studio를 재시작하면, 위 그림과 같이 버전정보를 확인할 수 있다.

APK Studio 영역별 설명

초기 설정이 완료되었다면, 우측 상단의 안드로이드 아이콘을 클릭하여 예제로 다운받은 APK 파일을 연다. 디컴파일 작업이 수행되고 나면, 좌측에는 Project, Files 영역을 확인할 수 있고, 가장 큰 영역으로 코드 영역을 확인할 수 있다.

[참고] 안드로이드, 폴더, 설정 아이콘이 있는 좌측 메뉴 바에서 우클릭을 하면 각각의 영역을 열 수 있는 컨텍스트 메뉴가 나타난다. "Console" 에는 작업 결과 및 에러 발생 시 에러코드 등을 보여주므로 트러블 슈팅 시 참고할 수 있다.

출처

https://www.appdome.com/how-to/appsec-release-orchestration/appdome-basics/structure-of-an-android-app-binary-apk/

반응형