Android アプリ解析基礎 その1 -スマフォ編-

こんにちはeeic2017erの @totem です
この記事は [eeic Advent Calendar2016 その2] (http://qiita.com/advent-calendar/2016/eeic2) 1日目の記事です
正直eeic要素は無いのですが、同じ学科の方々にマイナーなネタを布教するチャンスだと思い投稿します

* * *
Androidアプリの開発中によくわからない挙動になった時や、インストールしたアプリが怪しい挙動をしている時など、時としてAndroidアプリの解析技術が役に立ちます。
解析の知識は、自分でセキュアなアプリを構築する為の重要な手がかりになる他、自分のアプリのセキュリティをテストする手段にもなります。

Androidアプリ解析基礎 その1 では、Androidアプリ解析の簡単な仕組みの紹介と、スマフォ上でお手軽解析をする為の便利なアプリを紹介します。
Androidアプリ解析基礎 その2 ではPC上での、より詳細な解析方法と、解析からの防御方法を紹介します。

あくまで基礎ですので、その１、その２のどちらでも

* アプリの通信をプロキシツールを用いて介入する
* ネイティブコードをdisassembleしてがっつり静的解析をする
* Android上でデバッガ等を動かし、がっつり動的解析を行う

といった話題には触れません。
もし興味があれば是非話しかけたりTwitterにリプを飛ばしてください
* * *
# お約束
本記事で得た情報は絶対に悪用しないでください。
法律で保護されたプログラムに対してリバースエンジニアリングなどを行うことは法律に違反する可能性があります。

# Androidアプリの中身
まず、解析を始めるにあたって、どのようなファイルがアプリに含まれるかを知っておかなければなりません。
今回はAndroid Studio起動時に選択可能な空のViewを持つアプリのファイルの中身を見てみましょう。
Androidアプリはapkファイル形式でパッケージ化されています。
これは署名のついた、ただのzipなのでapkファイルの名前をapp.apk -> app.zip のようにリネームすることで解凍できます。(今どき解凍って言わないかな...💦💦)

解凍したzipの中身は以下のようになっています。
<img width="436" alt="スクリーンショット 2016-11-29 23.52.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/147125/661b9d90-878f-c4d5-ed11-e692c3551b93.png">

これらのファイルはそれぞれ

* AndroidManifest.xml - アプリのコンポーネントやパーミッションを記述するファイル
* classes.dex - 実行ファイル本体
* META-INF - apkファイルの署名情報
* res - アプリのリソース(画像等)
* resources.arsc - リソースのメタ情報

といった情報を持ちます

# 実行ファイルのデコンパイル
AndroidアプリはJavaで記述されています。

現在、授業で扱っているようなC言語はコンパイル時に機械語にコンパイルされます。

Javaはコンパイル型言語ですが機械語ではなく、JavaVM上で動くバイトコードにコンパイルされます。
これは機械語よりも、人の書くコードに近い形であり、およそソースコードの形に戻すことができます。

今回は、アプリを利用してバイトコード->ソースコードのデコンパイルを簡単に行います。
デコンパイルでソースコードを入手できれば、あとはそのソースコードを読むだけでアプリの全容がわかります。

## Show Java
今回紹介するアプリは、[Show Java](https://play.google.com/store/apps/details?id=com.njlabs.showjava&hl=ja) です
<img width="150" alt="スクリーンショット 2016-11-30 0.23.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/147125/9c03537b-1f5f-a7c8-a834-ffe5c46463b5.png">

このアプリは、apkファイルの解凍、Androidマニフェストの復号化、デコンパイルなどをワンタップで行ってくれる優れものです。ソースコードのViewerも見やすいのでとてもオススメです。

このアプリがあれば、電車に乗ってる合間にでもスマフォでさくっとデコンパイルのち解析できますね！！
![Screenshot_2016-11-27-10-47-43.jpg](https://qiita-image-store.s3.amazonaws.com/0/147125/3f645a98-fa15-960c-d33e-fb566f8ff008.jpeg)
解析対象は上のようにインストールしてあるアプリから選択できる他、SDカードから選択できます。

![Screenshot_2016-11-30-00-26-32.jpg](https://qiita-image-store.s3.amazonaws.com/0/147125/f07e5b9a-6ed9-a2aa-d85c-9dae466cf6c2.jpeg)
デコンパイルは、しばらく時間がかかります。なおアプリによってはデコンパイルに失敗する場合もあります。
終わると上のように出力されます。

javaフォルダにはデコンパイルされたjavaファイルが、resにはリソースファイルがあります。

![Screenshot_2016-11-30-00-30-13.jpg](https://qiita-image-store.s3.amazonaws.com/0/147125/c766dd92-a450-67fd-ac82-88aba7709576.jpeg)

ソースコードは上のように出力されるのでこれを読んでいくことでアプリのロジックを理解できます。
便利なアプリなので是非使ってみてくださいね！

# 通信の解析
時にアプリはネットワークを利用して通信を行います。
これらの通信をキャプチャして見てみることは、アプリの挙動の把握に役立ちます。

今回は、この後アプリを利用して通信をキャプチャします。
利用するアプリはAndroidのVPNの機能を利用して、root化することなく通信をキャプチャしてくれます。

## Packet Capture
通信の解析には[Packet Capture](https://play.google.com/store/apps/details?id=app.greyshirts.sslcapture&hl=ja)が便利です。
<img width="141" alt="スクリーンショット 2016-11-30 1.34.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/147125/d70d0c18-8d5c-7b2a-0243-a71f7ed7c12b.png">

このアプリは単体でパケットキャプチャを行い、その内容を閲覧することもできます。
![Screenshot_2016-11-27-11-08-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/147125/3fbca7e1-03c1-f755-f227-68a2f65baa4f.jpeg)
これはyahoo.co.jpにfirefoxからアクセスした際のログです。
これらの一つをタップしてみると下のような画面に遷移します。
![Screenshot_2016-11-27-11-11-47.jpg](https://qiita-image-store.s3.amazonaws.com/0/147125/f5e2002d-f64f-251c-dab6-a07b37beadc7.jpeg)
実際にHTTPのリクエストとレスポンスが確認できますね。
他にもUDPやTCPのパケットなども確認でき、SSLのデコードも可能て便利なアプリです。
なお使用に際しては通信速度が結構落ちるので注意が必要です。

## tPacketCapture
通信をカジュアルに解析するにはPacket Captureは便利ですが、詳しくPCでパケットを見たい時などは物足りなく感じることも多いです。
そんな時は[tPacketCapture](https://play.google.com/store/apps/details?id=jp.co.taosoftware.android.packetcapture&hl=ja)がオススメです。
<img width="135" alt="スクリーンショット 2016-11-30 1.34.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/147125/c7afd384-9adf-ec02-f280-a7670e5d202d.png">

tPacketCaptureはキャプチャしたパケットをpcapファイルに出力してくれるため、PCに移してやることで優秀なネットワーク・アナライズ・ソフトウェアのWireSharkでの解析が可能になります。
なおこのアプリにはパケットのビューアー機能は付属しておりません。
![Screenshot_2016-11-27-11-12-09.jpg](https://qiita-image-store.s3.amazonaws.com/0/147125/cf34dbdd-dbed-497b-4585-1ada7da5ea4d.jpeg)
Captureを押すだけでパケットキャプチャ可能です。
こちらも使用に際して通信速度が結構落ちるので注意が必要です。


## PcapReader
スマートフォン上でpcapファイルを見たくなる、そんな日もあるかもしれません。
そんな時の為に[PcapReader](https://play.google.com/store/apps/details?id=com.glacialsoftware.pcapreader&hl=ja)をオススメします。
<img width="148" alt="スクリーンショット 2016-11-30 1.34.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/147125/51a5d1ea-d8ab-9be1-6d1f-80a9af29af07.png">

PcapReaderはtPacketCaptureやPCでのWireSharkなどによってキャプチャしたパケットを閲覧することができます。
![Screenshot_2016-11-27-14-24-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/147125/de0300ee-a702-d032-8377-2a7116bda9db.jpeg)
このようにパケットを分析することが可能です。
これらの一つをタップすると、下のような画面に遷移します。
![Screenshot_2016-11-27-14-26-33.jpg](https://qiita-image-store.s3.amazonaws.com/0/147125/b8d8c463-e462-23da-4f3c-5110ee2fc2f8.jpeg)
HTTPリクエストがきちんとパースされて見やすく表示されます。
なお、Bluetoothのパケット等には対応していないので注意が必要です。

# まとめ
便利なアプリを利用して、お手軽にアプリの解析を試していきましょう。
P.S. 誰か僕にiPhone買ってください。