WiresharkでUSBパケットをキャプチャしようとしてちょっとハマったのでメモ
WiresharkでUSBパケットをキャプチャするための準備(Linux版)
Windows版はちょっと異なると思うけど試してないので、ググってね😅。
ふつーにapt install
するだけ。
Windows版と異なり、USBパケットキャプチャのために別途USBキャプチャプログラムをインストールする必要はない。
ついでにsudo
しなくても実行できるように自分にwireshark
グループを追加しておく。
sudo apt install wireshark
sudo gpasswd -a `whoami` wireshark
ここで一旦ログアウト&再ログイン or 再起動。
このままだとUSBパケットキャプチャのためのプログラム(usbmon
)が動いてないので、動かす必要がある。
起動の度にターミナルから以下のコマンドを実行。
sudo modprobe usbmon
Wiresharkの実行は、ターミナルからwireshark
を実行するか、メニューの「インターネット」→「Wireshark」を選択します。
(自分にwireshark
`グループを追加してあるので、メニューからでも実行できます)
起動の度にusbmon
を起動するのは面倒な場合は、以下の手順で自動化できます。
/etc/udev/rules.d/99-usbmon.rules
を以下の内容で作成
SUBSYSTEM=="usbmon", GROUP="wireshark", MODE="640"
/etc/modules
に以下を追加
usbmon
あちこちのホームページに詳しく解説されているので、ぐぐってちょ(←なんて他力本願…😅)。
RaspberryPi4の場合、USBのインタフェースはusbmon1とusbmon2があるが、どっちをキャプチャするかは、接続した機器がUSB2.0かUSB3.0による。
たぶん、usbmon1がUSB2.0(外側/内側)、usbmon2がUSB3.0(内側のみ)だと思う。
lsusb
で表示される対象機器のバス番号(Bus XXX
の部分の数字)がusbmonYのYにあたるとだと推測。
USBのパケットの表示フィルタの書き方がネット上でもなかなか見つからなかったので、簡単なものだけメモ。
実際にはエンドポイントまで指定しているので、複数のエンドポイントを同時に表示したければ、OR(||
)で条件つなげてください。
(1.5.*
みたいな書き方が出来るのかは不明 )
この例の1.5.1
の
左の1
がlsusb
で表示される対象機器のバス番号(Bus XXX
の部分の数字)、
中央の5
がlsusb
で表示される対象機器のデバイス番号(Device YYY
の部分の数字)(挿抜の度に変わる)、
右の1
がlsusb -D /dev/bus/usb/XXX/YYY
(XXX、YYYは上記のバス番号、デバイス番号。0は省略不可) で表示される情報の
bEndpointAddress
で確認できるけど、これは機器内部で固定されてるはず。
と、難しく調べんでも、一度全部キャプチャしたものを表示して欲しいパケットを探してみてそこのアドレスを見れば分かる。
USBホストの吐合は"host"
になる。
表示フィルタに以下を入力してリターン(以下の1.5.1の部分は対象の機器のものに変更)
usb.src == "1.5.1"
表示フィルタに以下を入力してリターン(以下の1.5.1の部分は対象の機器のものに変更)
usb.dst == "1.5.1"
表示フィルタに以下を入力してリターン(以下の1.5.1の部分は対象の機器のものに変更)
usb.src == "1.5.1" || usb.dst == "1.5.1"