Androidのリバースエンジニアリング関連メモ。
参考:
.apkファイルはネット上、あるいはファイルバックアップツールなどでAndroid実機上から入手できる。
使用しているツールはJUMPERZ.NETで紹介されているリンクから入手できる。
.apkのファイルはzipフォーマットなので、拡張子を.zipにして(まぁUnix上であれば拡張子はどうでもいいけど)、展開する。
中身:署名済みのapkの場合。署名していないapkの場合、"META-INF"が無い。
│ AndroidManifest.xml │ classes.dex │ resources.arsc │ ├─META-INF │ CERT.RSA │ CERT.SF │ MANIFEST.MF │ └─res/ "res/" 以下の各種リソースファイル・XMLリソース
バイナリ形式に変換されているAndroidManifest.xmlを復元する。AXMLPrinter2.jarを使う。
> java -jar AXMLPrinter2.jar AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.isecpartners.android.packageplay"
>
...
復元されたAndroidManifest.xmlが標準出力に出力される。
他のXMLリソースファイルについてもAXMLPrinter2.jarでテキスト形式に変換できる。
Dalvik用バイトコードはclasses.dexにひとまとめにされている。これをbaksmaliを使って逆アセンブルする。
カレントディレクトリに"out"フォルダが作成され、その中の拡張子 ".smali" が逆アセンブルされたクラスファイルとなる。
> java -jar baksmali-1.2.6.jar classes.dex
> tree /f out
C:\...\OUT
└─foo
└─bar
└─baz
└─testpkc
Main$1.smali
Main.smali
R$attr.smali
R$drawable.smali
R$id.smali
R$layout.smali
R$string.smali
R.smali
...
dex2jarを使うと、classes.dexをjarファイルに復元できる。JDなどのJava逆コンパイル用ツールを使うことで、jarファイルをJavaのソースコードに逆コンパイル出来る。
> dex2jar.bat ..\..\re\PackagePlay\classes.dex
classes.dexと同じフォルダに
classes.dex.dex2jar.jar
が生成される。これをJDなどで開けば、Javaソースコードを確認できる。
なお "3." で紹介したsmaliもそうだが、Android SDKに含まれるProGuardなどで最適化・難読化が施されている場合、人間にはかなり読みづらい逆アセンブルや逆コンパイル結果となる。
JUMPERZ.NETでは紹介されていないが、android-apktoolを使うとapkファイルからXMLの復元+Dalvikバイトコードの逆アセンブルまでを一つのコマンドで実行出来る。GoogleCodeで公開されており、本記事冒頭の参考リンクより入手先できる。
> (...)\apktool.bat decode foo.apk out
outフォルダが作成され、その中にファイルが生成される。strings.xmlなど各種XMLリソースファイルまで抽出・復元されている。
out
│ AndroidManifest.xml
│ apktool.yml
│
├─res
│ ├─drawable
│ │ icon.png
│ │
│ ├─layout
│ │ main.xml
│ │ textdesc.xml
│ │
│ └─values
│ ids.xml
│ public.xml
│ strings.xml
│
└─smali
└─com
└─isecpartners
└─android
└─packageplay
Main$1.smali
Main.smali
R$attr.smali
R$drawable.smali
R$id.smali
R$layout.smali
R$string.smali
R.smali
...
2011年9月現在、まだBETA版ですが将来性に期待。
大きな特徴:
APKファイルやDEXファイルの処理にはandroguardとapktoolを使い、GUIについてはPythonからQt4を呼び出している。またCFGの描画などにGraphvizも使用している。必要とするライブラリが多いが、Ubuntu 10.4 LTS版であればapt-getでインストールできる。
apt-get install ipython apt-get install python-scipy apt-get install graphviz apt-get install pydot apt-get install python-pydot apt-get install python-sip python-sip-dev apt-get install python-qt4 python-qt4-dev python-qt4-gl python-qt4-sql python-qt4-doc
以下のWikiに書いてあるのより若干マイナーバージョンが古くなるが、動くことは動く。不安な場合はWikiの通りに幾つかは手動コンパイルしてインストールしてみてほしい。
"python-qt4"についてはもう少しパッケージを絞れるかもしれない。
この他にapktoolも必要なので、javaと併せてインストールしておくこと。
安定性についてはBETA版であるため、お世辞にも良いとは言えない。今後の発展に期待していきたい。