2012年3月22日木曜日

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版であるため、お世辞にも良いとは言えない。今後の発展に期待していきたい。

0 件のコメント:

コメントを投稿