俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #102 - iPhoneのパケットキャプチャ

すげぇ休みました。
俺ですら「このブログ終わったのか」と思うくらい。
でもグジグジとやるんですよ。

熱が出たりと不調続きでございますが、
今週は今日から出社したので懲りもせず日報いきましょう。

本日の話題は「iPhoneのパケットキャプチャ」です。
開発者の皆様であればいくつもやり方を持っていると思います。
やれtcpdumpだのやれwiresharkだの。
よくヒットするのはこのページです。
http://qiita.com/HIkaruSato/items/1f66c1a189bf9c19f838
やや面倒ですが、3GSとかの携帯電話の通信でもキャプチャできる方法は魅力的ですね。

で今回はその方法について。
早い話が、iPhoneをUSBでmacにつなぎ、おもむろに下記コマンドを叩く。

rvictl -s [iPhoneのidentifer]
tcpdump -i rvi0 -w [ダンプファイル名]

参考サイトの通りです。
その状態でひとしきり通信をしたら、

rvictl -x [iPhoneのidentifer]

こうすることで、dumpの結果がバイナリで保存されますと。
それをWiresharkとかで読みこめばみれますよと。
とまぁここまでは参考サイトの通り。
とっても分かりやすいので再掲しますね。
http://qiita.com/HIkaruSato/items/1f66c1a189bf9c19f838

ですが、この rvictl ってなんざんしょってことで少し調べてみました。
調べてみると、どうやらこの方法自体はAppleが推奨しているやり方の1つみたいなんですね。
https://developer.apple.com/library/ios/qa/qa1176/_index.html#//apple_ref/doc/uid/DTS10001707
ここにその他の方法も含めて全て紹介されています。

さて、該当の rvictl ですが、どうやら Remote Virtual Interface ctl の略みたいです。
全くわかりません。
少し読み進めるとこんな文章が。

Set up an RVI for that device. This creates a virtual network interface on your Mac that represents the iOS device's networking stack

接続したiPhoneのネットワークに、仮想ネットワークインターフェースをかぶせるようです。
そういう便利なiOS固有のコマンドなんでしょうね。
でも説明はそれだけです。
-hでヘルプを見てみるとオプション一覧が見れます。

Remote Virtual Interface Tool starts and stops a remote packet capture instance
for any set of attached mobile devices. It can also provide feedback on any attached
devices that are currently relaying packets back to this host.

Options:
-l, -L List currently active devices
-s, -S Start a device or set of devices
-x, -X Stop a device or set of devices

これだけ読む感じだとデバイスはiPhoneだけに限らないみたいですが、どうなんでしょうかね。
こんどandroidでも試してみましょう。
でまぁ、rviを一度作成したら -l コマンドでそのリストがみれるので、
rviの名前を指定してtcpdumpをすれば、そのネットワークインターフェースのtcpdumpが取得できる、とこういうわけなんですね。
ってことは、わざわざファイルに出力して、、、なんて面倒なことやらずにそのままWiresharkで読めるんじゃないの?
ということでやってみたら、 ちゃんとできました。

ということなので、
いっとう楽なiPhoneのパケットキャプチャは、
rvictl -s hogehoge
で仮想インターフェイスを作って、
rvictl -l
で作ったインターフェース名を確認し、おもむろにwiresharkを立ち上げ、
capture項目で監視インターフェースに上記のインターフェース名を選択して、
フィルタしていつものように眺める。

これがいっちゃん楽ですね。
そして作ったインターフェースはちゃんと削除しておきましょう。
rvictl -x hogehoge
ということでした。

報告は以上です。