Wiresharkを使ってアプリのプロトコルを特定する方法【アドカレ2021 22日目】

日記 アドベントカレンダー2021

この記事は デジクリアドベントカレンダー 22 日目 の記事です。


みなさんこんにちは。 副部長の山田です。

先日、コンピュータ通信という情報工学科の講義にて、アプリケーションのプロトコルを調べるという課題がありました。
そのためにWiresharkというソフトウェアを用いて調べたので、その方法を備忘録として残しておきます。

自分もまだ初学者なので、ミスや不明点などがあれば是非教えてください。

なお、~~めんどくさかった~~ IPアドレスなどの個人情報が映るかもしれなかったので画像はありません。

Wiresharkとは?


Wiresharkは、ネットワークプロトコルアナライザの一つです。 パケットをキャプチャして解析するためのツール、つまり、PCが送受信しているデータ通信の中身を見ることができるソフトウェアです。

今回はこれを使って、アプリケーションのプロトコルの種類を特定したいと思います。

そもそもプロトコルを調べる方法は何があるのか、思いついたのはこの2つぐらいでした。

  • ググる(公式のドキュメントや論文を探す)
  • パケットキャプチャをして調べる

今回紹介するのは、2つ目のパケットキャプチャにおいて、Wiresharkというソフトを使った場合です。



ここで残念なお知らせがあります。

今回やる方法、

力技の人力ゴリ押し作戦

です。

いろいろ試したのですが、通信プロトコルを厳密に求めるというのは難しいようです(自分の知識不足でもあります)。
なので、おそらくこれで全てのプロトコルが求まるんじゃないかという、若干曖昧さが残る方法となります。

それではやっていきましょう。
今回は例として、チームバトル形式バトルロイヤルシューティングである「Apex Legends」のプロトコルを特定してみます。

OSはWindows 10です。

その1 Wireshark


ここは普通の方法です。
まず、Wiresharkを開いてパケットキャプチャを開始します。
次に、Apex Legendsを起動します。
そして、Wiresharkに戻り、キャプチャを停止します。

どうでしょうか?
大量のUDPが流れていますね。
UDPが使われていることは間違いないでしょう。 よし、プロトコルはUDPだな!

・・・。

本当にこれだけなのか?

ここで終わりにしても構いません。
ですが、他にも使用しているプロトコルがあるのではないでしょうか?
気になってしまった山田くんは、何とかして調べたいと考えました。

以下、私が四苦八苦しながらググり散らかして見つけた方法となります。
他にも良い方法があるかもしれません。詳しい方教えてください。

その2 プロセスID


それでは、タスクマネージャを起動します。
プロセスタブを見るとアプリが並んでいますね。
Apex Legends (2) を右クリックして展開をすると、 - Apex Legends - ProcessCapturer.exe

が出てきました。後者はスクリーンショット用のプログラムらしいので、前者の方を見ていきます。

右クリックして、「詳細の表示」を選ぶと、詳細タブに飛びました。

どうやら実行ファイルは r5apex.exe のようです。
PID(プロセスID)を覚えておきます。

その3 コマンドプロンプト


コマンドプロンプトを管理者として実行し、以下のコマンドを打ちます。

netstat -anob

プロトコル、ローカルアドレス、外部アドレス、状態、PID、そして プロトコルの下にファイル名が並んだ状態となっています。

ここでTCPとUDPが使われているのか分かりますが、Wiresharkを使って求めたいので無視して進みます。

先ほど得たPIDを探していきます。
私はこの大量のリスト全部に目を通して探しましたが、コマンドを使えば楽でした。先ほどのやつに少し付け足して、

netstat -anob | find "XXX"

XXXに探したいPIDを入れる。findはfindstrでもいいらしい。

ここで外部アドレスを書き留めます。 ":"より右の数字は使いません。

TCPはいくつかIPアドレスを得ることができましたが、UDPのところは:となっていて分かりません。WTF

その4 Wireshark


Wiresharkに戻り、先ほど得られたIPアドレスを一つずつ調べてみます。
フィルタを使います。

ip.addr == A
A をIPアドレスで置き換えてください。

なんだかよく分かりませんが、とりあえずTCPとTLSv1.2が見つかりました。

次に、大量に流れているプロトコルに注目します。今回はUDPでした。
IPアドレスが大体同じように見えませんか? 先ほどと同じように
ip.addr == A

UDPだらけです。UDPだけか~

・・・ん?

RTCPが混ざっています!!!

これはProtocolタブを押してプロトコルごとに並べると発見しやすいかもしれません。

これで終わりとなります。
以上より、TCP, TLSv1.2, UDP, RTCPの4つが、Apex Legendsの通信プロトコルだと考えられます。

このIPアドレスで正しいのか、これ以外にもあるんじゃないのかなどの疑問点は残りますが、とりあえずほぼ全てのプロトコルを求めることができたと思います。

おしまい


そんな感じで、Wiresharkを使ってアプリのプロトコルを特定する方法について振り返ってみました。

ググってもよく分からない、そもそも何を調べればいいのかが分からないということが多くて大変でしたが、基礎情報技術者試験にも出題される分野ですので、理解を深めていきたいですね。

デジクリ要素が皆無、IPv6を考えていないなど、ガバガバクオリティな記事でしたが、誰かの参考になれば幸いです。
お読みいただきありがとうございました。


参考文献
Windowsで特定のポート番号を使用しているアプリの確認方法 | ぱーくん plus idea