Androidアプリのapkファイルを解析する方法

提供: Java入門
2015年5月27日 (水) 19:08時点におけるDaemon (トーク | 投稿記録)による版

移動: 案内検索
スポンサーリンク

Androidアプリは、Google Playからapkファイルとして配布されています。apkファイルを解析やリバースエンジニアリングするには、デコンパイラ(逆コンパイラ)でデコンパイル(逆コンパイル)しなければなりません。当ページでは、apkファイルを解析する手法についてまとめました。

読み方

apk
えーぴーけー
Dalvik
だるびっく
VM
ぶいえむ

概要

Androidアプリのapkファイルをソースコードレベルで解析しなければならくなったときに、apkファイルからJavaのソースコードを入手しなければなりません。その場合には、いくつものツールを利用して、デコンパイル(逆コンパイル)します。

当ページでは、apkファイルからJavaのソースコードを取り出すまでを説明します。

用語

apk
Google Playで配布されている Android アプリのパッケージです。apkは、ただのzipファイルです。
classes.dex
apk内に含まれるプログラムです。
dex(Dalvik Executable)
Dalvik VMのバイトコード
Dalvik VM
Android Runtimeの仮想マシンです。Java VMと同じようにメモリ管理、ガベージコレクタを担当します。

用意する道具

dex2jar
dex2jarは、dex ファイルを javaの class ファイルに変換するツールです。
jad
java の class ファイルを Java のソースコードに変換するツールです。

dex2jar

code.google.com dex2jar からダウンロードできます。ダウンロードしたら zip を展開してください。

jad

jadは、jadのサイトからダウンロードできます。FreeBSDなら、pkg コマンドでインストールできます。

$ sudo pkg install jad

Mac OS の場合は、homebrewでjadをインストールできます。

$ sudo brew tap homebrew/binary
$ sudo brew install jad
$ brew untap homebrew/binary

解析の流れ

  1. apk ファイルをダウンロードします。
  2. apk (zip)を解凍します。
  3. apk 内の classes.dex を .class ファイル形式に変換します。
    dex2jar
  4. jarファイルをjarコマンドで展開します(.class ファイルができます)。
  5. .class ファイルを .java ファイルにデコンパイル(逆コンパイル)します。
    デコンパイラ jad
    Eclipse プラグイン JD-Eclipse

apkファイルのダウンロード

Androidアプリのapkファイルをダウンロードするツールは、いろいろあります。 apkファイルをダウンロードする方法として簡単なのは、 APK Downloader などのサイトを利用することです。

https://apps.evozi.com/apk-downloader/

にダウンロードしたい Google Play の URL を入力すると apk ファイルがダウンロードできます。 例えば、Ingress(イングレス)をダウンロードしたければ、

https://play.google.com/store/apps/details?id=com.nianticproject.ingress

を入力します。

apkファイルを展開する

apkファイルを展開します。apkファイルは、ただのzipファイルであるため、zip用のソフトウェアであれば、なんでも解凍できます。

unzip アプリ名.apk

ディレクトリを指定する場合は、以下のコマンドラインでOKです。

unzip -d jp.co.foo.android.apps.bar jp.co.foo.android.apps.bar.apk

ヤフー路線検索をunzipした例です。

$ ls -1 jp.co.yahoo.android.apps.transit
AndroidManifest.xml
META-INF/
assets/
classes.dex
lib/
res/
resources.arsc

classes.dexファイルをjarファイルに変換する

dex2jarを利用して、classes.dex ファイルを jar ファイルに変換します。

$ ../dex2jar-0.0.9.15/dex2jar.sh classes.dex
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.15
dex2jar classes.dex -> classes_dex2jar.jar
Done.

fileコマンドで classes.dex ファイルを確認すると Dalvik dex ファイルであることがわかります。

$ file jp.co.yahoo.android.apps.transit/classes.dex
jp.co.yahoo.android.apps.transit/classes.dex: Dalvik dex file version 035

jarファイルの展開

jarファイルを展開します。

$ mkdir x
$ cd x
$ jar xf ../jp.co.yahoo.android.apps.transit/classes_dex2jar.jar

jarファイルは、ただのzipファイルであるため、unzipコマンドでも構いません。

classファイルからjavaファイルへのデコンパイル

jarを用いてデコンパイルする場合

jar ファイルを展開した x のディレクトリ内で実行する例です。src ディレクトリに .java の拡張子で、すべての class ファイルを java のソースコードにデコンパイルします。

mkdir ../src
jad -o -r -sjava -d ../src '**/*.class'

これで、デコンパイルは、完了です。

デコンパイル用のスクリプト jad.sh

jadが途中でエラーになると全部のファイルを展開しきれないようなので、スクリプトを用意しました。

#! /bin/sh
#
# jad.sh
# Copyright (C) 2015 kaoru <kaoru@localhost>
#
 
SRC=../src
mkdir -p $SRC
for i in `find . -name '*.class'`
do
        jad -sjava -o -r -d $SRC $i
done

JD(Java Decompiler)を用いてデコンパイルする場合

Java Decompiler(JD)のサイトからJD-EclipseというEclipseのプラグインを入手できます。Eclipseにインストールすれば、簡単にデコンパイルされたソースコードを確認できます。

  1. メニューの Help の Install New Software を選択します。
  2. http://jd.benow.ca/jd-eclipse/update を指定して、 JD-Eclipse にチェックを入れます。
  3. インストールしたら、再起動します。

apkのバイナリXMLを読むには

apkには、AndroidManifest.xmlやres/layout/*.xmlなどのいくつものXMLファイルが含まれます。apkに含まれるXMLは、バイナリXMLのため、人間がそのままでは読めません。fileコマンドでは、DBase 3 データファイルと判断されています。

AndroidManifest.xml: DBase 3 data file

AXMLPrinter2.jarを利用して、ヒューマンリーダブルなテキスト形式のXMLに変換できます。

java -jar AXMLPrinter2.jar AndroidManifest.xml

参考

Dalvik VM

  1. javac により java ソースコードは .class ファイルに変換されます
  2. dx 変換ツールにより .class は DEX ファイルに変換されます
  3. Dalvik VM が DEX を実行します

関連項目




スポンサーリンク