「Androidアプリのapkファイルを解析する方法」の版間の差分
行25: | 行25: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
$ sudo pkg install jad | $ sudo pkg install jad | ||
+ | </syntaxhighlight> | ||
+ | Mac OS の場合は、homebrewで[[jad]]をインストールできます。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ sudo brew tap homebrew/binary | ||
+ | $ sudo brew install jad | ||
+ | $ brew untap homebrew/binary | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== 解析の流れ == | == 解析の流れ == | ||
行33: | 行39: | ||
# jarファイルを[[jar]]コマンドで展開します(.class ファイルができます)。 | # jarファイルを[[jar]]コマンドで展開します(.class ファイルができます)。 | ||
# .class ファイルを .java ファイルにデコンパイル(逆コンパイル)します。 | # .class ファイルを .java ファイルにデコンパイル(逆コンパイル)します。 | ||
− | #: [[jad]] | + | #: デコンパイラ [[jad]] |
+ | #: Eclipse プラグイン JD-Eclipse | ||
== apkファイルのダウンロード == | == apkファイルのダウンロード == | ||
Androidアプリのapkファイルをダウンロードするツールは、いろいろあります。 | Androidアプリのapkファイルをダウンロードするツールは、いろいろあります。 | ||
行88: | 行95: | ||
[[jar]]ファイルは、ただのzipファイルであるため、unzipコマンドでも構いません。 | [[jar]]ファイルは、ただのzipファイルであるため、unzipコマンドでも構いません。 | ||
== classファイルからjavaファイルへのデコンパイル == | == classファイルからjavaファイルへのデコンパイル == | ||
+ | === jarを用いてデコンパイルする場合 === | ||
[[jar]] ファイルを展開した x のディレクトリ内で実行する例です。src ディレクトリに .java の拡張子で、すべての class ファイルを java のソースコードにデコンパイルします。 | [[jar]] ファイルを展開した x のディレクトリ内で実行する例です。src ディレクトリに .java の拡張子で、すべての class ファイルを java のソースコードにデコンパイルします。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
行94: | 行102: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
これで、デコンパイルは、完了です。 | これで、デコンパイルは、完了です。 | ||
− | === デコンパイル用のスクリプト jad.sh === | + | ==== デコンパイル用のスクリプト jad.sh ==== |
[[jad]]が途中でエラーになると全部のファイルを展開しきれないようなので、スクリプトを用意しました。 | [[jad]]が途中でエラーになると全部のファイルを展開しきれないようなので、スクリプトを用意しました。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
行109: | 行117: | ||
jad -sjava -o -r -d $SRC $i | jad -sjava -o -r -d $SRC $i | ||
done | done | ||
+ | </syntaxhighlight> | ||
+ | === JD(Java Decompiler)を用いてデコンパイルする場合 === | ||
+ | [http://jd.benow.ca/ 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 データファイルと判断されています。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | AndroidManifest.xml: DBase 3 data file | ||
+ | </syntaxhighlight> | ||
+ | [https://code.google.com/p/android4me/downloads/list AXMLPrinter2.jar]を利用して、ヒューマンリーダブルなテキスト形式のXMLに変換できます。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | java -jar AXMLPrinter2.jar AndroidManifest.xml | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== 参考 == | == 参考 == |
2015年4月6日 (月) 00:47時点における版
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 を実行します