ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android 앱 분석 (APK)
    case Computer : 2014. 2. 17. 11:51

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


    일반 앱을 분석하기 위해 설치 파일인 안드로이드 설치 파일인 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이다.









    반응형

    댓글

Designed by Tistory.