본문 바로가기

Android

안드로이드 앱 구조

반응형

 

안드로이드 APK 파일 구조


안드로이드 앱 구조 

- 안드로이드 앱 확장자 = APK

- 위의 그림은 압축을 푼 APK 파일 구조이고, 밑의 그림은 실제 압축을 푼 APK 파일의 내부 파일들이다.

 

InsecureBank APK 파일을 zip 파일로 변경 후 내부 구조 확인

 

1. AndroidManifest

APK 내부 파일 중에서 가장 중요한 파일로 앱 세부정보가 포함되어 있어 packing 된 형태의 파일이다.

decoding을 통해서 내부 내용을 확인할 수 있고 내부 구조는 크게 네 가지로 나뉜 형태로 구성되어 있다. 

해당 파일에는 앱을 동작시키기 위한 거의 모든 정보와 권한 정보들이 담겨있다.

 

encoding 되어있는 Android.xml 파일

 

- 구성요소

1. <manifest>

AndroidManifest.xml 파일의 root 요소로 가장 중요한 구성요소<application> 요소를 포함해야 하고

package 속성을 지정하는 역할을 한다.

 

2. <application>

애플리케이션 선언으로, 애플리케이션의 각 구성요소를 선언하고

모든 구성요소에 영향을 줄 수 있는 속성을 가진 하위 요소를 포함하고 있는 부분이다.

 

3. <uses-permission>

어플리케이션 설치할 때 특정한 권한들이 필요할 경우, 액세스 하기 위한 권한을 물어보는데 이때 필요한 구성요소

민감한 사용자 데이터나 특정 시스템 기능에 엑세스하기 위한 권한을 선언한다. 특정 권한 목록 예시는 다음과 같다.

 

permission 목록

 

4. <activity> <service> <provider> <receiver>

Application component의 4대 구성요소에 대한 선언 

 

 

2. classes.dex

개발자가 작성한 소스코드이며, 소스코드에서 생성된 Dalvik Bytecode가 포함되어 있다.

 

3. resources.arsc

compile된 리소스가 포함된 파일

 

4. res

resources.arsc에서 제외된 정보를 포함하는 디렉리

애플리케이션에 필요한 리소스인 앱 아이콘, 이미지 등이 포함되어 있다.

 

5. META-INF

manifest 파일과 애플리케이션 인증서 등이 포함되어 있다.

 

6. assets

개발자는 이 폴더를 사용하여 음악, 비디오와 같은 파일을 저장할 수 있다.

 

 

 


안드로이드 앱 코드 분석

위에서 AndroidManifest.xml 파일이 encoding 되어 내부 code를 확인할 수 없었다. 이를 decoding 하고 내부 소스코드를 

확인하기 위해 apktool을 사용한다. InsecureBankv2.apk 파일을 apktool로 디코딩하면 다음과 같은 결과가 나온다.

 

apktool로 apk 파일 decoding

위의 그림을 보면 decoding 과정에서 다음과 같은 동작을 한다.

 

