Monday, May 26, 2014

안드로이드 apk 디컴파일(Decompile) 및 리패키징(Repackaging) 하기

포스팅하기에 앞서 본 포스팅은 단순한 스터디의 목적으로 작성함을 알려드립니다.
본 포스팅에 설명하는 apk 디컴파일 및 리패키징 방법을 악용하여 발생하는 문제에 대한 책임은 여러분에게 있습니다.


1. 디컴파일 및 리패키징을 위한 툴 다운로드 및 기본 설정


    1.1 Apktool
         - 다운로드 : https://code.google.com/p/android-apktool/downloads/list

     1.2 Dex2jar
          - 다운로드 : https://code.google.com/p/dex2jar/downloads/list

    1.3 JD-GUI 
          - 다운로드 : http://jd.benow.ca/ (운영체제에 맞춰 다운로드)

    1.4 motizen-sign
          - 다운로드 : 공식 URL을 찾지 못해서 첨부하지 못함(구글링을 통해 다운 가능)


    1.5 압축 해제
         안드로이드 sdk디렉토리 내의 platform-tools디렉토리에 다운받은
         Apktool과 Dex2jar를 압축해제한다.
         안드로이드 sdk디렉토리 내에 압축해제하는 이유는 환경변수 설정 시 편하게 하려고



     1.6 환경변수 설정
          adb, apktool, dex2jar 명령어를 커맨드창에서 사용하기 위함이다.
          %ANDROID_SDK%platform-tools
          %ANDROID_SDK%platform-tools\apktool - 압축해제한 Apktool 디렉토리 이름
          %ANDROID_SDK%platform-tools\dex2jar - 압축해제한 Dex2jar 디렉토리 이름





2. apk 파일 추출
         안드로이드의 USB디버깅 허용 한 다음 컴퓨터에 안드로이드를 연결 후
         adb shell 명령어를 통해 안드로이드 shell에 접속한다.

         USB디버깅 허용은 기종마다 조금 차이가 있지만 보통 시스템 설정에서
         개발자 옵션에서 가능하다.

         어떤 기종은 컴퓨터에 안드로이드를 연결해야 개발자 옵션에 들어갈 수
         있는 기종도 존재한다.

         안드로이드 shell에 접속 후 pm list packages -f라는 명령어를 통해
         안드로이드에 설치된 모든 패키지 리스트 확인한다.
                   
         패키지 리스트 중 디컴파일 할 apk를 찾는다.

         디컴파일할 패키지를 찾은 후 exit 명령어를 통해 안드로이드 shell을 종료한다.
         shell 종료 후 adb pull <apk 경로>를 통해 해당 apk파일을 컴퓨터로 추출한다.


3. Apktool을 통한 apk 디코딩
         apktool d <apk 이름> out 명령어를 통해 해당 apk파일을 디코딩 후
         out 폴더에 저장한다.

       디코딩 된 파일 목록

4. Dex2jar를 통하여 jar파일 생성
         안드로이드에서 추출한 apk파일의 확장자를 zip으로 변경 후 압축을 해제한다.

         압축을 해제하면 classes.dex라는 파일이 존재하는데 이 파일을 통해서
         jar파일을 추출한다.

         dex2jar classes.dex 라는 명령어를 통해 jar파일 추출이 가능하다.

         추출된 jar파일이다.

5. JD-GUI를 통한 자바 코드 획득
         JD-GUI를 실행하여 앞에서 추출한 jar파일을 오픈한다.
         jar파일을 오픈하게 되면 해당 파일의 class파일을 자바 코드로 변환시켜준다.
         간혹 코드로 변환하지 못하는 경우도 존재한다.

         앞에서 얻은 자바 코드를 분석하고 Apktool을 통해 디코딩하여 얻은 smali파일을 
         텍스트 편집기로 열어서 원하는 부분을 수정한다.


6. Apktool을 통한 apk 리패키징
         수정 후 Apktool을 통해 리패키징한다.
         리패키징 명령어는 apktool b <디렉토리 이름> 이다


         리패키징 후 해당 디렉토리에 들어가보면 build와 dist가 생성된 것을 확인할 수 있다.

         생성된 dist디렉토리에 apk파일이 새로 생성된 것을 확인할 수 있다.

7. motizen-sign을 이용한 apk 서명
         apk서명을 하는 이유는 바이너리정보가 수정되었기 때문이다.
         앞에서 생성된 apk파일을 motizen-sign디렉토리로 이동시킨다.

         그리고 Sign.bat파일을 텍스트편집기로 열어서 아래와 같이 수정한다.
         java -jar signapk.jar testkey.x509.pem testkey.pk8 <서명할 파일 이름>.apk

         마지막으로 Sign.bat파일을 실행하여 서명을 완료한다.

No comments:

Post a Comment