출처
: http://hyeonil.blogspot.kr/2014/05/apk.html
: http://egloos.zum.com/jhpsb/v/231908
포스팅하기에 앞서 본 포스팅은 단순한 스터디의 목적으로 작성함을 알려드립니다.
본 포스팅에 설명하는 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파일 생성
압축을 해제하면 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파일을 실행하여 서명을 완료한다.
[Android] 안드로이드 디컴파일 환경 셋팅
출처: http://ethobis.tistory.com/132
#1 dex2jar-0.0.9.13 를 이용한 APK 디컴파일
압축을 풀고, APK파일 내부에 있는 classes.dex 파일을 꺼내서 dex2jar-0.0.9.13 폴더에 넣습니다. 이후 아래와 같은 명령어로 디컴파일을 합니다.
dex2jar classes.dex
이 파일로 열면 안드로이드 코드가 Java파일로 변경되어 보이는 것을 확인하실 수 있습니다. 이렇게 하는 이유는, 본격적으로 리패키징을 하기 위해 코드를 분석하는 것인데요. 여기서 Java 코드를 분석해서 어디를 패치할 지 알아야 합니다.
#2 jad.exe + Eclipse Plugin을 이용한 class파일 디컴파일
.jar 파일을 압축 풀면, class파일이 나오는데, jad.exe를 통해 class파일을 java파일로 변환할 수 있습니다.
다음 파일을 압축 풀면, 이클립스 플러그인이 하나 나오는데, 이클립스 경로의 Plugin 폴더에 넣어주시고, 환경설정에서 적용해주신 다음 jad를 통해 변환된 java파일을 이클립스로 열면 디컴파일이 가능합니다.
jad -r -d .\decompile -s java .\**\*.class
decompile 디렉토리에 결과가 나오는 것을 확인할 수 있습니다.
#3 apktool1.5.2 를 이용한 APK 디컴파일 및 리패키징
아래 파일을 다운 받으시면 디컴파일과 리패키징을 모두 할 수 있는 파일이 모여 있습니다.위에서 어느 부분을 수정할 지 파악했다면 이제는 본격적으로 리패키징을 할 차례 입니다. 분석할 APK파일을 apktool1.5.2 폴더에 넣으시고 아래와 같은 명령어를 입력합니다.
apktool d <apk name> <directory>
파일을 받으시면 Sign.bat 파일이 있는데, 이것을 메모장으로 열어서 아래와 같이 수정해 줍시다.
java -jar signapk.jar testkey.x509.pem testkey.pk8 <새로 만들어질 파일 명>.apk
이클립스에 디컴파일러 인 "JAD" 를 설정해 보자.
개발하다 문득 클래스 파일이 어떻게 되어 있나 궁굼했다. 그래서 어떻게 확인 할 수 있나 찾아보니..
"JAD" 를 이클립스에 설치하면 class파일을 java 소스처럼 볼 수 있었다. 우 헤헤헤 ~
"JAD"를 사용하기 위해서는 다음의 2가지 파일이 필요하다.
( jad 실행파일 )
사이트 : http://www.varaneckas.com/jad
( 플러그인 )
사이트 : http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download
이제 이클립스에 JAD 를 설정해보자.
1. jad 는 아무 경로에 압축을 풀면 된다. 난 이클립스가 설치된 경로에 넣어두었다.
나의 이클립스 경로는 (D:\eclipse)
2. 설치된 이클립스의 "plugins" 디렉토리 에 다운받는 "net.sf.jadclipse_3.3.0.jar" 플러그인 파일을 복사한다.
3. 이클립스를 실행하고 상단 탭 메뉴의 "Window > Preferences" 를 클릭하면 아래와 같이
" JAVA" 항목밑에 "JadClipse" 항목이 추가 되어 있어야 한다.
( 만약 보이지 않는다면 "plugins" 디렉토리에 "net.sf.jadclipse_3.3.0.jar" 파일이 들어있는지 다시 확인 후 이클립스를 재기동 해준다. )
여기까지 이상이 없다면 "Path to decomplier" 에 jad를 설치한 풀경로를 넣어준다.
난 이클립스 경로에 넣어줬음.
4. General > Editors > File Associations 에서 *.class , *.class without source 를 선택하여
"JadClipse Class File Viewer" 를 선택하여 우측의 default 버튼을 클릭하여 "default" 시켜준다.
(** 만약 항목에 보이지 않는다면 옆에 "Add.."버튼을 클릭하여 추가시켜준다.)
자!! 이제 모든 설정은 끝~!! 이젠 클래스 파일이 잘 읽혀지는지 확인해 봐야겠지..
아무 클래스 파일을 하나 열었더니... 똬앗~!! 아래처럼 이상한 에러같은게 보이면서 아무내용이 안나왔다.
ㅡㅡ;; 멍미...
"class" 파일을 디컴파일 하기 위해서는 프로젝트에 환경변수 안에 참조되어 있어야 했다... ㅜㅜ
아래는 참조된 jar 파일안에 있는 class 파일을 연 모습이다. ^______^
다른분 블로그에서 제가 필요한 자료들을 저장해 놓기 위한 글 입니다. 좀 더 다양한 참조가 필요하시면 위의 출처를 따라가서 보시길 바랍니다.
'IT_Programming > Android_Java' 카테고리의 다른 글
Android View 관련된 오픈소스 정리 (0) | 2013.08.17 |
---|---|
[Android] px 과 dip 단위 변환 (0) | 2013.08.11 |
Android NFC (0) | 2013.08.05 |
안드로이드 바코드 인식기(OCR) 오픈 소스 zxing 분석 (0) | 2013.08.05 |
Android Streaming 예제 (0) | 2013.08.05 |