2011年4月28日木曜日

Androidアプリをリバースエンジニアリングする方法

結構前の記事でapkファイルを解凍して、中身のAndroidManifest.xmlをデコンパイルする方法を調べてみたが、前回の方法では何が書かれているのかを知ることはできても、元のXMLファイルを復元することはできなかった。

今回は、いくつかのツールを利用することでAndroidManifest.xmlに限らず、各種のバイナリ形式となっているXMLファイルを復元したり、dex形式になっているJavaのバイナリコードをJavaソースコードへ復元する方法をまとめる。

まずは解凍

対象のAPKファイルをzipファイルとして解凍し、下記のファイルおよびディレクトリを得る。

  • META-INF
  • res
  • AndroidManifest.xml
  • classes.dex
  • resources.arsc

バイナリXMLをテキストXMLへコンバート

AndroidManifest.xmlや、res/layout/*.xmlなどは、AXMLPrinter2.jar(Google Code : android4me)というツールを使用することで元の人間に読むことのできるテキスト形式のXMLへ変換することができる。

このツールはJavaで作成されているため、Java実行環境が必要。コマンドラインより、下記のようにして使用する。
java -jar AXMLPrinter2.jar AndroidManifest.xml
各種のリソースを表現するXMLであっても同様。
java -jar AXMLPrinter2.jar res/layout/main.xml

バイナリコード(dex)をバイナリコード(class)へコンバート

Javaのバイナリコードをソースコードへ変換するには、2つのステップが必要。1つ目はdexファイルをclassファイルへ変換(ツールの出力はjarファイル)であり、dex2jar(Google Code : dex2jar)というツールを使用。

dexからclassへの変換は、windows用およびlinux用の実行ファイル(dex2jar.bat / dex2jar.sh)が用意されているので、これを使う。出力ファイルはclasses.dex.dex2jar.jar。
dex2jar.bat classes.dex
2つ目のclassからjavaへの変換は、JD(Java Decompiler)のGUIを使うのが便利。windows版であればjd-gui.exeを起動し、メニューから上記で出力されたclasses.dex.dex2jar.jarを指定する。

すると、下図のようにJavaソースコードとしてclassファイルの中身を閲覧することができるようになる。

参考

0 件のコメント:

コメントを投稿