horolog

終わるまでは終わらないよ

Android エミュレータ上で動いているアプリの HTTP / HTTPS 通信の中身を見る方法

今回は Android エミュレータでアプリを動かして、アプリが行う HTTP / HTTPS 通信の中身を覗いてみます。

環境&ツール

準備

ツールのインストール

Android Studiomitmproxy をインストールしてください。

仮想デバイスの作成

私は以下の構成で仮想デバイスを作成しました。

ハードウェア

  • Pixel 2

システムイメージ

  • API Level : 28
  • ABI : x86
  • Target : Android9.0 (Google APIs)

※ Android9.0 (Google Play) と書かれたイメージだと adb root が使えないで、 Android9.0 (Google APIs) と書かれたイメージを選択してください。

証明書の書き込み

Android API レベルが 24 以上の場合、ネイティブアプリはシステムレベルの証明書のみ信頼するので、直接証明書を書き込む必要があります。

まずは mitmproxy を立ち上げて、ブラウザのプロキシの設定をしてから http://mitm.it にアクセスして Android 用の証明書をダウンロードしてください。 mitmproxy はデフォルトで 127.0.0.1:8080 で起動します。

Android では、証明書を <subject_hash_old>.0 といった形式で保存しているので、証明書のサブジェクトのハッシュ値を求めて、ファイル名を変更してください。

$ openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem

ファイル名を変更したら、ファイルを書き込みます。Android では証明書を /system/etc/security/cacerts に保存しているのですが /system 以下は通常 read only なので、エミュレータを起動するときに -writable-system オプションをつけて起動させます。

$ emulator -avd [avd] -writable-system
$ adb root
$ adb remount
$ adb push <subject_hash_old>.0 /system/etc/security/cacerts/

$ adb shell
generic_x86:/ $ chmod 644 /system/etc/security/cacerts/<subject_hash_old>.0
generic_x86:/ $ exit

$ adb reboot

通信を覗く

最初に mitmproxy ui を起動させます。
次に Android エミュレータを起動させます。起動させるときは -writable-system オプションと -http-proxy オプションをつけます。

$ emulator -avd [avd] -writable-system -http-proxy 127.0.0.1:8080

mitmproxy の Web Interface を見てみると、アプリが行っている通信が表示されているはずです。