Android 앱 분석 (APK)

[case Computer :]

안드로이드 앱 분석 시작 방법


일반 앱을 분석하기 위해 설치 파일인 안드로이드 설치 파일인 APK을 알아야한다.


APK (Android Package)

 > 안드로이드 플랫폼에서 어플리케이션 설치를 위해 배포되는 패키지 파일

 > 압축 ZIP 파일 포맷 형태로 구성

 > 주요 구성 요소

    - AndroidManifest.xml : 앱에 대한 정보 및 실행권한 등의 정보를 가지는 xml

    - classes.dex : 달빅 가상머신에서 동작하는 바이너리 실행 파일

    - /res : 리소스 파일 폴더

    - META_INF : 인증파일

   

압축파일 형식이기 때문에 압축 프로그램으로 확인 가능하다. 또한 압축 해제도 가능하다.



Dex(Dalvik Executable)

> 달빅 가상 머신에 맞게 클래스 파일을 바이트 코드로 변환한 파일이다.

> APK 파일에 포함된 classes.dex파일이 이에 해당한다.

> 자바 코드를 컴파일하여 클래스 파일을 만든후 다시 DEX도구로 압축한 것이다.



APK 분석을 위한 툴 준비

dex2jar : https://code.google.com/p/dex2jar/

JD-GUI : http://jd.benow.ca/


dex2jar : dex 파일을 jar 파일로 변환해주는 툴

jd-jui : java decompile tool



dex2jar로 APK 디컴파일

> Command : dex2jar.bat [APK File or Dex File]

> 위와 같이 간단히 명령어를 입력하면 file_dex2jar.jar 파일이 같은 디렉토리에 생성이 된다.






Jar 파일 디컴파일 툴

> jd-gui 를 이용해서 jar 파일을 열어본다.

> 소스가 보이는 것을 확인할수 있다.





소스 분석 방법은 보통 main 함수부터 시작하지만 안드로이드 앱은 브로드캐스트를 받거나 서비스 되는 부분도 있기때문에

분석이 필요한 곳을 찾아서 진행하면된다.



APKTOOL을 이용한 APK 디컴파일

apktool : https://code.google.com/p/android-apktool/


command : java -jar apktool.jar d [APK_FILE] [result_dir_name]

apktool에 d 옵션 decompile 옵션을 통해 apk 디컴파일을 진행한다.



그리고 결과 파일은 아래와 같이 생성된다. 

내부 리소스가 풀리고, dex 파일이 smali 디렉토리 내부에 디컴파일되어 떨어지게 된다.






APKTOOL을 이용한 APK 리패키징

command : java -jar apktool.jar b [decompiled_apk_result_dir_name]

b 옵션으로 리패키징(build)가 가능하다.

빌드가 완료되면 디렉토리내에 dist 폴더에 apk 파일이 생성이 된다.

이렇게 생성된 apk는 Sign되어 있지 않아 keystore로 sign 후에 설치 및 테스트가 가능하다.





* 처음 보는 APK에 Main Activity를 어떻게 찾을까?

Main Activity를 찾는 이유는 일반적인 C/C++에서 소스를 분석할때 main 함수부터 시작해 나가는데 

안드로이드에서는 처음 실행되는 Main Activity에 onCreate 함수부터 시작되기 때문이다.

그런데 Main Activity는 개발자 마음대로 이름을 변경할수 있다.


그러면 처음실행 되는 Activity를 어떻게 찾는가? 

모든 Activity는 AndroidManifest.xml 에 등록이 되어있어야 사용이 가능하다. 

apktool을 이용하여 디컴파일하면 AndroidManifest.xml 파일도 같이 나온다.

이 파일에 <activity></activity> 부분을 모두 찾는다.

그리고 해당 태그 하위에 <intent-filter> 태그에 <category android:name="android.intent.category.LAUNCHER" />

런처 카테고리 태그를 사용한 액티비티를 찾으면된다.


해당 태그가 있다면 <activity android:name=""> 액티비티 태그에 android:name을 찾는다.

해당 name이 처음 구동되는 activity name이다.









::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::

  1. 궁금 [2014.05.27 16:51]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    이렇게 생성된 apk는 Sign되어 있지 않아 keystore로 sign 후에 설치 및 테스트가 가능하다.

    이분분이 궁금해요

    이클립스로 프로젝트 만들어서 하라는 말인가요? 자세한 설명 한번만 더 부탁드려요

    • 요가하는 금붕어커플 금붕어커플 [2014.06.10 20:57 신고]  [댓글주소]  [수정/삭제]

      이클립스로 apk를 생성할때 keystore 부분과 비밀번호를 넣는 부분이 있죠 해당 부분이 sign하는 부분입니다.
      그렇지만 apktool로 직접 apk를 생성하게 되면 sign 부분이 없기 때문에 직접 sign을 해주어야 합니다.

      sign 방법은 아래 url을 통해 확인이 가능합니다.
      http://developer.android.com/tools/publishing/app-signing.html#signapp

  2. [2014.07.09 11:30]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    비밀댓글입니다

  3. [2014.07.09 11:30]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    비밀댓글입니다

  4. SCV [2014.07.28 14:26 신고]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    생각보단 간단하군요. 감사합니다.

  5. pollra [2015.06.22 05:56]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    `위와 같이 간단히 명령어를 입력하면 file_dex2jar.jar 파일이 같은 디렉토리에 생성이 된다.
    에서 왜 위의경로가 안드로이드에 되어있는지 알수있을까요 이 프로그램안드로이드에서 깔아서 실행하는걸론 안보이는뎁...

  6. pollra [2015.06.22 06:05]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    dex2jar로 APK 디컴파일
    > Command : dex2jar.bat [APK File or Dex File]
    > 위와 같이 간단히 명령어를 입력하면 file_dex2jar.jar 파일이 같은 디렉토리에 생성이 된다.

    여기서 커맨드를 입력할때 dex2jar.bat [Dex지정경로 or APK 지정경로] 이렇게 입력하는데 저 dex2jar 파일은 언제실행하나요? 커맨드만입력하면 자동으로 설치되어서 명령프롬프트에서 실행까지 완벽하게 되는 프로그램인가요?

  7. [2015.09.10 13:47]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    비밀댓글입니다

  8. 도와줘요 [2016.01.30 23:17]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    apk tool을 이용하여 apk 디컴파일 명령어 적을때 여기 적힌대로 적었는데 에러 뜨면서
    error : could not create the java virual machine
    error : A fatal exception has occurred. Program will exit
    이런식으로 결과가 나오는데 우쨰해야할까요

  9. ㄹㅇㄴㄹ [2016.03.27 05:18]  [댓글주소]  [수정/삭제]  [댓글쓰기]

    깃허브에서 프로그램 다운로드 어떻게 해요 소스코드 말고 실행 프로그램이요