#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/ #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 ... ||< #navi_footer|技術|