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

  1. Install JDK7
// For Ubuntu 
sudo apt-get install openjdk-7-jre
  1. Download dex2jar
    2015.03.16일자로 dex2jar-2.0.zip이 최신 버전이다.

  2. 압축을 풀어서 실행 스크립트 파일을 생성한다.

# For Linux
unzip -x dex2jar-version.zip -d /home/panxiaobo
  1. dex2jar를 이용해서 xx.apk파일을 xx-dex2jar.jar로 변환 한다.
  • bat은 윈도우
  • sh는 리눅스
# For Linux, Mac OSX, Cygwin
# 경로 /root/repackToolBox/reversingTools/dex2jar-2.0
d2j-dex2jar.sh xx.apk
  1. 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 zipalign
zipalign을 이용해서 모든 비압축 데이터는 특정한 bye alignment로 시작하게 된다. 이를 통해서 해당 앱에 의해서 사용되는 RAM의 양을 줄일 수 있다.

$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

추후 확인 사이트

http://www.cs.bham.ac.uk/~axm514/NotifyMe/#

악성코드 정적분석 네이버블로그: http://suspected.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%85%EC%84%B1%EC%BD%94%EB%93%9C%EC%A0%95%EC%A0%81-%EB%B6%84%EC%84%9D-%EB%B0%A9%EB%B2%95

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


  1. good 2016.11.03 22:26 신고

    감사합니다 좋은자료 보고갑니다. 자주 들릴게요.

  2. 2017.11.05 10:44

    비밀댓글입니다

  3. 이진 2018.05.01 21:14 신고

    제가하니막히는것이 많아서 많은, 수업료 지불하고 배우고 싶습니다. 도와주시면 많이사례
    하겠습니다~~
    whfflsek@gmail.com

+ Recent posts