blog

ソフトウェアエンジニアリングなど

iPhone でパケットキャプチャしてみる(2019年12月版)

この投稿は 品川 Advent Calendar 2019 - Qiita の8日目です。

OB枠での参加です。きっと来年はちゃんと社名が出ると思います。

はじめに

やりたいこと

iPhone の通信内容をみたい。

やり方

定番中の定番ですが、以下の2通りです。

調べながらすんなりできるだろうと思ってたら、UI だったり、実行時のパスが変わってたりして意外と手こずったので、2019年12月版としてまとめます。

Wireshark(+ rvictl)

ながれ

  • Xcode のインストール
  • Wireshark のインストール
  • iPhone の UDID を調べる
  • Remote Virtual Interface をつくる
  • Wireshark でみる

Xcode のインストール

Xcode 自体は全く必要ないのですが、rvictl を使うためには Xcode が必要なようです。

App Storedeveloper.apple.com から 11.2 をダウンロードします。

developer.apple.com からの場合は、xip ファイルとしてダウンロードできるので、展開すれば使えます。

f:id:tkfj:20191208004508p:plain

Wireshark のインストール

$ brew cask install wireshark

iPhone の UDID を調べる

以前は、iTunes で確認できていたのですが、macOS 10.15 Catalina からは Finder で確認できます。副ボタンのクリック(右クリック)でコピーできます。

表示されていない場合は、該当の箇所あたりをクリックすると表示が切り替わります。

f:id:tkfj:20191208011551p:plain

Remote Virtual Interface をつくる

MaciPhone をつないだまま rvictl で Remote Virtual Interface をつくります。 この rvictl のパスが最初わかりませんでした。

$ /Library/Apple/usr/bin/rvictl -s {さっき調べた UDID}

Starting device {さっき調べた UDID} [SUCCEEDED] with interface rvi0

Wireshark でみる

準備ができたので、Wireshark でみてみます。

$ wireshark

Wireshark が起動したら、表示されているインターフェースから先程つくった rvi0 を選択するか、画面上部の「キャプチャオプション」から同様に rvi0 を選択することで、キャプチャが開始されます。

f:id:tkfj:20191208013802p:plain f:id:tkfj:20191208014107p:plain

iPhone で通信を行うと、Wireshark 上で確認できます。

f:id:tkfj:20191208014441p:plain

最後に、Remote Virtual Interface を消します。

$ /Library/Apple/usr/bin/rvictl -x {さっき調べた UDID}

Stopping device {さっき調べた UDID}} [SUCCEEDED]

Charles

結局確認したいことは大体 http(https) のリクエスト/レスポンスだと思うので、そういうときは Charles です。

ながれ

  • Charles のインストールとプロキシ設定
  • iPhone でプロキシ設定
  • iPhone でプロファイル設定、証明書の有効化
  • Charles でみる

Charles のインストールとプロキシ設定

Download Charles からダウンロードして、実行します。

Buy Charles Licenses にあるように、30日間試用できます。(1回あたり、30分で強制終了します。)

f:id:tkfj:20191208020144p:plain

Charles を起動したら、プロキシ設定を行います。

「Proxy」> 「Proxy Settings」

f:id:tkfj:20191208021419p:plain

プロキシのポートを設定します。(デフォルトは 8888)

f:id:tkfj:20191208021503p:plain

また、Charles を起動している Mac 自体がプロキシに吸い込まれてほしくない場合は、「macOS」でチェックを外しておきます。

Mac も見たい場合は、そのまま)

f:id:tkfj:20191208021717p:plain

「Proxy」> 「SSL Proxing Settings」から SSL プロキシ設定を行います。

f:id:tkfj:20191208023902p:plain

「Include」に対象とするホストとポートを設定します。(例ではいずれも *

f:id:tkfj:20191208024106p:plain

iPhone でプロキシ設定

iPhone を Charles を起動している Mac と同じ Wi-Fi (LAN)につなぎます。

「設定」> 「Wi-Fi」から、接続している Wi-Fi の「i」マークを選択。

f:id:tkfj:20191208022917p:plain

一番下の「プロキシを構成」を選択。

f:id:tkfj:20191208025845p:plain

「手動」を選択し、Charles を起動している Mac のローカル IP アドレスと先ほど設定したプロキシのポート番号を入力します。

f:id:tkfj:20191208025911p:plain

Charles でアクセスしてよいか確認されるので、「Allow」

f:id:tkfj:20191208030557p:plain

他の端末や iPhone の IP アドレスが変わる度に確認されるのが面倒な場合は、「Proxy」>「Access Control Settings」から 0.0.0.0/0 などを追加しておきます。

f:id:tkfj:20191208031041p:plain

iPhone でプロファイル設定、証明書の有効化

iPhoneSafari を開いて、http://www.charlesproxy.com/getssl/ にアクセスし、プロファイルをダウンロードします。

f:id:tkfj:20191208032007p:plain

http://www.charlesproxy.com/getssl/ にアクセスできない場合は、

  • Charles が起動していること
  • iPhone が Charles を起動している Mac と同じアクセスポイントに接続していること
  • プロキシ設定( IP アドレス/ポート)が正しいこと

あたりを確認してみてください。

f:id:tkfj:20191208032302p:plain

「設定」>「一般」>「プロファイル」から先程ダウンロードしたプロファイルをインストールします。

f:id:tkfj:20191208032824p:plain

「設定」>「情報」>「証明書信頼設定」から証明書を有効にします。

f:id:tkfj:20191208101708p:plain f:id:tkfj:20191208033223p:plain

Charles でみる

準備ができたので、Charles でみてみます。

https なエンドポイントからのレスポンスも内容が確認できています。

f:id:tkfj:20191208034327p:plain