Skip to content

Bluetooth : analyser des captures réseau avec btsnoop et Wireshark

Bluetooth est un protocole radio courte portée omniprésent : claviers, souris, écouteurs, smartphones, objets connectés. Les échanges Bluetooth peuvent être capturés et analysés comme n’importe quel trafic réseau. Le format btsnoop est le format de fichier standard pour ces captures.

Bluetooth est organisé en couches. Comprendre cette pile est nécessaire pour interpréter ce que Wireshark affiche dans les trames.

┌─────────────────────────────────────────────┐
│ Applications / Profils │ A2DP, HFP, HID, GATT…
├──────────────┬──────────────────────────────┤
│ RFCOMM │ SDP / SDAP │ Émulation série, découverte de services
├──────────────┴──────────────────────────────┤
│ L2CAP │ Multiplexage, segmentation des paquets
├─────────────────────────────────────────────┤
│ HCI │ Interface hôte ↔ contrôleur
├──────────────┬──────────────────────────────┤
│ Link Manager│ LE Link Layer │ Gestion des connexions, chiffrement
├──────────────┴──────────────────────────────┤
│ Baseband / Radio (PHY) │ 2,4 GHz ISM, canaux de 1 MHz (BR/EDR)
│ │ ou 2 MHz (BLE, 40 canaux)
└─────────────────────────────────────────────┘

Baseband / PHY — la couche radio. Bluetooth BR/EDR utilise la bande 2,4 GHz avec 79 canaux de 1 MHz et du frequency hopping (1600 sauts/seconde). BLE utilise 40 canaux de 2 MHz.

HCI (Host Controller Interface) — le point de découpe entre le firmware du chip Bluetooth et le système d’exploitation. C’est là que les captures btsnoop sont enregistrées sur Android : le fichier btsnoop_hci.log capte tout ce qui passe par cette interface.

L2CAP — couche d’adaptation qui multiplexe plusieurs flux logiques sur la même liaison physique. Elle segmente les paquets longs et les réassemble côté destinataire.

RFCOMM — émule une liaison série (RS-232) sur Bluetooth. Utilisé par les profils HFP (kit mains-libres), SPP (port série), et HSP (casque).

SDP (Service Discovery Protocol) — permet à un appareil de découvrir les services offerts par un autre : profils supportés, canaux RFCOMM associés, UUIDs de services.

Piconet — cellule de base Bluetooth. Un maître, jusqu’à 7 esclaves actifs. Le maître cadence les échanges : il émet dans les slots pairs, reçoit dans les slots impairs. La période d’un slot est 312,5 µs.

Scatternet — plusieurs piconets interconnectés via un appareil pont, qui est maître dans un piconet et esclave dans un autre.

Piconet A Piconet B
[M]──[S]──[S] [M]──[S]──[S]
[S]─────[pont]
(esclave dans A, maître dans B)

Chaque équipement Bluetooth possède une adresse unique sur 48 bits, le BD_ADDR, structuré comme une adresse MAC :

XX:XX:XX:YY:YY:YY
└──────┘ └──────┘
NAP LAP
(fabricant) (adresse appareil)

Les 24 bits de gauche (NAP + UAP) identifient le fabricant. Cette information est exploitable pour qualifier un équipement inconnu dans une capture.

btsnoop est le format de fichier utilisé pour stocker des captures HCI Bluetooth. Android génère automatiquement un fichier btsnoop_hci.log quand l’option de débogage Bluetooth est activée dans les options développeur.

Un fichier btsnoop commence par un en-tête fixe, suivi de blocs de paquets :

En-tête (16 octets) :

Offset Taille Contenu
0 8 Magic number : "btsnoop\0" (ASCII)
8 4 Version : 1 (big-endian)
12 4 Datalink type

Types de datalink courants :

ValeurDescription
1001HCI UART (H4) — le plus courant sur Android
1002HCI BCSP
1003HCI-USB non encapsulé
2001HCI Bscore
2002Monitor (Linux Bluetooth Monitor)

Enregistrement par paquet :

Offset Taille Contenu
0 4 Taille originale du paquet (octets)
4 4 Taille incluse dans le fichier
8 4 Flags (direction + type)
12 4 Drops (paquets perdus avant celui-ci)
16 8 Timestamp (microsecondes depuis le 1er janvier 2000)
24 N Données HCI du paquet

Le champ Flags indique la direction et le type de paquet :

ValeurSignification
0x00Envoyé depuis l’hôte vers le contrôleur (commande ou data)
0x01Reçu du contrôleur vers l’hôte (événement ou data)
  1. Activer les Options développeur (taper 7 fois sur le numéro de build dans Paramètres → À propos)
  2. Dans Options développeur → Activer le journal Bluetooth HCI
  3. Reproduire les échanges Bluetooth à capturer
  4. Récupérer le fichier via ADB :
Terminal window
adb pull /sdcard/btsnoop_hci.log .

Le chemin peut varier selon le fabricant (/data/misc/bluetooth/logs/btsnoop_hci.log sur certains appareils).

Wireshark ouvre nativement les fichiers .log au format btsnoop :

Terminal window
wireshark btsnoop_hci.log

Menu Wireless → Bluetooth Devices : Wireshark liste tous les équipements détectés dans la capture avec leur BD_ADDR, leur nom, et le fabricant déduit des 24 bits supérieurs de l’adresse.

# Afficher uniquement les paquets HCI Command
bluetooth.hci_h4.type == 0x01
# Afficher uniquement les HCI Event
bluetooth.hci_h4.type == 0x04
# Filtrer par adresse BD_ADDR
bluetooth.addr == "aa:bb:cc:dd:ee:ff"
# Afficher les paquets de découverte de services (SDP)
btsdp
# Afficher les données L2CAP
btl2cap
# Afficher le trafic RFCOMM (émulation série)
btrfcomm
# Afficher le trafic ATT (BLE GATT)
btatt

Découverte d’appareils (Inquiry) — les paquets HCI_Inquiry et HCI_Inquiry_Result révèlent les équipements présents dans le périmètre au moment de la capture, avec leurs BD_ADDR et noms.

Découverte de services (SDP) — les échanges SDP listent les profils supportés par un appareil : présence d’un port série (RFCOMM), d’un profil audio, d’un profil HID (clavier/souris).

Données applicatives — si la liaison n’est pas chiffrée, les données RFCOMM ou ATT transitent en clair et sont lisibles directement dans Wireshark.

Clés de couplage — dans une capture de la phase de pairing, les échanges LMP/LL peuvent révéler des informations sur le mécanisme d’appairage utilisé (Just Works, Passkey, Numeric Comparison).

Une capture btsnoop enregistrée sur un appareil Android contient l’intégralité des échanges HCI : équipements détectés, services découverts, données échangées. Wireshark décode ces trames nativement. La première chose à vérifier dans une capture est si les liaisons sont chiffrées — si ce n’est pas le cas, le contenu applicatif est lisible en clair.