「Androidアプリのapkファイルを解析する方法」の版間の差分
(ページの作成:「Androidアプリは、Google Playからapkファイルとして配布されています。apkファイルを解析やリバースエンジニアリングするには、...」) |
|||
(同じ利用者による、間の3版が非表示) | |||
行8: | 行8: | ||
== 概要 == | == 概要 == | ||
Androidアプリのapkファイルをソースコードレベルで解析しなければならくなったときに、apkファイルからJavaのソースコードを入手しなければなりません。その場合には、いくつものツールを利用して、デコンパイル(逆コンパイル)します。 | Androidアプリのapkファイルをソースコードレベルで解析しなければならくなったときに、apkファイルからJavaのソースコードを入手しなければなりません。その場合には、いくつものツールを利用して、デコンパイル(逆コンパイル)します。 | ||
+ | |||
+ | 当ページでは、apkファイルからJavaのソースコードを取り出すまでを説明します。 | ||
== 用語 == | == 用語 == | ||
;apk:Google Playで配布されている Android アプリのパッケージです。apkは、ただのzipファイルです。 | ;apk:Google Playで配布されている Android アプリのパッケージです。apkは、ただのzipファイルです。 | ||
行14: | 行16: | ||
;Dalvik VM:Android Runtimeの仮想マシンです。Java VMと同じようにメモリ管理、ガベージコレクタを担当します。 | ;Dalvik VM:Android Runtimeの仮想マシンです。Java VMと同じようにメモリ管理、ガベージコレクタを担当します。 | ||
== 用意する道具 == | == 用意する道具 == | ||
− | ;dex2jar: | + | ;[[dex2jar]]: [[dex2jar]]は、dex ファイルを javaの class ファイルに変換するツールです。 |
;[[jad]]: java の class ファイルを Java のソースコードに変換するツールです。 | ;[[jad]]: java の class ファイルを Java のソースコードに変換するツールです。 | ||
=== dex2jar === | === dex2jar === | ||
行23: | 行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> | ||
== 解析の流れ == | == 解析の流れ == | ||
行31: | 行39: | ||
# jarファイルを[[jar]]コマンドで展開します(.class ファイルができます)。 | # jarファイルを[[jar]]コマンドで展開します(.class ファイルができます)。 | ||
# .class ファイルを .java ファイルにデコンパイル(逆コンパイル)します。 | # .class ファイルを .java ファイルにデコンパイル(逆コンパイル)します。 | ||
− | #: [[jad]] | + | #: デコンパイラ [[jad]] |
+ | #: Eclipse プラグイン JD-Eclipse | ||
== apkファイルのダウンロード == | == apkファイルのダウンロード == | ||
Androidアプリのapkファイルをダウンロードするツールは、いろいろあります。 | Androidアプリのapkファイルをダウンロードするツールは、いろいろあります。 | ||
行63: | 行72: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== classes.dexファイルをjarファイルに変換する == | == classes.dexファイルをjarファイルに変換する == | ||
− | + | [[dex2jar]]を利用して、classes.dex ファイルを jar ファイルに変換します。dex2jar 2.0系では、 d2j-dex2jar.sh という名前です。 | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
$ ../dex2jar-0.0.9.15/dex2jar.sh classes.dex | $ ../dex2jar-0.0.9.15/dex2jar.sh classes.dex | ||
行86: | 行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"> | ||
行92: | 行102: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
これで、デコンパイルは、完了です。 | これで、デコンパイルは、完了です。 | ||
− | === デコンパイル用のスクリプト jad.sh === | + | ==== デコンパイル用のスクリプト jad.sh ==== |
[[jad]]が途中でエラーになると全部のファイルを展開しきれないようなので、スクリプトを用意しました。 | [[jad]]が途中でエラーになると全部のファイルを展開しきれないようなので、スクリプトを用意しました。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
行107: | 行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> | ||
== 参考 == | == 参考 == | ||
行116: | 行140: | ||
* [[Javaのデコンパイラ]] | * [[Javaのデコンパイラ]] | ||
* [[jad]] | * [[jad]] | ||
+ | * [[dex2jar]] | ||
<!-- vim: filetype=mediawiki | <!-- vim: filetype=mediawiki | ||
--> | --> |
2015年5月27日 (水) 20:48時点における最新版
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
解析の流れ
- 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 2.0系では、 d2j-dex2jar.sh という名前です。
$ ../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 を実行します