Androidアプリケーションのリバースエンジニアリング(弊研究室の某課題について考える4日目)
はじめに
この記事は弊研究室の某課題について考える4日目の記事です。
今日からAndroidリバースエンジニアリングの話です。最初はAndroidアプリケーションについてです。CTFではレアな問題ですね。
Androidアプリケーションは***.apkという形のファイルです。今日はこのファイルについて説明していきます
お品書き
- apkの中身
- apkのリバースエンジニアリング
- (おまけ)HTMLハイブリッドアプリケーション
apkの中身
apkファイルの実体はzipファイルです。なのでapkファイルはunzipコマンドで中身を見ることができます。
どのapkファイルもunzipで展開すると下の図のような中身になってます。
- AndroidManifest.xml
- META-INF/
- assets/
- classes.dex
- res/
- resource.arsc
AndroidManifest.xml
はAndroidアプリ開発の際に必要となるマニフェストを記述します。ここにアプリ権限を決めるパーミッションを記述します。
META-INF
には署名した際のハッシュ値が入っています。AndroidManifest.xmlや他のファイルが改ざんされていてもこのディレクトリの中のファイルを使ってチェックすることで改ざんに気づけます。まぁMETA-INF内のファイルと一致していなければAndroidにインストールできないので無用の心配ですが...
classes.dex
はAndroidアプリケーションのバイトコードです。CTFの問題ではまずここをリバースエンジニアリングしてどんなことができるのかを調べます。
assets/
, res/
, resource.arsc
はアプリケーションで使う画像等のリソースファイルが入っています。resource.arsc
にはリソースの情報が書いてあります。
res/
とassets/
には画像などの実体のファイルがあります
res/
にはアプリのレイアウト等のファイルも含まれています。アプリ開発者が使うデータはres/raw
かassets
に入っています。
res/rawとassets/の違い
res/rawディレクトリ
- リソースIDが割り与えられる
- ファイル名に制限あり([a-z_.]+)
- ディレクトリ構造不可
assetsディレクトリ
- ディレクトリの作成可能
- ファイル名の制限なし
- アプリ側から保存可能
- リソースIDが割り振られない
こう見るとres/rawの役割がないように思えますが、APIによってはリソースIDが必要とされる場合もあるため役割はあります。
CTF等でリソースが必要となればどっちかにはあるので見ていきましょう。
apkのリバースエンジニアリング
apkのリバースエンジニアリングで使われるツールやコマンドがいくつかあります。まぁみなさんが知ってると思われるコマンドやCTFで使うことがなさそうなものは除きます。
- apktool
- dex2jar
- baksmali
- smali
- jad
さてapkの実体はzipファイルなのでunzipコマンドで展開できますが、apktoolというツールを利用して展開することもできます。
unzipとapktoolの違い
主な違いはこんな感じでしょうか、リバースしたい項目によって使い分けます。
というのもdexファイルとsmaliファイルとJavaファイルの関係性が下の図のようになっています。
吹き出しの中のはコマンドです。
smaliファイルというのはアプリケーションのコードなんで読める人はいいのですが、慣れたJavaの方で読みたい人はunzipで展開したほうがよいですし、AndroidManifestを読んでパーミッションを確認したい場合はapktoolを使います。
という感じです。
Javaコードを読むにはunzip
⇒dex2jar
⇒jad
の順番でコマンドを利用すれば見ることができます。
(おまけ)HTMLハイブリッドアプリケーション
AndroidのアプリケーションはJavaによるものだけでなくHTML, JS, CSSを使って開発するHTMLハイブリッドアプリケーションなるものもあります。
フレームワークであるCordova等を使って開発するのですが、それらのソースコードは大体assets/ディレクトリにあります。このアプリケーションはJavaを用いて開発したものと違い、unzipしてapkを展開すればすぐにソースコードを見ることができます。
おわりに
Androidアプリケーションの仕組みとソースコードを読むまでの流れはこのような感じです。CTFではAndroid問と思わせつつ実際はJavaコードで書かれた暗号解読だったりとAndroid要素がただ単なるapk使ってるだけのことはあります....
次はAndroidのHotfix技術に関して話します。