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

提供: Java入門
移動: 案内検索
(ページの作成:「Androidアプリは、Google Playからapkファイルとして配布されています。apkファイルを解析やリバースエンジニアリングするには、...」)
(相違点なし)

2015年4月5日 (日) 18:00時点における版

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

読み方

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

概要

Androidアプリのapkファイルをソースコードレベルで解析しなければならくなったときに、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

解析の流れ

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

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 ファイルを展開した 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

参考

Dalvik VM

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

関連項目