📶

ubertooth-btle の技術文書日本語訳

2023/08/16に公開

この文書について

この文書は

https://github.com/greatscottgadgets/ubertooth/blob/master/host/README.btle.md

の日本語訳です。本記事を参照して何があっても自己責任でお願い致します。

ubertooth-btle

Bluetooth Low Energy mode for Ubertooth

このソフトウェアは実験的なものです。限られた特殊な開発環境で開発・テストしてます。
このソフトで本気で何かをしようとしている人は良い意味でCrazyです。

必要なもの

  • Ubertooth本体
  • パケットキャプチャ用で使えるあなたのBLEデバイス

常に最新のbluetooth_rxtxファームウェアとgithubのコードを使ってください。
インストール・ビルド方法についてはファームウェアと同じフォルダにあるREADMEを参照してください。

利用者はBLEに関する技術的な知識を持つ必要があります。Bluetooth Core Spec 4.0を参照してください。

使い方

ubertooth-btleは二つのモードを持っています。

  • コネクション追跡モード
  • プロミスキャスモード

見た目はこの二つのモードは非常に似ています。

両モード、バイナリパケットがHEXダンプされてターミナルに出力され、(オプションで)ファイルに保存されます。
両モードから抜け出すには以下のコマンドでハードウェアをリセットするしかありません。

ubertooth-util -r

コネクション追跡モード

Ubertoothはコネクションパケットを検知するためチャンネル通知パケットを待ちます。
もしコネクションパケット(タイプ=0x05)を検知した場合、そのコネクションに追従するため
自動でチャンネルホッピングを行います。

このモードに入るためには以下のコマンドを入力します。

ubertooth-btle -f

そして、あなたのBLEデバイスを検知可能モードにしてください。
そうすればそのデバイスから以下のようなadvertisingパケットを取得できるはずです。

systime=1349412883 freq=2402 addr=8e89bed6 delta_t=38.441 ms
00 17 ab cd ef 01 22 00 02 01 06 03 02 0d 18 06 ff 6b 00 03 00 00 02
0a 00 c2 87 64

最初の1バイト(0x00)は
connectable undirected advertising event (Bluetooth core spec 4.0 page 2203)
を意味します。
(補足:0x8E89BED6はAdvertising用の共通アドレスです。)

この時、他のBLE端末からその端末に接続しようとすると、運が良ければ以下のようなパケットが見られます。

systime=1349413162 freq=2402 addr=8e89bed6 delta_t=0.409 ms
05 22 99 88 77 66 02 00 ab cd ef 01 22 00 12 8b 9a af a3 df 00 03 0e
00 0f 00 00 00 80 0c ff ff ff ff 1f ab 80 ff 0f

このパケットには以下のようなデータが続きます。

systime=1349413162 freq=2450 addr=af9a8b12 delta_t=39.675 ms
0d 00 44 a5 22

freqの値を見て、2402MHzから2450MHzに周波数が移動したことを確認してください。

  • 2402 MHz - advertisingチャンネル
  • 2450 MHz - dataチャンネル

0x05で始まるパケットは__connection request event__ (core spec
4.0 page 2206)を意味します。Ubertooth本体がこれを検知した際はすぐにコネクション追跡に入ります。

0x0dで始まるパケットは空データパケットです。
2バイトのヘッダー、0バイトのデータ,3バイトのCRCを含みます。

プロミスキャスモード

以下のコマンドでUbertoothを好きなチャンネルにセットします。

ubertooth-util -c2404

以下のコマンドでチャンネルのチューニングも可能です(スケルチに有効)。

ubertooth-util -z-50

以下のコマンドでプロミスキャスモードに入ります。

ubertooth-btle -p

BLEデバイスにコネクションを確立します。キャプチャできるデータは以下のようなゴミデータがほとんどですが、耐えて待てばAccess Addressesパケットの連続をキャプチャすることができます。

systime=1349414653 freq=2404 addr=bc1d023e delta_t=64.037 ms
01 00 af dd 10

systime=1349414653 freq=2404 addr=f3474c81 delta_t=121.582 ms
01 00 25 98 8b

