2017-7-1
iOSアプリの通信内容をキャプチャしてみる
今やっているスマホゲームがどんな API 設計をしているのか、どんな json が返ってきてるのか気になったので、iOS アプリの通信内容をキャプチャする方法を調べて試してみたのでそのメモ。
手順
- Xcode のインストール
- 使用する端末の UUID を取得
- rvictl でリモート仮想インタフェースとして設定
- Wireshark でパケットキャプチャ
- 終わったら rvictl でリモート仮想インタフェースから解除
詳細
Xcode のインストール
後々出て来るrvictl
を使用するために Xcode のインストールが必須なためインストール
使用する端末の UUID を取得
端末を Mac に接続後、iTunes より UUID を取得。
rvictl でリモート仮想インタフェースとして設定
以下のコマンドにて設定
rvictl -s [UUID]
Wireshark でパケットキャプチャ
Wiresharkを起動し、先程設定したリモート仮想インタフェースを選択。(多分 rvi0 として設定されているはず)
後は好きに通信内容を覗けば良い。
終わったら rvictl でリモート仮想インタフェースから解除
rvictl -x [UUID]
結果
通信内容を覗けたものの、レスポンスが暗号化されているみたいでどんな json を受け取っているのか確認できなかった。(当然といえば当然)
ただ、リクエスト URL は確認出来た。API へのアクセスに、他のメソッドを使用するべき場合でも全て GET を使用しており味わい深い。
HTTP リクエストのパラメータに&t=1498915892334&e=bab31dd31c14866e3f489f9fbdc93ce7&gz=1&market=3&channel=2&version=3.0.0
といったようなものが付いており、version
はそのままアプリバージョン、market
は国のカテゴリもしくは iOS、Android の区別か。
t
は UnixTime だけども何のためにパラメータに乗せているのかわからなかった。e
は推測でしか無いが恐らく毎レスポンスにトークンが含まれておりそのトークンではないかと思われる。通信毎にトークンを生成することで不正な API アクセスを防ごうとしているのではないだろうか。(リクエスト毎にトークンを作り直す手法は「艦これ API を叩く」で masarakki さんが書いてた)
レスポンスボディの復号化が出来れば一番なんだろうけど、暗号化をしているということは恐らくメンテナンス毎に鍵を変えているだろうし、復号するのは現実的じゃなさそう。残念。