「Androidアプリのapkファイルを解析する方法」の版間の差分

提供: Java入門
移動: 案内検索
(ページの作成:「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: dex ファイルを javaの class ファイルに変換するツールです。
+
;[[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]]を利用して、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

解析の流れ

  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 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にインストールすれば、簡単にデコンパイルされたソースコードを確認できます。

  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 を実行します

関連項目