Androidアプリケーションのリバースエンジニアリング(弊研究室の某課題について考える4日目)

はじめに

この記事は弊研究室の某課題について考える4日目の記事です。

今日からAndroidリバースエンジニアリングの話です。最初はAndroidアプリケーションについてです。CTFではレアな問題ですね。

Androidアプリケーションは***.apkという形のファイルです。今日はこのファイルについて説明していきます

お品書き

apkの中身

apkファイルの実体はzipファイルです。なのでapkファイルはunzipコマンドで中身を見ることができます。

どのapkファイルもunzipで展開すると下の図のような中身になってます。

f:id:kataware8136:20171204143217p:plain

  • AndroidManifest.xml
  • META-INF/
  • assets/
  • classes.dex
  • res/
  • resource.arsc

AndroidManifest.xmlAndroidアプリ開発の際に必要となるマニフェストを記述します。ここにアプリ権限を決めるパーミッションを記述します。

META-INFには署名した際のハッシュ値が入っています。AndroidManifest.xmlや他のファイルが改ざんされていてもこのディレクトリの中のファイルを使ってチェックすることで改ざんに気づけます。まぁMETA-INF内のファイルと一致していなければAndroidにインストールできないので無用の心配ですが...

classes.dexAndroidアプリケーションのバイトコードです。CTFの問題ではまずここをリバースエンジニアリングしてどんなことができるのかを調べます。

assets/, res/, resource.arscはアプリケーションで使う画像等のリソースファイルが入っています。resource.arscにはリソースの情報が書いてあります。 res/assets/には画像などの実体のファイルがあります

res/にはアプリのレイアウト等のファイルも含まれています。アプリ開発者が使うデータはres/rawassetsに入っています。

res/rawとassets/の違い

こう見るとres/rawの役割がないように思えますが、APIによってはリソースIDが必要とされる場合もあるため役割はあります。

CTF等でリソースが必要となればどっちかにはあるので見ていきましょう。

apkのリバースエンジニアリング

apkのリバースエンジニアリングで使われるツールやコマンドがいくつかあります。まぁみなさんが知ってると思われるコマンドやCTFで使うことがなさそうなものは除きます。

  • apktool
  • dex2jar
  • baksmali
  • smali
  • jad

さてapkの実体はzipファイルなのでunzipコマンドで展開できますが、apktoolというツールを利用して展開することもできます。

unzipとapktoolの違い

  • apktool

    • AndroidManifest.xmlが読める
    • smaliファイルがある
  • unzip

    • dexファイルがある
    • AndroidManifest.xmlは読みづらい

主な違いはこんな感じでしょうか、リバースしたい項目によって使い分けます。

というのもdexファイルとsmaliファイルとJavaファイルの関係性が下の図のようになっています。

f:id:kataware8136:20171204181506p:plain

吹き出しの中のはコマンドです。

smaliファイルというのはアプリケーションのコードなんで読める人はいいのですが、慣れたJavaの方で読みたい人はunzipで展開したほうがよいですし、AndroidManifestを読んでパーミッションを確認したい場合はapktoolを使います。

という感じです。

Javaコードを読むにはunzipdex2jarjadの順番でコマンドを利用すれば見ることができます。

(おまけ)HTMLハイブリッドアプリケーション

AndroidのアプリケーションはJavaによるものだけでなくHTML, JS, CSSを使って開発するHTMLハイブリッドアプリケーションなるものもあります。

フレームワークであるCordova等を使って開発するのですが、それらのソースコードは大体assets/ディレクトリにあります。このアプリケーションはJavaを用いて開発したものと違い、unzipしてapkを展開すればすぐにソースコードを見ることができます。

おわりに

Androidアプリケーションの仕組みとソースコードを読むまでの流れはこのような感じです。CTFではAndroid問と思わせつつ実際はJavaコードで書かれた暗号解読だったりとAndroid要素がただ単なるapk使ってるだけのことはあります....

次はAndroidのHotfix技術に関して話します。