APK 바이너리 수정후 리패키징(repack)
APK 추출 방법
사용자 앱의 apk 저장 위치는 /data/packageName
이다.
system 앱의 경우 apk 저장위치는 /system
이다.
각종 앱 데이터 파일들은 (Database, so 파일)/data/data/<appname>
에 존재 한다.
이런 정보들은 기본적으로 adb shell pm 명령어를 통해서도 알 수 있다.
root@jemin-virtual-machine:~/AndroidStudioProjects# adb -d shell pm list packages -f -e com.mobisystems.android.notifications
package:/data/app/com.mobisystems.android.notifications-1/base.apk=com.mobisystems.android.notifications
# -f // see their associated file.
# -e // filter to only show enabled packages.
Resource XML 파일 분석 및 smali/baksmali 수준 분석
java 코드 생성과는 상관 없다.
APKTool
단순히 unzip을 할경우 .xml 파일과 같은 것들이 정상적으로 그 값을 표시하지 못하고 있다.
따라서 apktool
를 이용해서 압축을 해제해야 한다.
apk를 디컴파일해서 구조를 살펴 볼 수 있도록 로우 레벨에서 도움을 준다. pirate 목적으로는 쓰지말라고 한다.
공식사이트: http://ibotpeaches.github.io/Apktool/
설치방법
1.5.2 이상의 apktool를 사용하기 위해서는 Java 1.7 이상이 필요하다.
java -version 을 실행해서 자신의 PC에 자바가 설치되어 있는지 확인 하자.
상세한 설치방법은 공식 사이트 참조
현재 사용한 버전은Apktool v2.0.2
이다.
2015.10.12일에 release된 것이다.
jar 파일 다운받고 -> script 다운받고 ->apk d test.apk
하면 depack 된다.
Linux:
- Download Linux wrapper script (Right click, Save Link As apktool)
- Download apktool-2 (find newest here)
- Make sure you have the 32bit libraries (ia32-libs) downloaded and installed by your linux package manager, if you are on a 64bit unix system.
- (This helps provide support for the 32bit native binary aapt, which is required by apktool)
- Rename downloaded jar to apktool.jar
- Move both files (apktool.jar & apktool) to /usr/local/bin (root needed)
- Make sure both files are executable (chmod +x)
- Try running apktool via click
사용방법
$ apktool d testapp.apk
I: Using Apktool 2.0.0 on testapp.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: 1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
$
APK Studio
Apkstudio: http://www.vaibhavpandey.com/apkstudio/
GUI로 구성된 것이다.
smali code 할 때 하이라이팅이 되어서 편하다.
depackaging / re-packaging 모두 버튼으로 가능 하다.
APK Manager
ApkManager : http://forum.xda-developers.com/showthread.php?t=1310151
여러 기능이 있다.
Dalvik Executable (.dex) 파일을 jar 파일로 변경
관련 사이트
github 공식사이트
bitbucket:
사용법
wiki
UserGuide
- Install JDK7
// For Ubuntu
sudo apt-get install openjdk-7-jre
Download dex2jar
2015.03.16일자로 dex2jar-2.0.zip이 최신 버전이다.압축을 풀어서 실행 스크립트 파일을 생성한다.
# For Linux
unzip -x dex2jar-version.zip -d /home/panxiaobo
dex2jar
를 이용해서xx.apk
파일을xx-dex2jar.jar
로 변환 한다.
bat
은 윈도우sh
는 리눅스
# For Linux, Mac OSX, Cygwin
# 경로 /root/repackToolBox/reversingTools/dex2jar-2.0
d2j-dex2jar.sh xx.apk
- use a decompiler to view the source.
아래 세개중 하나의 decopiler를 이용해서 source code를 볼 수 있다. 필자는 2012년 부터 개발된 jd-gui를 사용한다.
jd-gui: http://jd.benow.ca/
JAD: http://varaneckas.com/jad/
Procyon: https://bitbucket.org/mstrobel/procyon
wiki 정리 (FAQ)
이것은 decomplier 인가?
-> 이것은 단순히 .dex format을 또다른 format인 .class format으로 변경 해주는 것이다. 이 또한 하나의 binary format 이다. 이것은 source code가 아니다.
JD-GUI 사용해서 소스코드 보기
jar파일을 decompile해서 java source code 레벨로 보여준다.
smali code를 바로 수정하기 어렵기 때문에 이것을 이용해서 해당 코드를 찾는다.
java용 GUI 도구를 설치하자.
eclipse와 InteliJ용도 있다.
File>Save All Sources
를 선택하면 소스코드로 저장 할 수 있다.
이것과 이전에 Apktool
로 unpack한것을 같이 묶어서 Eclipse
로 분석하면, 좀 더 편하게 작업할 수 있다.
Building (APK Repack)
수정한 APK를 다시 repack 하는 방법이다.
# The build option can be invoked either from b or build like shown below
# builds a directory into new.apk
$ apktool b directory_name -o new.apk
모든 build 관련 명령어
$ apktool b foo.jar.out
// builds foo.jar.out folder into foo.jar.out/dist/foo.jar file
$ apktool build foo.jar.out
// builds foo.jar.out folder into foo.jar.out/dist/foo.jar file
$ apktool b bar
// builds bar folder into bar/dist/bar.apk file
$ apktool b .
// builds current directory into ./dist
$ apktool b bar -o new_bar.apk
// builds bar folder into new_bar.apk
$ apktool b bar.apk
// WRONG: brut.androlib.AndrolibException: brut.directory.PathNotExist: apktool.yml
// Must use folder, not apk/jar file
Signing Your App Manullay without Android Studio
SDK와 JDK에 있는 standard tool을 이용해서 apk를 signing 할 수도 있다.
1. Generate a private key using keytool
$ keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize 2048 -validity 10000
2. Compile your app in release mode to obtain an unsigned APK
3. Sign your app with your private key using jarsigner
아래의 명령어를 이용할경우 하나의 APK
에 대해서 서로다른 sign으로 여러번 서명을 할 수 있게 된다.
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1
-keystore my-release-key.keystore my_application.apk alias_name
4. Verify that your APK is signed
아래의 명령어를 통해서 해당 App이 정상적으로 해당 Key로 sign 되었는지를 알 수 있다.
$ jarsigner -verify -verbose -certs my_application.apk
저장 위치: \jdk\bin
5. Align the final APK package using zipalignzipalign
을 이용해서 모든 비압축 데이터는 특정한 bye alignment로 시작하게 된다. 이를 통해서 해당 앱에 의해서 사용되는 RAM의 양을 줄일 수 있다.
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
추후 확인 사이트
http://www.cs.bham.ac.uk/~axm514/NotifyMe/#
APK Studio 관련: http://secuinfo.tistory.com/entry/Android-Smali
Smali: https://github.com/JesusFreke/smali
http://0x616b616d61.tistory.com/21
http://strawberryit.tistory.com/142
http://secuinfo.tistory.com/entry/Android-Smali
'Computer Science > Reverse Engineering' 카테고리의 다른 글
smali/baksmali 수준의 코드 수정 (3) | 2015.12.16 |
---|