home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/Android/ReverseEngineering

技術/Android/ReverseEngineering

技術 / Android / ReverseEngineering
id: 972 所有者: msakamoto-sf    作成日: 2011-05-30 08:03:25
カテゴリ: Android 

Androidのリバースエンジニアリング関連メモ。

参考:



.apkファイルからのリバースエンジニアリング

.apkファイルはネット上、あるいはファイルバックアップツールなどでAndroid実機上から入手できる。
使用しているツールはJUMPERZ.NETで紹介されているリンクから入手できる。

1. 拡張子をzipに変更し展開する

.apkのファイルはzipフォーマットなので、拡張子を.zipにして(まぁUnix上であれば拡張子はどうでもいいけど)、展開する。

中身:署名済みのapkの場合。署名していないapkの場合、"META-INF"が無い。

│  AndroidManifest.xml
│  classes.dex
│  resources.arsc
│
├─META-INF
│      CERT.RSA
│      CERT.SF
│      MANIFEST.MF
│
└─res/ "res/" 以下の各種リソースファイル・XMLリソース

2. AndroidManifest.xmlの復元

バイナリ形式に変換されているAndroidManifest.xmlを復元する。AXMLPrinter2.jarを使う。

> java -jar AXMLPrinter2.jar AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.isecpartners.android.packageplay"
        >
...

復元されたAndroidManifest.xmlが標準出力に出力される。
他のXMLリソースファイルについてもAXMLPrinter2.jarでテキスト形式に変換できる。

3. Dalvik用バイトコードを逆アセンブル

Dalvik用バイトコードはclasses.dexにひとまとめにされている。これをbaksmaliを使って逆アセンブルする。
カレントディレクトリに"out"フォルダが作成され、その中の拡張子 ".smali" が逆アセンブルされたクラスファイルとなる。

> 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リソースファイルまで抽出・復元されている。

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を使った静的解析

2011年9月現在、まだBETA版ですが将来性に期待。
大きな特徴:

  1. 制御フロー図(Controll Flow Graph)を描画できる。
  2. あるメソッドを指定して、そこから呼ばれる/そこを呼んでいるメソッドを表示できる。


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の通りに幾つかは手動コンパイルしてインストールしてみてほしい。

"python-qt4"についてはもう少しパッケージを絞れるかもしれない。
この他にapktoolも必要なので、javaと併せてインストールしておくこと。

安定性についてはBETA版であるため、お世辞にも良いとは言えない。今後の発展に期待していきたい。



プレーンテキスト形式でダウンロード
現在のバージョン : 3
更新者: msakamoto-sf
更新日: 2011-09-18 18:00:16
md5:6b473484df6f243a0b57610cce73ccfc
sha1:de7fd6f6d18be6ece8bd9811eb1ee558ed63d31b
コメント
コメントを投稿するにはログインして下さい。