Android apk ファイルの解析

Android apk ファイルの解析

まず
Android 端末を USB デバッグ有効にして
PCとつなげます

 adb shell pm list packages -f

でインストールしているアプリのパッケージをみることができるので

この出力結果を元に apk ファイルをPCに抜きだします

ちなみに、大量にインストールしていると
見分けるのが大変なので
grep コマンドをパイプで使うと簡単に見れます

例えば、パッケージ名に developapp とあるなら

adb shell pm list packages -f | grep developapp

とします

この developapp をパッケージ名の一部に変更すれば見つけやすくなります

PCへの抜きだしは adb pull でできるので
今回はGallery を開くアプリを抜き出すので

adb shell pm list packages -f | grep galle

で目星をつけて、結果として出力された

package:/data/app/net.developapp.opengallery-1.apk=net.developapp.opengallery
package:/data/app/net.developapp.exifgallery-1.apk=net.developapp.exifgallery
package:/system/app/GalleryGoogle.apk=com.google.android.gallery3d

から

net.developapp.opengallery-1.apk=net.developapp.opengallery

を抜き出すことにします

adb pull /data/app/net.developapp.opengallery-1.apk

まずは
Android Manifest.xml の中身を見るには
aapt コマンドを使います

このコマンドの場所は
パスを通していないのなら
android-sdk-linux/build-tools/
の中

ネットで検索すると
17.0.0
とかあるけど
ls コマンドで調べてみたら

drwxrwxr-x 11 snowpool snowpool 4096  5月 14  2014 ./
drwxr-x--- 13 snowpool snowpool 4096  5月 14  2014 ../
drwxrwxr-x  4 snowpool snowpool 4096 11月 26  2013 17.0.0/
drwxrwxr-x  4 snowpool snowpool 4096 11月 26  2013 18.0.1/
drwxrwxr-x  4 snowpool snowpool 4096 11月 26  2013 18.1.0/
drwxrwxr-x  4 snowpool snowpool 4096 11月 26  2013 18.1.1/
drwxrwxr-x  4 snowpool snowpool 4096  3月 17  2014 19.0.0/
drwxrwxr-x  4 snowpool snowpool 4096  3月 17  2014 19.0.1/
drwxrwxr-x  4 snowpool snowpool 4096  3月 17  2014 19.0.2/
drwxrwxr-x  4 snowpool snowpool 4096  3月 17  2014 19.0.3/
drwxrwxr-x  4 snowpool snowpool 4096  5月 14  2014 19.1.0/

とバージョンごとに分かれている模様

とりあえず、今回は最新っぽい 19.1.0 を使って見ます

android-sdk-linux/build-tools/19.1.0/aapt l -a net.developapp.opengallery-1.apk 

これで端末にAndroidManifest.xml の情報がでてきます
とはいってもソースコードがでるわけではないので注意

AndroidManifest.xml に燗する情報は
Android manifest:
とかかれているところから下の部分

今回は以下のようなかんじ

Android manifest:
N: android=http://schemas.android.com/apk/res/android
  E: manifest (line=2)
    A: android:versionCode(0x0101021b)=(type 0x10)0x1
    A: android:versionName(0x0101021c)="1.0" (Raw: "1.0")
    A: package="net.developapp.opengallery" (Raw: "net.developapp.opengallery")
    E: uses-sdk (line=7)
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x11
      A: android:targetSdkVersion(0x01010270)=(type 0x10)0x11
    E: application (line=11)
      A: android:theme(0x01010000)=@0x7f060001
      A: android:label(0x01010001)=@0x7f050000
      A: android:icon(0x01010002)=@0x7f020000
      A: android:debuggable(0x0101000f)=(type 0x12)0xffffffff
      A: android:allowBackup(0x01010280)=(type 0x12)0xffffffff
      E: activity (line=16)
        A: android:label(0x01010001)=@0x7f050000
        A: android:name(0x01010003)="net.developapp.opengallery.MainActivity" (Raw: "net.developapp.opengallery.MainActivity")
        E: intent-filter (line=19)
          E: action (line=20)
            A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN")
          E: category (line=22)
            A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")

次に apk ファイルのソースコードをみる方法

これは apk ファイルは zip形式ファイルなので
拡張子を apk から zip に変更すれば中身をみれる

cp net.developapp.opengallery-1.apk net.developapp.opengallery-1.zip

としてファイルをコピーして zip 形式に変更

解凍するとファイルが広がるので

mkdir apk
cp net.developapp.opengallery-1.zip apk/
cd apk
unzip net.developapp.opengallery-1.zip apk/

とすると解凍したときにわかりやすい

ファイル一覧をみたいので

drwxrwxr-x  4 snowpool snowpool   4096  1月 30 21:35 ./
drwx------ 83 snowpool snowpool  69632  1月 30 21:34 ../
-rw-rw-r--  1 snowpool snowpool   1708  1月 14 20:50 AndroidManifest.xml
drwxrwxr-x  2 snowpool snowpool   4096  1月 30 21:35 META-INF/
-rw-rw-r--  1 snowpool snowpool 714684  1月 14 20:50 classes.dex
-rw-r--r--  1 snowpool snowpool 289161  1月 30 21:35 net.developapp.opengallery-1.zip
drwxrwxr-x  8 snowpool snowpool   4096  1月 30 21:35 res/
-rw-rw-r--  1 snowpool snowpool   3424  1月 14 20:49 resources.arsc

この中にある classes.dex
がプログラムの本体

画像などのリソースファイルについては
res フォルダの中にあります

注意点としては
これらのxmlファイルはバイナリファイルになっているためテキストファイルのようにソースをみることができません

これを解析するツールがGoogle から提供されているので
これをダウンロード
https://code.google.com/p/dex2jar/

今回は
dex2jar-0.0.9.15.zip
をダウンロードして解凍
Ubuntu なら

unzip  dex2jar-0.0.9.15.zip 

これで
dex2jar-0.0.9.15 の中に
dex2jar.sh
があるので、これを使って
classes.dex を jar に変換する

~/dex2jar-0.0.9.15/dex2jar.sh classes.dex 


classes_dex2jar.jar
が作製される

この jar ファイルを逆コンパイルした状態で閲覧するには
jd-gui を使います

http://jd.benow.ca/
からダウンロード可能で
windows
mac
Linux
どれでも対応しています

今回は Linux 対応版をダウンロード

tar zxvf jd-gui-0.3.5.linux.i686.tar.gz 

で解凍します

解凍すると
jd-gui*
があるので

./jd-gui

で起動

あとは
ソースコードをみたい jar ファイルをドラッグ&ドロップするとソースコードをみることができます

jd

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です