Macに接続したiPhoneのパケットをキャプチャする(Wireshark)


iOSアプリを開発していると、実機からの通信を見たいときなんかがあります。
そんな時に、実機のパケットを見れると便利なので方法をまとめておきます。

まずiPhone(iPadでも良いですが)をMacに接続します。
次に、後で利用するiPhoneのUDIDを取得しておきます。

UDIDを確認するには、iTunesから見るのが簡単です。
表示されない場合はUDIDの付近をクリックするとシリアル番号やECIDなど表示が切り替わるので、UDIDが表示されるまでクリックしてください。

値は⌘Cか、編集 - UDIDをコピーでコピーできます。

このUDIDを、rvictlでリモート仮想インタフェースとして設定します。
(rviはRemote Virtual Interfaceの略)

$ rvictl -s xxxxxxxxxxxxxxxxxxxxx

Starting device xxxxxxxxxxxxxxxxxxxxx [SUCCEEDED] with interface rvi0

ネットワークインタフェースとして追加しているので、ifconfigで確認できます。

$ ifconfig -l
lo0 gif0 stf0 en0 en1 p2p0 awdl0 bridge0 utun0 utun1 en3 rvi0

次に追加したリモート仮想インタフェースをtcpdumpでパケットキャプチャしてみます。

$ sudo tcpdump -i rvi0
tcpdump: WARNING: rvi0: That device doesn't support promiscuous mode
(BIOCPROMISC: Operation not supported on socket)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on rvi0, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes
21:10:07.437603 IP 104.244.46.39.https > 10.46.245.28.59453: Flags [F.], seq 2316302377, ack 2632719563, win 17, options [nop,nop,TS val 3176163496 ecr 832777770], length 0
21:10:07.437825 IP 10.46.245.28.59453 > 104.244.46.39.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838783 ecr 3176163496], length 0
21:10:07.437914 IP 192.0.73.2.https > 10.46.245.28.59451: Flags [F.], seq 2195467291, ack 308360110, win 17, options [nop,nop,TS val 3176163495 ecr 832777247], length 0
21:10:07.437930 IP 192.0.73.2.https > 10.46.245.28.59451: Flags [F.], seq 0, ack 1, win 17, options [nop,nop,TS val 3176163779 ecr 832777247], length 0
21:10:07.437942 IP 104.244.46.39.https > 10.46.245.28.59453: Flags [F.], seq 0, ack 1, win 17, options [nop,nop,TS val 3176163795 ecr 832777770], length 0
21:10:07.437953 IP i2.wp.com.https > 10.46.245.28.59457: Flags [F.], seq 4226963860, ack 3846429936, win 17, options [nop,nop,TS val 3176163997 ecr 832777941], length 0
21:10:07.437962 IP i2.wp.com.https > 10.46.245.28.59457: Flags [F.], seq 0, ack 1, win 17, options [nop,nop,TS val 3176164277 ecr 832777941], length 0
21:10:07.437971 IP 192.0.73.2.https > 10.46.245.28.59451: Flags [F.], seq 0, ack 1, win 17, options [nop,nop,TS val 3176164346 ecr 832777247], length 0
21:10:07.437979 IP 104.244.46.39.https > 10.46.245.28.59453: Flags [F.], seq 0, ack 1, win 17, options [nop,nop,TS val 3176164392 ecr 832777770], length 0
21:10:07.437987 IP i2.wp.com.https > 10.46.245.28.59457: Flags [F.], seq 0, ack 1, win 17, options [nop,nop,TS val 3176164836 ecr 832777941], length 0
21:10:07.438068 IP 10.46.245.28.59451 > 192.0.73.2.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838783 ecr 3176163495], length 0
21:10:07.438335 IP 10.46.245.28.59451 > 192.0.73.2.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838783 ecr 3176163495], length 0
21:10:07.438443 IP 10.46.245.28.59453 > 104.244.46.39.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838783 ecr 3176163496], length 0
21:10:07.438542 IP 10.46.245.28.59457 > i2.wp.com.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838783 ecr 3176163997], length 0
21:10:07.438626 IP 10.46.245.28.59457 > i2.wp.com.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838783 ecr 3176163997], length 0
21:10:07.438702 IP 10.46.245.28.59451 > 192.0.73.2.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838783 ecr 3176163495], length 0
21:10:07.438788 IP 10.46.245.28.59453 > 104.244.46.39.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838784 ecr 3176163496], length 0
21:10:07.438859 IP 10.46.245.28.59457 > i2.wp.com.https: Flags [.], ack 1, win 2048, options [nop,nop,TS val 832838784 ecr 3176163997], length 0

さすがに見るのが辛いので、Wiresharkで見てみます。
インストールは以下で。

$ brew cask install wireshark

Wiresharkを起動したら、キャプチャオプションを開きます。

開いたら追加したリモート仮想インタフェース(rvi0)を選択し、開始ボタンでキャプチャを開始します。

iPhone側でQiitaのトップページを表示すると、以下のように通信内容が流れてきました。
あとは見たい内容を見ていくだけです。

用がすんだらリモート仮想インタフェースを外しておきます。

$ rvictl -x xxxxxxxxxxxxxxxxxxxxx

Stopping device xxxxxxxxxxxxxxxxxxxxx [SUCCEEDED]

これで作成したアプリの通信やiPhoneのブラウザからの通信内容などを確認できて色々はかどりますね。