apktoolの使い方
では、Javaのコードにうまく逆コンパイルできなかった場合や、マニフェストファイル、リソースファイルなどを見たいという場合はどうするのでしょうか。そこで登場するのがapktoolです。
$ apktool d sample.apk
apkファイル名と同じディレクトリ、この場合だとsampleというディレクトリが作成されます。このディレクトリは図3のような内容になっています。
apkを単純に展開しただけではバイナリ化され読むことができなかったAndroidManifest.xmlですが、テキストに変換されて見慣れた内容になりました。
また、smaliディレクトリには、smaliと呼ばれる逆アセンブルされたDalvik VMのバイトコードが入っています。これらファイルを開いてみると、図5に示すように、何となく何をしているのかイメージが掴めそうな記述になっています。たとえば図5は、サンプルアプリケーションのonCreateメソッドの部分が逆アセンブルされたものです。invoke-superと記述されている部分では、親クラスのonCreateメソッドが呼び出され、invoke-virtualと記述されている部分ではfindViewByIdメソッドが呼び出されています。また、const-stringでは文字列への参照をレジスタに渡しています。
smaliの文法などについては説明しませんが、必要な方は下記のドキュメントを参照してください。
さらに、resディレクトリにはリソースファイルが、assetsディレクトリにはassetsファイルが展開されています。
このように、apktoolを使用することでアプリケーションの中身を自由に見ることができます。もちろん、見るだけではなく編集することもでき、smaliファイルを編集しアプリケーションの挙動を変えたり、リソースファイルを編集し表示内容を変えることも可能です。編集したアプリケーションは、以下のコマンドで新しいアプリケーションとしてビルドすることができます。
$ apktool b sample new_sample.apk
この例では、sampleディレクトリ下にあるファイルをnew_sample.apkとして再ビルドしています。
まとめ
OWASPのセッションでは、Javaのコードを見て探すというところまででしたが、apktoolを使用することで、うまく逆コンパイルできず読めなかった部分についても、ある程度読めるものになります。また、Androidアプリケーションにとっては重要なマニフェストファイルもテキスト化され、使用しているActivityやContentProvider、パーミッションなどを確認できるようになります。
今回は使い方を紹介しなかったandroguardやGUIで解析するツールなど、さまざまな便利なツールが登場し、だれでも簡単に解析を始められる環境が揃ってきています。
解析を行うことで、アプリケーションの構造や挙動をより深く把握することができます。ただし、そういった行為が禁止されている場合もありますので、解析は自分で作成したアプリケーションで行ってください。