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

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

参考サイト

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