Android apk ファイルの解析
まず
Android 端末を USB デバッグ有効にして
PCとつなげます
1 | adb shell pm list packages -f |
でインストールしているアプリのパッケージをみることができるので
この出力結果を元に apk ファイルをPCに抜きだします
ちなみに、大量にインストールしていると
見分けるのが大変なので
grep コマンドをパイプで使うと簡単に見れます
例えば、パッケージ名に developapp とあるなら
1 | adb shell pm list packages -f | grep developapp |
とします
この developapp をパッケージ名の一部に変更すれば見つけやすくなります
PCへの抜きだしは adb pull でできるので
今回はGallery を開くアプリを抜き出すので
1 | adb shell pm list packages -f | grep galle |
で目星をつけて、結果として出力された
1 2 3 | 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 |
から
1 | net.developapp.opengallery-1.apk=net.developapp.opengallery |
を抜き出すことにします
1 | adb pull /data/app/net .developapp.opengallery-1.apk |
まずは
Android Manifest.xml の中身を見るには
aapt コマンドを使います
このコマンドの場所は
パスを通していないのなら
android-sdk-linux/build-tools/
の中
ネットで検索すると
17.0.0
とかあるけど
ls コマンドで調べてみたら
1 2 3 4 5 6 7 8 9 10 11 | 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 を使って見ます
1 | android-sdk-linux /build-tools/19 .1.0 /aapt l -a net.developapp.opengallery-1.apk |
これで端末にAndroidManifest.xml の情報がでてきます
とはいってもソースコードがでるわけではないので注意
AndroidManifest.xml に燗する情報は
Android manifest:
とかかれているところから下の部分
今回は以下のようなかんじ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 に変更すれば中身をみれる
1 | cp net.developapp.opengallery-1.apk net.developapp.opengallery-1.zip |
としてファイルをコピーして zip 形式に変更
解凍するとファイルが広がるので
1 2 3 4 | mkdir apk cp net.developapp.opengallery-1.zip apk/ cd apk unzip net.developapp.opengallery-1.zip apk/ |
とすると解凍したときにわかりやすい
ファイル一覧をみたいので
1 2 3 4 5 6 7 8 | 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 なら
1 | unzip dex2jar-0.0.9.15.zip |
これで
dex2jar-0.0.9.15 の中に
dex2jar.sh
があるので、これを使って
classes.dex を jar に変換する
1 | ~ /dex2jar-0 .0.9.15 /dex2jar .sh classes.dex |
で
classes_dex2jar.jar
が作製される
この jar ファイルを逆コンパイルした状態で閲覧するには
jd-gui を使います
http://jd.benow.ca/
からダウンロード可能で
windows
mac
Linux
どれでも対応しています
今回は Linux 対応版をダウンロード
1 | tar zxvf jd-gui-0.3.5.linux.i686. tar .gz |
で解凍します
解凍すると
jd-gui*
があるので
1 | . /jd-gui |
で起動
あとは
ソースコードをみたい jar ファイルをドラッグ&ドロップするとソースコードをみることができます