apktoolを使ってapkファイルをデコードする
|apktoolとはAPKファイルをばらしたり、逆にばらしたものからAPKファイルを作成することができるツールです。
例えば日本語リソースが無いAPKファイルを一度ばらし、日本語のリソースファイルを追加してAPKファイルに戻す場合に利用します。
Windows、Linux、MacOSで利用可能です。
※2011/8/27現在の最新バージョンは1.4.1
それでは続きへどうぞ
※8/28:修正、追記しました
インストール方法
今回はMacの場合を例にしますがWindows、Linuxの場合も同じように簡単にできます。
https://code.google.com/p/android-apktool/から
- apktool-install-macosx-r04-brut1.tar.bz2
- apktool1.4.1.tar.bz2
をダウンロードします。
※バージョン1.4.1の場合です。今後バージョンが上がるとファイル名は変更されると思われるので注意してください。
二つのファイルを解凍して、パスの通っている場所に配置します。
/usr/local/bin/ か AndroidSDKのtoolsフォルダあたりが良いでしょう。
これでインストールは終わりです。
Windows、Linuxの場合も2つのファイルをダウンロードして、パスの通っている場所に解凍すればOKです。
使い方
apktool-install-macosx-r04-brut1.tar.bz2を解凍してできる以下のファイルが実行するためのスクリプト(バッチファイル)となっています。
- Mac/Linuxの場合:apktool
- Windowsの場合:apktool.bat
引数無しで実行するとヘルプが表示されます。
apkファイルをばらす際には「d(Decodeのd)」コマンドを使用します。
ソースコードはデコードしないなど必要に応じてオプションを指定することができますが、最低限コマンドとapkファイル名を指定すれば実行することができます。
$ apktool d ○○.apk
サンプル
ApktoolTest.apkというapkファイルをデコードしてみます。
$ apktool d ApktoolTest.apk
そうすると実行したフォルダに新しいフォルダが作成されて、その中にデコードされたapkファイルの中身が入っています。
マニフェストファイルやリソースファイルが確認することができます。
smaliフォルダの中は以下のようになっています。
今回のサンプルの中にはApktoolTestActivity.javaが含まれており、それに対応するsmali形式のファイルがApktoolTestActivity.smaliとなります。
smali形式のファイルとはテキストファイルになっており、バイトコードを逆アセンブルした結果が入っているものです。
こちらが元のソースコードであるJavaファイルです。
smali形式のファイルは最初はよく分からないと感じるかもしれませんが、個別に見ていくと理解することがそんなに難しくないと思います。
- java:public void onCreate(Bundle savedInstanceState)
- smali:.method public onCreate(Landroid/os/Bundle;)V
これはメソッドの宣言部分ですがこうやって並べるとイメージしやすいと思います。。
次のその下の方の記述も比較してみます。
- java:super.onCreate(savedInstanceState);
- smali:invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
ActivityクラスのonCreateメソッドを呼んでいる箇所ですが、pではじまる名前のレジスタ(ここではp0,p1)は実行中のメソッドの引数(パラメータ)になります。p0にはthisが入っており、p1にはsavedInstanceStateが入っている状態です。最後のVは戻り値がvoidということを示しています。thisの親クラスのonCreateをメソッドの1つ目の引数であるsavedInstanceStateを引数として実行するということが分かります。
※ProGuardを使って難読化しているapkファイルだとファイル構成が異なり、クラスやメソッドの解析にも失敗する結果となります。
このように、慣れてくるとsmali形式のファイルで処理の内容を把握することができるようになります。
apkの中身を把握する必要な状況に遭遇した場合はapktoolを使ってみるのは如何でしょうか?
※解析する際にはDalvikのopcode一覧が役に立ちます。 http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html