Androidアプリのapkファイルを解析する方法
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
- 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
解析の流れ
- apk ファイルをダウンロードします。
- apk (zip)を解凍します。
- apk 内の classes.dex を .class ファイル形式に変換します。
- dex2jar
- jarファイルをjarコマンドで展開します(.class ファイルができます)。
- .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にインストールすれば、簡単にデコンパイルされたソースコードを確認できます。
- メニューの Help の Install New Software を選択します。
- http://jd.benow.ca/jd-eclipse/update を指定して、 JD-Eclipse にチェックを入れます。
- インストールしたら、再起動します。
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
- javac により java ソースコードは .class ファイルに変換されます
- dx 変換ツールにより .class は DEX ファイルに変換されます
- Dalvik VM が DEX を実行します
関連項目
ツイート