
Sniffer di pacchetti e trasmettitore Bluetooth Low Energy (BLE) sia per standard che non standard (bit grezzi) basato su Software Defined Radio (SDR).
BTLE è una suite software libera e open-source per Bluetooth Low Energy (BLE) basata su Software Defined Radio, insieme a un progetto open di chip BTLE.
Include:
Assicurati che l'ambiente hardware SDR (driver/lib) sia stato configurato correttamente prima di eseguire questo progetto.
git clone https://github.com/JiaoXianjun/BTLE.git
cd BTLE/host
mkdir build
cd build
cmake ../ (default. for HackRF)
cmake ../ -DUSE_BLADERF=1 (only for bladeRF)
make
./btle-tools/src/btle_rx
Il comando precedente effettua lo sniffing sul canale 37. Dovresti vedere molti pacchetti sullo schermo se hai dispositivi BLE (telefono/tablet/portatile) nelle vicinanze.
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r500
Il comando precedente trasmette pacchetti discovery sul canale ADV. Dovresti vedere un dispositivo con nome "SDR/Bluetooth/Low/Energy" in un'altra app sniffer BLE (come LightBlue).
Per avere una sequenza di operazioni più veloce su HACKRF, usa quanto segue:
#define TRANSFER_COUNT 4
#define TRANSFER_BUFFER_SIZE 4096
in hackrf/host/libhackrf/src/hackrf.c. Quindi ricompila la libreria HACKRF e reinstallala. Non dimenticare di ricompilare BTLE per applicare la modifica alla libreria HACKRF.
Oltre agli strumenti, la directory matlab include la valutazione degli algoritmi e altri script utili
-h --help
Stampa tutti gli argomenti/gli usi.
-c --chan
Numero del canale. Valore predefinito 37 (uno dei canali ADV). Valori validi 0~39 (tutti i canali ADV e DATA).
-g --gain
Guadagno di ricezione in dB. HACKRF rxvga predefinito 6, valori validi 0 - 62. Il default di bladeRF è il guadagno rx massimo di 66dB (valido 0 - 66). Il guadagno deve essere regolato con molta attenzione per garantire le migliori prestazioni nella tua situazione. Si consiglia di provare partendo da un guadagno basso, perché un guadagno alto provoca sempre una forte distorsione e non ottieni nulla.
-l --lnaGain
Guadagno LNA in dB (solo HackRF). Predefinito 32, valori validi 0 - 40. Il guadagno deve essere regolato con molta attenzione per garantire le migliori prestazioni nella tua situazione.
-b --amp
Abilita l'amplificatore (solo HackRF). Predefinito: disattivato.
-a --access
Access address. Predefinito 8e89bed6 per i canali ADV 37, 38, 39. Dovresti specificare il valore corretto per il canale dati in base alla procedura di setup della connessione catturata.
-k --crcinit
Predefinito 555555 per il canale ADV. Dovresti specificare il valore corretto per il canale dati in base alla procedura di setup della connessione catturata.
-v --verbose
Modalità verbose. Stampa più informazioni quando c'è un errore
-r --raw
Modalità raw. Dopo il rilevamento dell'access addr, stampa i successivi 42 byte raw (senza de-scrambling né parsing)
-f --freq_hz (need argument)
Questa frequenza (Hz) avrà la precedenza sull'impostazione del canale (nel caso in cui si voglia lavorare su una frequenza diversa da BTLE. Scopo più generale).
-m --access_mask (need argument)
Se un bit di questa maschera è 1, il bit corrispondente nell'access address verrà incluso nella decisione sull'esistenza del pacchetto (nel caso in cui si voglia una parola unica più corta/rada per il rilevamento dei pacchetti. Scopo più generale).
-o --hop
Questo attiva il tracciamento del canale dati (frequency hopping) dopo che le informazioni di setup del collegamento vengono catturate nel pacchetto ADV_CONNECT_REQ sul canale ADV.
-s --filename
Salva i pacchetti in un file pcap.
btle_tx packet1 packet2 ... packetX ... rN
oppure
btle_tx packets.txt
packets.txt è un file di testo che contiene i parametri della riga di comando (packet1 packet2 ... rN) come testo. Un parametro per riga. Una riga che inizia con "#" è considerata un commento. Vedi esempio packets.txt
packetX
è una stringa che descrive un pacchetto. Tutti i pacchetti compongono una sequenza di pacchetti.
rN
significa che la sequenza verrà ripetuta N volte. Se non viene specificato, la sequenza verrà inviata una sola volta.
Formato della stringa packetX
channel_number-packet_type-field-value-field-value-...-Space-value
Ogni stringa descrittiva inizia con il numero del canale BTLE (0~39), seguita dal packet_type (RAW/iBeacon/ADV_IND/ADV_DIRECT_IND/etc. Vedi tutti gli esempi di formato ALLA FINE: Appendice), quindi dalla coppia campo-valore specifica del packet_type; alla fine c'è la coppia Space-value (opzionale), in cui il valore specifica quanti millisecondi attendere dopo l'invio di questo pacchetto.
NON usare il carattere spazio " " in un descrittore di pacchetto da riga di comando. PUOI usare lo spazio nel descrittore di pacchetto nel file txt.
NON usare "-" all'interno di ciascun campo. "-" è un carattere magico usato per separare i diversi campi nel descrittore di pacchetto.
Apri l'app LightBlue (o un altro sniffer BLE) sul tuo iPhone/dispositivo prima di questo comando:
./btle-tools/src/btle_tx ../btle-tools/src/packets_discovery.txt
Vedrai un dispositivo chiamato "SDR Bluetooth Low Energy" nella tua app LightBlue.
Riga di comando corrispondente:
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r40
Nota: lo spazio " " è sostituito da "/" perché lo spazio " " non è supportato nella riga di comando.
btle_tx 37-ADV_IND-TxAdd-0-RxAdd-0-AdvA-90D7EBB19299-AdvData-0201050702031802180418-Space-1 37-CONNECT_REQ-TxAdd-0-RxAdd-0-InitA-001830EA965F-AdvA-90D7EBB19299-AA-60850A1B-CRCInit-A77B22-WinSize-02-WinOffset-000F-Interval-0050-Latency-0000-Timeout-07D0-ChM-1FFFFFFFFF-Hop-9-SCA-5-Space-1 9-LL_DATA-AA-60850A1B-LLID-1-NESN-0-SN-0-MD-0-DATA-XX-CRCInit-A77B22-Space-1
Quanto sopra simula una procedura di stabilimento della connessione tra il dispositivo 1 e il dispositivo 2. File descrittore corrispondente BTLE/host/btle-tools/src/packets.txt.
Il 1° pacchetto -- il dispositivo 1 invia un pacchetto ADV_IND sul canale 37.
Il 2° pacchetto -- Dopo che il dispositivo 2 (in stato di scansione) riceve il pacchetto ADV dal dispositivo 1, il dispositivo 2 invia un pacchetto CONNECT_REQ per richiedere il setup della connessione con il dispositivo 1. In questo pacchetto di richiesta sono presenti l'indirizzo MAC del dispositivo 2 (InitA), l'indirizzo MAC di destinazione (indirizzo MAC del dispositivo 1, AdvA), l'access address (AA) che verrà usato dal dispositivo 1 per l'invio dei pacchetti successivi sul canale dati, il valore di inizializzazione del CRC per i successivi pacchetti inviati dal dispositivo 1, le informazioni sul channel hopping (ChM e Hop) per il canale dati usato dal dispositivo 1, ecc.
Il 3° pacchetto -- il dispositivo 1 invia un PDU dati vuoto del link layer sul canale 9 (deciso dallo schema di hopping) in base alle informazioni di richiesta di connessione ricevute dal dispositivo 2. ("XX" dopo il campo "DATA" significa che non ci sono dati per questo campo)
L'intervallo di tempo tra i pacchetti è di 1s (1000ms). Imposta il packet sniffer TI sul canale 37; la procedura di stabilimento sopra verrà così catturata.
./btle-tools/src/btle_tx 37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100 r100
Il comando precedente invia un pacchetto iBeacon e lo ripete 100 volte con un intervallo di 100ms. File descrittore corrispondente BTLE/host/btle-tools/src/packets_ibeacon.txt. Puoi usare un dongle sniffer BLE per vedere il pacchetto.
La stringa descrittiva del pacchetto:
37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100
37
canale 37 (uno dei canali Advertising BTLE: 37, 38, 39)
iBeacon
parola chiave del formato di pacchetto che indica il formato iBeacon. (In realtà è il formato ADV_IND in Core_V4.0.pdf)
AdvA
indirizzo Advertising (indirizzo MAC) impostato a 010203040506 (Vedi Core_V4.0.pdf)
UUID
qui lo specifichiamo come UUID fisso di Estimote: B9407F30F5F8466EAFF925556B57FE6D
Major
numero major del formato iBeacon. (Qui è 0008)
Minor
numero minor del formato iBeacon. (Qui è 0009)
Txpower
parametro della potenza di trasmissione del formato iBeacon (Qui è C5)
Space
Quanti millisecondi attendere dopo l'invio di questo pacchetto. (Qui è 100ms)
Vedi un confronto con il packet sniffer TI qui: http://sdr-x.github.io/BTLE-SNIFFER/
Guarda la demo video di btle_rx o la demo video di btle_rx (in Cina) e la demo video 1 di btle_tx o la demo video 2 di btle_tx (in Cina)
Pacchetti RAW: (Tutti i bit verranno inviati direttamente al modulatore GFSK)
37-RAW-aad6be898e8dc3ce338c4cb1207730144f9474e0e15eedb378c3bc
PACCHETTI SU CANALE ADVERTISING (ad esempio canale 37):
37-IBEACON-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5
37-ADV_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-ADV_DIRECT_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-InitA-0708090A0B0C
37-ADV_NONCONN_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-ADV_SCAN_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-SCAN_REQ-TxAdd-1-RxAdd-0-ScanA-010203040506-AdvA-0708090A0B0C
37-SCAN_RSP-TxAdd-1-RxAdd-0-AdvA-010203040506-ScanRspData-00112233445566778899AABBCCDDEEFF
37-CONNECT_REQ-TxAdd-1-RxAdd-0-InitA-010203040506-AdvA-0708090A0B0C-AA-01020304-CRCInit-050607-WinSize-08-WinOffset-090A-Interval-0B0C-Latency-0D0E-Timeout-0F00-ChM-0102030405-Hop-3-SCA-4
PACCHETTI SU CANALE DATA (ad esempio canale 9):
9-LL_DATA-AA-60850A1B-LLID-1-NESN-0-SN-0-MD-0-DATA-XX-CRCInit-A77B22
9-LL_CONNECTION_UPDATE_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-WinSize-02-WinOffset-0e0F-Interval-0450-Latency-0607-Timeout-07D0-Instant-eeff-CRCInit-A77B22
9-LL_CHANNEL_MAP_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ChM-1FFFFFFFFF-Instant-0201-CRCInit-A77B22
9-LL_TERMINATE_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ErrorCode-12-CRCInit-A77B22
9-LL_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-Rand-0102030405060708-EDIV-090A-SKDm-0102030405060708-IVm-090A0B0C-CRCInit-A77B22
9-LL_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-SKDs-0102030405060708-IVs-01020304-CRCInit-A77B22
9-LL_START_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_START_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_UNKNOWN_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-UnknownType-01-CRCInit-A77B22
9-LL_FEATURE_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-FeatureSet-0102030405060708-CRCInit-A77B22
9-LL_FEATURE_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-FeatureSet-0102030405060708-CRCInit-A77B22
9-LL_PAUSE_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_PAUSE_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_VERSION_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-VersNr-01-CompId-0203-SubVersNr-0405-CRCInit-A77B22
9-LL_REJECT_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ErrorCode-00-CRCInit-A77B22
Pacchetti Discovery: (che possono mostrare qualsiasi nome o servizio in app scanner, come LightBlue):
37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-FLAGS-02-LOCAL_NAME09-CA-TXPOWER-03-SERVICE03-180D1810-SERVICE_DATA-180D40-MANUF_DATA-0001FF-CONN_INTERVAL-0006 (-SERVICE_SOLI14-1811)
FLAGS: 0x01 LE Limited Discoverable Mode; 0x02 LE General Discoverable Mode
SERVICE:
0x02 16-bit Service UUIDs More 16-bit UUIDs available
0x03 16-bit Service UUIDs Complete list of 16-bit UUIDs available
0x04 32-bit Service UUIDs More 32-bit UUIDs available
0x05 32-bit Service UUIDs Complete list of 32-bit UUIDs available
0x06 128-bit Service UUIDs More 128-bit UUIDs available
0x07 128-bit Service UUIDs Complete list of 128-bit UUIDs available