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


'Computer Science > Reverse Engineering' 카테고리의 다른 글

smali/baksmali 수준의 코드 수정  (3) 2015.12.16

smali/baksmali 수준의 코드 수정

smali/baksmali는 An assembler/disassembler for Android's dex format의 약자이다.
DEX 바이너리를 사람이 읽을 수 있도록 쉽게 표현한 것이다.

Dex (Dalvik Executable)

Toast Smali Code 추가 방법

HelloWorld.java

Toast toast = Toast.makeText(getApplicationContext(), "Toast Test");
toast.show();

HelloWorld.Smali

invoke-virtual {p0}, Lcom/test/helloworld/HelloWorldActivity;->getApplicationContext()Landroid/content/Context;
move-result-object v1
const-string v2, "Toast Test"
const/4 v3, 0x0
invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v1
invoke-virtual {v1}, Landroid/widget/Toast;->show()V

smali code를 설명하면 다음과 같다. 우선 line 1은 자신의 activity 이름과 맞춰서 변경을 해야 한다.

문법 정리

java 코드

package com.atest;

import android.app.Activity;
import android.os.Bundle;

public class AtestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

smali 코드

.class public Lcom/atest/AtestActivity;
.super Landroid/app/Activity;
.source "AtestActivity.java"

# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    .line 7
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    return-void
.end method

# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
    .locals 1
    .parameter "savedInstanceState"

    .prologue
    .line 11
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    .line 12
    const/high16 v0, 0x7f03

    invoke-virtual {p0, v0}, Lcom/atest/AtestActivity;->setContentView(I)V

    .line 13
    return-void
.end method

class -> super
Object는 L이라 이름 붙음
.source는 파일 명이다.

Class Body는 .method로 시작해서 .end method로 끝난다.
invoke-virtual {v1}, Landroid/widget/Toast;->show()V에서 V는 마지막 return type void를 의미한다.
.locals는 method 내부에서 사용하는 resiter의 수를 의미한다. (v0,v1,v2..vn)
.parameter는 매개변ㅅ로 받아온 변수명이다.

.prologue로 body가 시작하는데 사용되는 opcode들은 
(http://netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html)에서 자세하게 확인할 수 있다.

.line xx는 java소스의 라인을 가리키므로 디버깅시 확인할 수 있다.

주로 함수 호출시 invoke-kind가 사용되는데 virtual, static, super등이 있다.
p0은 클래스 인스턴스를 가리키고 이후 value가 매개변수에 해당된다. 
메소드 명 뒤 괄호 안에 매개변수의 type을 지정하는데, primitive type의 경우 약어를 넣고 그 외의 type은 패키지명을 포함하여 지정한다.

관련 사이트

Smali: https://github.com/JesusFreke/smali
Smali TypesMethods and Fields: https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields

Dalvik bytecode format: https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
APKTool을 통한 Smali 분석: http://strawberryit.tistory.com/142


+ Recent posts