艦これの2期のパケットを見た

このエントリはWCDI Advent Calendar 2018 - Adventarの15日目の記事です。 adventar.org

本稿は以前投稿した内容です(内容自体は現在のものにアップデートしてます。(した気になってるだけかもしれない))

また、本稿は最近書いたものでないので多少言葉遣いが稚拙な部分があるでしょうがご容赦ください。

艦これについて

DMMが運営している戦艦を擬人化してブラウザゲームにしたやつ。
最近大型アップデートとして、HTML5ベースに換装及び作戦海域(実際にゲーム中で戦うマップ)のリニューアルやUIの新装、HD化などかなり最近のブラウザゲームっぽくなってきた。
本稿は、2期のパケットを読むということを前提とする。
詳しくはwiki参照

注意事項

私が本稿で書いていることは一切不法・悪意を持った行為(所謂不正行為)を推奨するものではありません。
また、本稿の内容を応用したりしてゲームサーバーに対して不正行為を働かないようお願いします。(私もゲームを楽しみたいので)

艦これの通信について

基本的にはHTTP(ブラウザゲーム通信プロトコル事情はよく知らないが)なので、基本的に平文でデータを送受信している。
また、
あと、パケットをキャプチャして読んで見るっていうのを始めてやる初心者には優しくて良いなと思ったので今後何かに使えるかと思ってこのエントリを書く。

WireSharkのインストール

WireSharkのサイトからインストーラをダウンロード→実行。
途中は全てyesで進めていく。
パパっとやって、終り!

ブラウザ側の準備

ここまで開く。
f:id:site0801:20170320233042p:plain

WireSharkの準備

WireSharkを起動する。
NICが馬鹿みたいに付いてる変態でなければ[Ethernet]か[イーサネット]をダブルクリックする。
f:id:site0801:20170320215732p:plain

実際に艦これパケットを探す

WireSharkが起動するとパケットがドバーッっと流れてくる。
しかし、それらを全て読んで艦これパケットだけを探すのは一般人には限りなく無理。
なので、まずパケットが流れそうなソフト及びサイトを閉じる(特にブラウザは艦これのみ開くのが良い)
次に、デスクトップの左右にWireSharkと艦これを開いたブラウザが見えるように配置する。

  1. 艦これのサイトをF5で更新
  2. すぐにWireSharkを見る
  3. パケットがババーっと流れてくるのでプロトコルTCPHTTPのパケットを探す(目grep)
  4. それを見つけたらすかさずクリック
  5. そうするとsourceDestinationに自分のじゃないIPアドレスがあると思うのでメモする。

とりあえずここまで出来たらあとはフィルターかけるだけ。

WireSharkのフィルター機能を使う

WireSharkの上のここ(赤枠内のテキストボックス、以降はフィルター欄と呼ぶ)にip.addr == (さっきコピーしたIPアドレス)と入力してEnterキーを押す(下の画像ではIPアドレス203.104.XXX.183だったので適宜書き換える)
f:id:site0801:20181215224924p:plain

そうするとズラーッとTCPとHTTPのパケットだけ(自分の環境ではそうだった)が見える f:id:site0801:20181215225030p:plain

しかしこれではHTTPの中身が見たいのにうまくいかない。 なので、フィルター欄にip.addr == (さっきコピーしたIPアドレス) && httpと入れる。
すると、HTTPのパケットのみが見えるいい感じになる。 f:id:site0801:20181215225647p:plain

だけど、これではHTTPパケットがゴチャゴチャ出てくるだけでイマイチ一般人には意味が解らない(パケット解析やったことあるなら割とわかるかもしれないけど)
ここから一般人にもわかりやすくするには、フィルター欄にip.addr == 203.104.XXX.183&& http.request.method == "POST"|| http.request.method == "GET"と入力する。
この文字列の意味としては[ipアドレス送信先or送信元 == 値]&&[HTTPのPOSTリクエストのみを表示する]となっている。

実際にパケットを見る

さっき打ち込んだフィルターによってWireSharkのパケット一覧の表示パケット数が減ったと思う。
このあと艦これのパケットを最初から見ていくためにパケット一覧をリフレッシュする。 下の画像の赤く囲ってある緑のサメのヒレボタンをクリックする。 f:id:site0801:20170320231607p:plain

そうすると、今キャプチャしたパケットを保存するか聞かれるので[保存しない]と答える。
そしたら艦これのブラウザを更新する。
そしたらパケットが幾つか流れてくると思う。
ここまで開いたらこんな感じになる。
ブラウザ側: f:id:site0801:20170320233042p:plain

WireShark側: f:id:site0801:20170320232954p:plain

パケット一覧を見るとinfoの中にapiの名前が書いてある。
ココらへんは開発が良い感じな名前にしてくれているのでパット見で意味がわかると思う。
実際に詳細を見るには、
[パケットを右クリック]→[追跡]→[HTTPストリーム]、で中身を見ることができる。(以降Follow HTTP Streamと呼ぶ)
主に青色になっている部分らへんを見るとサーバーからどんなデータを送ってきているのかがが分かる。 試しにそのまま艦これの方を操作して演習相手一覧まで行く。
f:id:site0801:20170320233958p:plain

そしたらさっきと同じくパケット一覧をリフレッシュする。
そしたら実際に誰でも良いので戦ってみてリザルト画面まで行く。
すると、パケット一覧のinfoがPOST /kcsapi/api_req_practice/battle_resultみたいなのがあると思うのでそれをFollow HTTP Streamしてみる。
すると、如何にもなデータが出てくる。 下の画像と比較しながら見てみると色々わかってくると思う(実際にやってないでこのサイトのみを見ている場合は文字列については見難いのでメモ帳とかにコピーしてみると見やすいかもしれない)
このデータは古いものである。(たしか去年か一昨年あたりのもの)
現在はAPIの設計が変わっているため、この通りではない

svdata={"api_result":1,"api_result_msg":"\u6210\u529f","api_data":{"api_ship_id":[-1,145,235,286,296,210,268],"api_win_rank":"S","api_get_exp":60,"api_member_lv":55,"api_member_exp":153110,"api_get_base_exp":660,"api_mvp":2,"api_get_ship_exp":[-1,990,1320,660,660,660,660],"api_get_exp_lvup":[[185381,188500],[345934,356200],[285953,296200],[329002,331000],[140952,143700],[239404,245900]],"api_dests":6,"api_destsf":1,"api_enemy_info":{"api_user_name":"","api_level":55,"api_rank":"\u4e2d\u4f50","api_deck_name":"\u6642\u96e8\u305f\u3093\u309299\u306b\u3059\u308b\u306e\u3002"}}}

f:id:site0801:20170320235127p:plain f:id:site0801:20170320235313p:plain

比較していくと割と分かるとことが多く、特に分かる人はわかるかもしれないが、ベース経験値やMVP、ランク、鎮守府レベル等の多くの情報がわかる。
なので、例えばこれらのデータから新しい海域の詳細情報などを得る等のことが出来るのかもしれない(僕は面倒くさいのでそういった事はしませんが)

最後に

このエントリも適当に書いてメモ程度にしようかと思ったら案外多めに書いてしまった。
ちなみにこのエントリに書いてあるタイミング以外にも艦これではパケットを送受信してるので結構色々なものが見えてくる。
まぁ、そもそもゲームのパケットを覗くのはゲーム内では非公開の数値データを引っ張り出すこともできるので無粋ですが…
あと、艦これの運営はHTTPS対応をしてほしい…(そこまで知らないが、HTTPSに対応させるとゲームのレスポンス悪くなったりするのかな)