DesignAssembler

備忘録に近い

PokémonGOのパケット解析

f:id:hyottokoaloha:20160802205453p:plain

最近話題のPokémon GOのパケットをwiresharkで覗いてみました。

iPhoneの通信をwiresharkでキャプチャする方法は以下の記事を参考にしてください。

http://qiita.com/ionis_h/items/661a9a9d41cb1574e357

自分はwiresharkやパケット解析にあまり詳しくなく的外れな事を言ってるかもしれないのでお気付きの点があればコメントください。

なぜ調べたか

Pokémon GOがどれくらいの量の通信をどれくらいの頻度でしているかが気になったからパケット覗いてみようと思いました。

わかったこと

パケットを覗いてしばらくすると定期的に似たような通信をしていることがわかりました。

詳しく言うと、 30秒に1度約20kb のデータのやりとりをサーバーとしていました。(アップロード3kb、ダウンロード20kbといった感じです)

アップロードするのは自分の位置情報、ダウンロードするのは自分の周囲にいるポケモン、ポケストップ、ジムのデータと推定します。

19kbしかダウンロードしないことを考えるとポリゴンデータをいちいちダウンロードするような真似はしてないようですね。これはUnityの力ですね(Pokémon GOはUnityを使用しています)

ちなみにこの通信はTLS v1.2で暗号化されていたので位置情報の漏洩はほとんどないと思います。(位置バレの大きな要因はSNSへのアップロードですね)

通信量が非常に小さく収まってるのはgoogleのprotocol bufferという形式でデータのやりとりを行っているからです。

この通信の軽さのおかげで通信制限が来ていてもあまり不自由なく遊ぶことができます。

この定期通信のキャプチャを以下にあげています。やたらと容量多いのはなぜだろう

https://github.com/asmsuechan/study/blob/master/datafiles/pokemon_send_gps

また、ポケストップやジムの画像にアクセスするとその場所の画像を取っています。恐らくこの通信がPokémon GOで一番通信量を食っています。

例えば以下のURLは新宿御苑の画像です。

http://lh5.ggpht.com/pRhQ7K2PGIsevF4kJsgAZhiqCi9kVXYHZH9mw3Qj3zWjPm2Z6el_-yHv_jRICTNH5OYSXW-7oa55xpMMdiaK1Q

パケットを見ていたらnianticAPIを叩いてるのが見えました。このAPIを使ってpokevisionなどのポケモンの位置情報を表示するサービスができています(7/31にpokevisionは死にました)。正直外部から簡単にアクセスできるのはどうかと思います。

どんなAPIか推測すると、以下のような感じのハッシュがNoSQLに生やしてあり、ある緯度経度の座標が与えられるとそこに近いポケモンのハッシュが返りその値をアプリが見てポリゴンデータなどを呼び出しているようなものだと思います。

{ pokeid: 10, lang: 11.1111, lat: 11.1111, set_time: 00:00:00 }

こういう解析もあります。ポケモンデータです。これはUnityから抜いたのでしょうね。

ちなみにこの解析データを見ると、伝説のポケモンは実装されているがBaseCaptureRateが設定されていなくてイベント時に降ってくるのかな、と予測してます。

まとめ

Pokémon GOの通信は軽い