I: Decoding file-resources... : 리소스 파일 decoding
I: Decoding values */* XMLs... : XML 파일 decoding
I: Baksmaling classes.dex... : classes.dex 파일을 smali code로 변환

 

apktool로 decoding 한 후, 내부 파일 구조를 보면 기존의 APK 파일 구조와 조금 다른 것을 볼 수 있다.

dex 파일이 사라지고 smali code 디렉리가 생성된 것이 그 차이점이라고 볼 수 있다.

 

apk tool로 decoding 후의 파일 구조

decoding을 완료한 후, AndroidManifest.xml 파일의 소스코드를 확인하면 decoding 전과 다르게 내부 정보를 확인할 수 있다.

여기서, 안드로이드 앱 정적코드분석 순서를 다음과 같이 정리하고 넘어가자

 

                 [APK file] --  [dex + rsrc + permission]  --  [smali code]  --  [class file]  --  [Java file]

 

smali code는 class file과 Java code가 안드로이드 환경에서 실행되기 위해 변형된 code다.  

악성코드 분석에서 assembly를 통해 string 분석을 했던 것처럼 assembly 언어와 유사한 부분이 많다.

밑에 smali code로 작성된 파일의 예시를 보면 string 분석과 비슷한 느낌을 받을 것 같다.

 

보통 apk file을 분석할 때, apk file을 JAVA code로 decoding 하여 분석하게 되면 완벽한 code 재현이 굉장히 어렵다...!

따라서, 중간에 smali code에서 중간 분석을 하고 여기서 문제점을 해결한 후, 다시 class file이나 Java file로 encoding 하게 된다.

추후에 악성코드 분석할 때 많이 사용할 예정이다.

 

 

smali code 예시

다음은 manifest 파일의 구조를 확인해보려고 한다.

먼저 위의 코드 중에 "uses-permission" 태그가 있는데 바로 민감한 사용자 데이터나 특정 시스템 기능에

액세스 하기 위한 권한을 선언하는 부분이다. 안드로이드 앱 취약점 진단을 하게 되면 개발과정에서 불필요한 권한들이 부여되거나

개발자의 의도와 달리 권한이 과도하게 부여된 경우, 이를 찾아내고 수정하는 것이 취약점 진단의 목적이 된다.

 

 

decoding 후, 내부 소스코드를 확인 가능한 모습

다음으로 "activity" 태그는 앱을 실행시켰을 때 반환되는 첫 메인 페이지로 사용자와 interact를 하기 위한 기능이다.

activity에서 확인해야 할 부분은 android:exported = "true"로  이는 activity에 대한 정보가 외부로 노출되는 것을 허용한다.

개발 단계에서 중요 페이지에 대해 해당 설정을 삭제하지 않았을 경우, 내부 정보가 외부로 노출될 가능성이 크므로 점검해야 한다.

 

 

activity 태그 확인

 

 

 

 


안드로이드 디바이스 디렉토리 구조

nox_adb shell 명령을 통해서 nox 내부의 안드로이드 디바이스 구조를 확인할 수 있다.

디렉토리 구조들은 표로 정리했다. 필요할 때마다 확인하는 용도로 써먹으면 좋을 것 같다.

리눅스를 많이 사용한 사람들은 리눅스 명령어와 거의 동일하기 때문에 어렵지 않게 구조를 파악할 수 있다.

 

 

directory description
/ root 파일 시스템 디렉토리
booting과 관련된 설정파일을 참고하여 초기 프로세스 정보가 포함되어 있다.
/system 안드로이드 운영체제의 home directory로 운영체제 파일이 존재한다.
Rooting을 시도할 때 해당 directory의 파일들을 접근한다.
/data 사용자 앱 상태 정보가 포함된 파일 시스템 directory
취약점 진단할 때 가장 많이 확인할 directory
apk 파일을 설치하게 되면 해당 directory 하위에 설치되기 때문
/cache 일시적으로 사용자의 상태정보가 포함되는 directory
/system/app system에 의해 이미 사전에 설치된 앱 경로
블루투스, 카메라, 달력, 앱스토어 등등 default로 설치된 앱 경로가 포함되어 있다.
/data/app 사용자에 의해 설치된 앱 경로
여기에 apk file들이 저장된다. 악성코드 파일들 또한 여기에 저장될 가능성이 제일 높다.
앱들은 directory로 생성되고 하위의 위치로 이동하면 base.apk 파일이 있는데
apk file 분석할 때 해당 file을 추출하여 분석하게 된다.
/data/data/<package> 설치한 앱의 패키지 경로, root 권한으로 접근할 수 있다.
/mnt/sdcard 외부 혹은 내부 SD Card 경로

 

반응형

'Android' 카테고리의 다른 글

안드로이드 구조  (0) 2023.09.20