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さんが書いてた

レスポンスボディの復号化が出来れば一番なんだろうけど、暗号化をしているということは恐らくメンテナンス毎に鍵を変えているだろうし、復号するのは現実的じゃなさそう。残念。

参考サイト

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