低コスト実装:2000円以下で構築するお手軽、簡易BLE Sniffer

低コスト実装:2000円以下で構築するお手軽、簡易BLE Sniffer

はじめに

ネットで Nordic の Bluetooth LE Packet Sniffer を見かけたのがきっかけでした。
調査を進める中で、Seeed XIAO BLE nRF52840 を使用すれば、比較的安価かつシンプルな構成でBluetooth LE のパケットスニファ環境を構築できそうだと分かりました。
そこで本記事では、簡易 Bluetooth LE Packet Sniffer の構築について、実際に試した手順と動作確認の結果をまとめていきます。

準備するモノ

  • Windows11 + WLS 2(Ubuntu)
  • Wireshark Version 4.6.2
  • Seeed Studio XIAO nRF52840(スイッチサイエンス)
  • ST-Link/V2互換品
  • 半田ごてとちょっとした勇気

手順

1)nRF52840とST-Link/V2をSWD(Serial Wire Debug)で接続する。

ST-Link/V2 nRF52840 備考
SWDIO DIO データ信号
SWCLK CLK クロック信号
GND GND 共通接地
3.3V (TVCC) 3V3 ターゲット電圧の検出用 (※1)
RST RST 必要に応じて接続 (※1)

※1:今回は3.3VとRSTを接続しなくても動きました。

2)nRF Util のインストール

ここからWindows 版の nRF Util をダウンロードします。
ダウンロード後、コマンドプロンプト(DOS 窓) を起動し、以下のコマンドを実行してnRF Util のインストールを行ってください。

C:\Users\Developer>nrfutil install completion
C:\Users\Developer>nrfutil install ble-sniffer
C:\Users\Developer>nrfutil ble-sniffer bootstrap

nRF Util が正常にインストールできると、以下のファイルが展開されます。
 C:\Users\xxx\.nrfutil\share\nrfutil-ble-sniffer\firmware\sniffer_nrf52840dk_nrf52840_4.1.1.hex
 C:\Users\xxx\AppData\Roaming\Wireshark\extcap\nrfutil-ble-sniffer-shim.exe
 C:\Users\xxx\AppData\Roaming\Wireshark\extcap\nrfutil-ble-sniffer-hci-shim.exe
 C:\Users\xxx\AppData\Roaming\Wireshark\extcap\nrfutil-ble-sniffer-shim-config.json

3)openocdのInstall
WSLのUbuntuを起動後、aptコマンドでOpenOCDをインストールしてください。

$ sudo apt install openocd
$ sudo apt install usbutils

4)F/Wの書き込み

Windows 上の USB デバイスを WSL(Ubuntu)に接続する

C:\Windows\System32>usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-9    0db0:0076  USB 入力デバイス                                              Not shared
3-1    0483:3748  STM32 STLink                                                  Shared
4-2    0c45:7663  USB 入力デバイス                                              Not shared
4-3    093a:2510  USB 入力デバイス                                              Not shared
C:\Windows\System32>usbipd bind --busid 3-1
C:\Windows\System32>usbipd attach --wsl --busid 3-1

usbipd コマンドの実行には管理者権限が必要です。
また、usbipd attach を実行する前に、WSL 2(Ubuntu)をあらかじめ起動しておく必要があります。

Ubuntuで、openocdコマンドを使いF/Wを書き込む

$ openocd -f interface/stlink.cfg  -f target/nrf52.cfg  -c init -c "reset init" -c halt -c "nrf5 mass_erase" -c "program sniffer_nrf52840dk_nrf52840_4.1.1.hex verify" -c reset -c exit
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD

nRF52 device has a CTRL-AP dedicated to recover the device from AP lock.
A high level adapter (like a ST-Link) you are currently using cannot access
the CTRL-AP so 'nrf52_recover' command will not work.
Do not enable UICR APPROTECT.

Info : clock speed 1000 kHz
Info : STLINK V2J29S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.241270
Info : [nrf52.cpu] Cortex-M4 r0p1 processor detected
Info : [nrf52.cpu] target has 6 breakpoints, 4 watchpoints
Info : starting gdb server for nrf52.cpu on 3333
Info : Listening on port 3333 for gdb connections
[nrf52.cpu] halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00009c80 msp: 0x2003d3c0
Info : nRF52840-xxAA(build code: D0) 1024kB Flash, 256kB RAM
Info : Mass erase completed.
[nrf52.cpu] halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
** Programming Started **
Warn : Adding extra erase range, 0x00011734 .. 0x00011fff
** Programming Finished **
** Verify Started **
** Verified OK **
$

5)Wiresharkの起動
Wireshark を起動し、メニューから [ヘルプ] → [Wireshark について] を選択します。
表示されるポップアップウィンドウで [プラグイン] タブ を開き、
一覧に nrfutil-ble-sniffer-shim.exe および nrfutil-ble-sniffer-hci-shim.exe が表示されていれば、
Sniffer デバイスは正しく認識されています。


キャプチャ対象のインタフェースとしてnRF Sniffer for Bluetooth LEを選択することで、キャプチャできます。

最後に

私の環境ではnRF Sniffer for Bluetooth LE のキャプチャプラグインをインストール後、Wireshark の起動が極端に遅くなる現象を確認しました。
調査したところ、
C:\Users\xxxxxx\AppData\Roaming\Wireshark\extcap

に配置されたキャプチャプラグインが起動時に読み込まれることが原因のようです。
当該ディレクトリから キャプチャプラグインのファイルを削除すると、Wireshark の起動速度は元に戻りました。
BLE Sniffer を使用しない場合は、プラグインを一時的に削除(または退避)しておく運用が無難だと思われます。