144Labの入江田です。
今回はBLEパケットのスニッフィングを行うドングルを各種OSで動作させてみました。
利用可能なドングル
nRF51系ドングルであればOKらしいが、動作確認できたのは以下の製品。
現時点の最新ドキュメント
インストールの概要
あらかじめ必要なもの
上記のダウンロードサイトより「nRF Sniffer v2(2.0.0-beta-3 Multi-Platform)」をダウンロード&解凍しておきます。
- 一旦Wiresharkを起動して「About Wireshark」メニューをクリック
- 「Folders(フォルダ)」タブを選択してフォルダ一覧を表示
- 「Extcap path」項目のフォルダリンクをダブルクリックして開きます
- zipファイル解凍ファイル群からextcapフォルダ内の4項目を前項の開かれたフォルダにコピーします
- 2.のフォルダ一覧から「Personal configuration」項目のフォルダリンクをダブルクリックして開きます
- zipファイル解凍ファイル群から「Profile_nRF_Sniffer_v2_001」フォルダを前項で表示したフォルダにある「profiles」の中に丸っとコピーします
- Wiresharkを再起動
- Configuration Profileメニューで「Profile_nRF_Sniffer_v2_001」を選択します
ユーザーズガイドにはファームウェアを書き込む話が記述してありますが、トップに上げた製品はnRF-Sniffer-v2用のファームは書き込み済みで出荷されています。 ユーザーズガイドに記されている基本の手順は以上で完了です。
ただし、現状はこれで動作可能になるのはLinuxだけでした。
OS別の罠と対処方法
Linux
- Wiresharkプロセスのユーザーから「追加したファイル群にアクセス可能にする」必要があります
- よくあるLinuxディストリはwiresharkをrootユーザーや専用グループで起動します。その際においてもpythonスクリプトが読めて起動できるというパーミッションが必要です
- 適切なファイルオーナーに変更するかファイルオーナーでなくともアクセス起動ができるパーミッションを付与しましょう
macOS/Windows
このドングルの通信は460800bpsなんですが、 nordicの配布しているスクリプトでは一旦9600bpsで開いた後、 460800bpsに変更しています。 この方法でボーレートを変更できるのはLinuxだけです。
- 基本手順に加えて
- extcap/SnifferAPI/UART.pyの以下のようにパッチを当てます
- Wiresharkを再起動します
--- UART.orig 2018-10-10 14:48:56.000000000 +0900 +++ UART.py 2019-04-04 18:03:26.000000000 +0900 @@ -51,10 +51,10 @@ try: ser = serial.Serial( port=port, - baudrate=9600, + baudrate=460800, timeout=0.5 ) - ser.baudrate=460800 if write_data: ping_req = ''.join([chr(b) for b in SLIP_ENCODED_PING_REQ]) ser.write(ping_req) @@ -78,10 +78,10 @@ try: self.ser = serial.Serial( port=portnum, - baudrate=9600, + baudrate=460800, timeout=0.5 ) - self.ser.baudrate = 460800 except Exception as e: if self.ser:
後、WindowsではWiresharkを管理者権限で起動する必要がありました。
共通のトラブルシューティング
extcapフォルダにて以下のコマンドが起動できることを確認しましょう。 (注:これを実行するときにはWiresharkは止めておいてください)
$ ./nrf_sniffer.py --extcap-interfaces
for Windows
C:¥Program Files¥Wireshark¥extcap> nrf_sniffer.bat --extcap-interfaces
これが起動できるということは以下の問題をクリアしていることの確認になります。
- python2.7.xがある
- python2.7.xにpyserialインストール済み
- パーミッションは問題ない
また、実行結果にinterface {value=########}{display=nRF Sniffer}
が含まれていれば、正常にドングルと通信できていることが確認できます。
$ ./nrf_sniffer.py --extcap-interfaces extcap {version=2.0.0}{display=nRF Sniffer}{help=http://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF-Sniffer#Downloads} interface {value=/dev/cu.SLAB_USBtoUART}{display=nRF Sniffer} control {number=0}{type=selector}{display=Device}{tooltip=Device list} control {number=1}{type=string}{display=Passkey / OOB key}{tooltip=6 digit temporary key or 16 byte Out-of-band (OOB) key in hexadecimal starting with '0x', big endian format. If the entered key is shorter than 16 bytes, it will be zero-padded in front'}{validation=\b^(([0-9]{6})|(0x[0-9a-fA-F]{1,32}))$\b} control {number=2}{type=string}{display=Adv Hop}{default=37,38,39}{tooltip=Advertising channel hop sequence. Change the order in which the siffer switches advertising channels. Valid channels are 37, 38 and 39 separated by comma.}{validation=^\s*((37|38|39)\s*,\s*){0,2}(37|38|39){1}\s*$}{required=true} control {number=3}{type=button}{role=help}{display=Help}{tooltip=Access user guide (launches browser)} control {number=4}{type=button}{role=restore}{display=Defaults}{tooltip=Resets the user interface and clears the log file} control {number=5}{type=button}{role=logger}{display=Log}{tooltip=Log per interface} value {control=0}{value= }{display=All advertising devices}{default=true}
正常動作時
正常にキャプチャできてる場合、ブルーとオレンジのLEDが点滅しっぱなしになる。
まとめ
BLEスニッフィングがどのOSでもできるようになりました。 nordicにはパッチを送ってみた。
では良いBLEスニッフィング生活を。
追記
後から気づいたのですが、 Adafruit:Using with Sniffer V2のドキュメントではすでに修正済みextcap.zipが配布されていました。こちらのドキュメントに従えば良さそうです。