systime=1349414653 freq=2404 addr=9bfc3bf3 delta_t=0.062 ms
01 00 58 ec c3

systime=1349414678 freq=2404 addr=506545d9 delta_t=1387.338 ms
01 00 20 56 86

systime=1349414680 freq=2404 addr=506545d9 delta_t=1387.783 ms
01 00 20 56 86

systime=1349414681 freq=2404 addr=506544ed delta_t=1387.436 ms
01 00 20 56 86

systime=1349414683 freq=2404 addr=506545d9 delta_t=1387.557 ms
01 00 20 56 86

一度Access Addressesが見つかった場合、Ubertooth本体はそれを自動追跡します。
また、CRCチェックを自動で実施します。01 00以外のコンテンツを見ると良いです。

systime=1349414683 freq=2404 addr=506545d9 delta_t=0.352 ms
05 00 f3 50 86

systime=1349414683 freq=2404 addr=506545d9 delta_t=693.326 ms
0d 00 55 5d 86

Ubertooth はチャンネルホップ間隔(秒数)とチャンネルホップ量(周波数)を再計算しコネクション追跡モードに移行します。

その他

CRCチェックはdefaultで有効です。 -v0フラグで無効化が可能です。
※無効にする場合はスケルチを使用してください。

ubertooth-btle -v0

Access Addressesはコネクションパケットからもプロミスキャスモードの解析結果からも基本的に自動検知します。追跡するAccess Addressesを制限する場合は以下のように-aフラグをつけてください。

ubertooth-btle -a01234567

操作

コネクション追跡には以下の4つの値が必要です。

  1. Access addresses (アクセスアドレス)
  2. CRC init (CRCの初期化シーケンス値)
  3. チャンネルホップ間隔 (Masterが決定するホップアルゴリズムに従う)
  4. チャンネルホップ量 (Masterが決定するホップアルゴリズムに従う)

コネクション追跡モードではこれらの情報はコネクションパケットから抽出されます。
プロミスキャスモードではBLEパケットの情報をもとに解析されます。

  • Access Addresses

コネクション追跡モードでは推測可能な形である空データパケットを探します。
そのパケットからAccess addressesの候補を割り出します。
___5回___同じAccess addressesが発見された場合はそれを正当でなおかつ現在通信を行なっているアクティブなコネクションだと推測します。そして、データチャンネルでそのアクセスアドレスを待ち続けます。

  • CRC init
    CRC initは線形帰還シフトレジスタ(LFSR)の初期化に使用します。
    LFSRの値は常に直前のパケットデータとXORされるので後方参照が可能です。
    Ubertoothは考えうるパケットによる計算でLFSRを復旧しCRC initを算出します。

  • チャンネルホップ間隔
    ホップ間隔は1サイクル=(37 * 1.25 * ホップ間隔)msecとして計算することで算出します。
    データチャンネルを監視し連続する二つのパケットの時間を計算し、以下のフォーマットで算出します。

      hop_interval = delta_t / (37 * 1.25)
    
  • チャンネルホップ量
    ホップ量は二つのデータチャネル(index 0, index1)のパケット到着間隔によって算出します。
    まずindex 0のデータチャネルを監視し、その後index 1のデータチャネルを監視し、
    2個目のパケットが来るのを待ちます。

到着間隔時間から、1個目と2個目の間でホップしたチャンネル数を計算することができます。

channels_hopped = delta_t / (1.25 * hop_interval)

これを計算表にあてはめることでホップ量を求めることができます。

これで、必要な4つの通信を入手しコネクション追跡モードであたかも最初の接続パケットを取得したかのように傍受できるようになります。

バグ

このコードはすべてのデータチャネルが利用されているという前提で作成されています。

著者

This code was mostly written by Mike Ryan mikeryan@lacklustre.net over
the course of many sleepless nights.

This could not have been done without the tremendous moral and technical
support of Dominic Spill and Mike Ossmann. Thanks also to Will Code,
Jared Boone, Mike Kershaw (dragorn), and the rest of the Ubertooth team.

A major tip o' the hat is due to the Bluetooth SIG. The Bluetooth Core
Spec 4.0 is an amazingly clear and readable technical reference.

Discussion