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

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

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

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

![itunes_uuid.png](https://qiita-image-store.s3.amazonaws.com/0/6092/00d04a18-e893-b718-5d2a-b50e0ccb80ff.png)

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

![スクリーンショット 2017-04-07 20.58.38.png](https://qiita-image-store.s3.amazonaws.com/0/6092/74b9cf47-f81e-ce13-e22a-5e73e9bacc52.png)

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

```bash
$ rvictl -s xxxxxxxxxxxxxxxxxxxxx

Starting device xxxxxxxxxxxxxxxxxxxxx [SUCCEEDED] with interface rvi0
```

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

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

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

```bash
$ 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](https://www.wireshark.org/)で見てみます。
インストールは以下で。

```bash
$ brew cask install wireshark
```

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

![ワイヤーシャークネットワークアナライザ.png](https://qiita-image-store.s3.amazonaws.com/0/6092/9b2c1066-7417-0de7-6e5e-988c8bf4a0ce.png)

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

![wireshark_option.png](https://qiita-image-store.s3.amazonaws.com/0/6092/cfd558f3-f99f-57ba-bd30-baacaadb68ff.png)

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

![wireshark_capture.png](https://qiita-image-store.s3.amazonaws.com/0/6092/a91e37d8-3e30-ac0b-788b-d5eb5461e169.png)

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

```bash
$ rvictl -x xxxxxxxxxxxxxxxxxxxxx

Stopping device xxxxxxxxxxxxxxxxxxxxx [SUCCEEDED]
```

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