#navi_header|技術| Androidのリバースエンジニアリング関連メモ。 参考: - Androidアプリケーションのリバースエンジニアリング ≪ JUMPERZ.NET Blog -- http://kanatoko.wordpress.com/2011/01/21/android%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0/ --- 本記事は、ぶっちゃけこの記事の劣化コピーです。 - 暇なメモ帳: Androidアプリをリバースエンジニアリングする方法 -- http://tomokey.blogspot.com/2011/04/android.html - Android Reverse Engineering - A Kick Start | www.SecurityXploded.com -- http://securityxploded.com/android_reversing.php - android - decompiling DEX into Java sourcecode - Stack Overflow -- http://stackoverflow.com/questions/1249973/decompiling-dex-into-java-sourcecode - android-apktool - A tool for reengineering Android apk files - Google Project Hosting -- https://code.google.com/p/android-apktool/ - Android SDKに統合された難読化ツール「ProGuard」を試す -- http://blog.bari-ikutsu.com/entry/20101211_4533.html --- ProGuardがAndroidSDKに導入されたのって、結構最近らしい。 - Android Reverse Engineering | thomascannon.net -- http://thomascannon.net/projects/android-reversing/ --- 単にapkファイルの中身を覗くだけではなく、各種dump系のコマンドを使ってメモリダンプを取得したり、amコマンドでIntentを叩いたり。 #more|| ---- #outline|| ---- * .apkファイルからのリバースエンジニアリング .apkファイルはネット上、あるいはファイルバックアップツールなどでAndroid実機上から入手できる。 使用しているツールはJUMPERZ.NETで紹介されているリンクから入手できる。 ** 1. 拡張子をzipに変更し展開する .apkのファイルはzipフォーマットなので、拡張子を.zipにして(まぁUnix上であれば拡張子はどうでもいいけど)、展開する。 中身:署名済みのapkの場合。署名していないapkの場合、"META-INF"が無い。 #pre||> │ AndroidManifest.xml │ classes.dex │ resources.arsc │ ├─META-INF │ CERT.RSA │ CERT.SF │ MANIFEST.MF │ └─res/ "res/" 以下の各種リソースファイル・XMLリソース ||< ** 2. AndroidManifest.xmlの復元 バイナリ形式に変換されているAndroidManifest.xmlを復元する。AXMLPrinter2.jarを使う。 #pre||> > java -jar AXMLPrinter2.jar AndroidManifest.xml ... ||< 復元されたAndroidManifest.xmlが標準出力に出力される。 他のXMLリソースファイルについてもAXMLPrinter2.jarでテキスト形式に変換できる。 ** 3. Dalvik用バイトコードを逆アセンブル Dalvik用バイトコードはclasses.dexにひとまとめにされている。これをbaksmaliを使って逆アセンブルする。 カレントディレクトリに"out"フォルダが作成され、その中の拡張子 ".smali" が逆アセンブルされたクラスファイルとなる。 #pre||> > 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 ... ||< ** 4. Dalvik用バイトコードをJavaソースに逆コンパイル 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などで最適化・難読化が施されている場合、人間にはかなり読みづらい逆アセンブルや逆コンパイル結果となる。 ** 5. リソースファイルの復元とDalvikバイトコードの逆アセンブルを一度に実行 JUMPERZ.NETでは紹介されていないが、android-apktoolを使うとapkファイルからXMLの復元+Dalvikバイトコードの逆アセンブルまでを一つのコマンドで実行出来る。GoogleCodeで公開されており、本記事冒頭の参考リンクより入手先できる。 > (...)\apktool.bat decode foo.apk out outフォルダが作成され、その中にファイルが生成される。strings.xmlなど各種XMLリソースファイルまで抽出・復元されている。 #pre||> 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 ... ||< * APKInspectorを使った静的解析 - apkinspector - APKinspector is a powerful GUI tool for analysts to analyze the Android applications. - Google Project Hosting -- http://code.google.com/p/apkinspector/ - APKInspector BETA Release & Demo Video | The Honeynet Project -- http://www.honeynet.org/node/761 2011年9月現在、まだBETA版ですが将来性に期待。 大きな特徴: + 制御フロー図(Controll Flow Graph)を描画できる。 + あるメソッドを指定して、そこから呼ばれる/そこを呼んでいるメソッドを表示できる。 &image(yb:///images/apkinspector_beta.jpg, width=640) 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の通りに幾つかは手動コンパイルしてインストールしてみてほしい。 - http://code.google.com/p/apkinspector/wiki/Installation "python-qt4"についてはもう少しパッケージを絞れるかもしれない。 この他にapktoolも必要なので、javaと併せてインストールしておくこと。 安定性についてはBETA版であるため、お世辞にも良いとは言えない。今後の発展に期待していきたい。 #navi_footer|技術|