2013년 7월 30일 화요일

[Android] 디버깅과 리버싱


안드로이드 어플리케이션 파일인 apk 는 dex, resources와 library 로 구성되어 있는 압축파일이다.

여기서 dex 파일은 어플리케이션의 소스 파일이며 class를 거쳐 java 파일로 디컴파일 하면서

어플리케이션 소스를 분석할 수 있다.


1. 디컴파일을 위한 툴 설치

1.ApkTool
- 다운로드 : http://code.google.com/p/android-apktool/downloads/list

2.Dex2Jar
- 다운로드 : http://code.google.com/p/dex2jar/downloads/list

3.Java Decompiler
- 다운로드 : http://java.decompiler.free.fr/?q=jdgui


2. apk 파일 추출

$ adb shell # 추출하고자 하는 apk 파일의 위치를 찾음

$ adb pull /data/app/com.xxx.apk # 파일 추출


3. apk 파일을 디코딩

$ apktool d com.xxx.apk out # asset, res, smali(소스파일), xml, yml 파일을 얻을 수 있음

> java -jar apktool.jar d com.xxx.apk out 

4. Dex2Jar 을 통해 Java 파일 추출

apk 파일을 zip 확장자로 바꾸고 압축 해제해서 classes.dex 파일 추출

$ dex2jar classes.dex # classes.dex.dex2jar.jar 파일을 얻을 수 있음


5. JD-GUI 를 이용해 Java 소스 분석

가끔 Java Decompiler 가 소스를 제대로 디컴파일 하지 못하는 경우가 발생한다.

소스 보기를 하면 // INTERNAL ERROR // 라는 오류 메세지만 뜰 뿐 소스가 보이지 않아 당황스러웠지만,

다른 Java 디컴파일러인 DJ Java Decompiler 를 사용하면 제대로 보인다.


6. java 소스를 참고해 smali 소스를 수정해서 리버싱


7. smali를 다시 컴파일하고 apk 파일 생성

$ apktool b out

ex)

$ adb uninstall ops.black.herpderper
$ apktool b herp patched.apk
alias keytool='java -Dfile.encoding=utf8 sun.security.tools.KeyTool ' // only for mac user
$ keytool -genkey -v -keystore my.keystore -alias anyalias -keyalg RSA -validity 10000
$ jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my.keystore patched.apk anyalias 
$ adb install patched.apk


8. apk 파일 릴리즈 (키 생성 및 사인) - optional

0. only for mac user
alias keytool='java -Dfile.encoding=utf8 sun.security.tools.KeyTool '

1. 키 생성
$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -validity 10000

혹은 eclipse 에서 export->android application 을 통해 생성

2. 키 사인

$ jarsigner -verbose -keystore my-release-key.keystore my_application.apk alias_name


9. 안드로이드 패킷 캡쳐 - optional

carpedm20:/$ adb shell
shell@android:/ $ su
root@android:/ # tcpdump -i rmnet1 -s 0 -w /sdcard/ab.pcap

10. Example


$ adb pull /data/app/com.kakao.talk-1.apk
> java -jar apktool.jar d com.xxx.apk out 
$ adb uninstall com.kakao.group
$ apktool b out patched.apk
$ keytool -genkey -v -keystore my.keystore -alias anyalias -keyalg RSA -validity 10000
$ jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my.keystore patched.apk anyalias
$ adb install patched.apk

댓글 1개: