Phase 4: Protokoll-Rekonstruktion
BLE-Protokolle dokumentieren und als Zustandsmaschine modellieren
Lernziel
Nach dieser Seite weißt du, wie du JADX-Code und PCAP-Mitschnitte miteinander korrelierst, eine vollständige GATT-Hierarchie dokumentierst, Befehlsformate reverse engineerst und das Kommunikationsprotokoll eines BLE-Geräts als Zustandsmaschine (DFA) modellierst — mit drei echten Geräteprotokollen als Praxisbeispiele.
Was ist Protokoll-Rekonstruktion?
Stell dir vor, du hörst ein Gespräch in einer fremden Sprache. In Phase 2 hast du jeden Satz aufgeschrieben. In Phase 3 hast du das Wörterbuch gefunden. Jetzt, in Phase 4, baust du die vollständige Grammatik dieser Sprache nach — die Regeln, in welcher Reihenfolge Sätze gesagt werden dürfen, was eine Antwort auslöst und was passiert, wenn ein Schritt übersprungen wird.
Das Ergebnis dieser Phase ist eine Protokollspezifikation: ein strukturiertes Dokument, das beschreibt, welche Charakteristik welche Befehle erwartet, welches Byte-Format gilt und in welcher Reihenfolge Nachrichten ausgetauscht werden müssen.
Warum Phase 4 erst nach Phase 3?
In Phase 1 und 2 hast du UUIDs, Code und rohe Bytes gesammelt. In Phase 3 hast du eventuell Krypto-Schlüssel extrahiert. Phase 4 bringt alles zusammen: Du setzt die Einzelteile zu einem vollständigen Bild zusammen — erst dann kannst du in Phase 5 einen funktionierenden Exploit bauen.
Zeitaufwand: 3–5 Stunden für ein unbekanntes Gerät.
Schritt 1: JADX und PCAP korrelieren
Der wichtigste Schritt in Phase 4 ist die Korrelation: Du schaust gleichzeitig auf den dekompilierten Java-Code (JADX) und auf den Netzwerkmitschnitt (Wireshark) und fragst: "Welche Codezeile erzeugt welches Paket?"
Vorgehen
- Öffne JADX-GUI mit der APK und Wireshark mit der
.pcapng-Datei nebeneinander. - Suche in JADX nach dem BLE-Schreibaufruf (
writeCharacteristic) und schau, welche Daten übergeben werden. - Suche in Wireshark nach demselben Byte-Muster (Filter:
btatt.value). - Dokumentiere: Code-Funktion → Byte-Sequenz → Zeitpunkt im Capture.
# Pseudocode: Korrelationsdokument aufbauen
{
"funktion": "sendColorCommand",
"charakteristik": "0000fff3-0000-1000-8000-00805f9b34fb",
"beispiel_bytes": "7e 07 05 03 80 ff 00 10 ef",
"wireshark_frame": 42,
"zeitstempel_pcap": "17.380s"
}Wireshark-Filter für GATT-Writes
Nutze den Filter btatt.opcode == 0x12 für Write-Requests und btatt.opcode == 0x1b für Handle-Value-Notifications. So filterst du sofort alle Befehle und Antworten des Geräts heraus.
Schritt 2: GATT-Hierarchie dokumentieren
Bevor du einzelne Befehle analysierst, dokumentierst du die vollständige GATT-Struktur des Geräts. Diese Hierarchie ist das "Inhaltsverzeichnis" des Protokolls.
GATT (Generic Attribute Profile) organisiert BLE-Dienste in einer Baumstruktur: Ein Gerät hat Services (Dienste), jeder Service hat Characteristics (Charakteristiken), jede Charakteristik hat Permissions (Rechte: Lesen, Schreiben, Notify).
Praxisbeispiel: LED-Brille
Die Brille hat einen herstellerspezifischen Service auf 0xFFF0 mit drei Charakteristiken:
GLASSES-12B008
|
+-- LED Control Service (0xFFF0)
| +-- Control (Handle: 0x0012)
| | UUID: d44bc439-abfd-45a2-b575-925416129600
| | Permissions: WRITE, WRITE_WITHOUT_RESPONSE
| |
| +-- Data (Handle: 0x0015)
| | UUID: d44bc439-abfd-45a2-b575-92541612960a
| | Permissions: WRITE, WRITE_WITHOUT_RESPONSE
| |
| +-- Notification (Handle: 0x001B)
| UUID: d44bc439-abfd-45a2-b575-925416129601
| Permissions: NOTIFY
|
+-- OTA/Firmware Service (0xFD00)
Die Aufgabenteilung ist direkt aus den Charakteristik-Namen und Permissions ablesbar: Control-Schreiben löst Steuerkommandos aus, Data-Schreiben überträgt Nutzdaten, und Notification empfängt Bestätigungen vom Gerät.
Praxisbeispiel: LED-Strip
Der Strip verwendet Standard-UUIDs aus dem 0xFFF0-Bereich — ein Indiz für eine generische Firmware-Plattform:
LED-STRIP
|
+-- Control Service (0xFFF0)
+-- Command (Handle: 0x000D)
UUID: 0000fff3-0000-1000-8000-00805f9b34fb
Permissions: WRITE, WRITE_WITHOUT_RESPONSE
Auffälligkeit: Nur eine einzige Charakteristik für alle Befehle. Das deutet auf ein einfaches Befehlsformat hin, bei dem der Befehlstyp über einen Opcode im Payload kodiert wird — nicht über verschiedene Charakteristiken.
Praxisbeispiel: Körperwaage
Die Waage hat eine besondere Architektur: Sie nutzt keine GATT-Kommunikation für Messwerte, sondern sendet alles über BLE-Advertisements:
Körperwaage "Yoda1"
|
+-- Manufacturer Specific Data (Advertisements)
Hersteller-ID: 0x05C0 (Chipsea Technologies)
Nutzdaten: Gewicht + Impedanz (unverschlüsselt)
Das bedeutet: Du musst dich gar nicht verbinden, um die Messdaten zu empfangen. Ein passiver Sniffer in BLE-Reichweite genügt.
Keine GATT-Services heißt nicht kein Protokoll
Manche Geräte nutzen ausschließlich BLE-Advertisements für die Datenübertragung. Das ist kein Fehler in deiner Analyse — es ist eine bewusste Design-Entscheidung. Prüfe immer den Advertisement-Payload, bevor du davon ausgehst, dass ein Gerät kein Protokoll hat.
Schritt 3: Befehlsformate reverse engineern
Jetzt analysierst du die tatsächlichen Byte-Sequenzen und brichst sie in ihre Felder auf.
LED-Strip: Einfaches Frame-Format
Nach der Korrelation von JADX und PCAP ergibt sich für den LED-Strip ein klares, konsistentes Frame-Format:
7E [len] [opcode] [param1] [param2] [param3] [param4] 10 EF
| Feld | Byte | Bedeutung |
|---|---|---|
| Start | 7E | Rahmenanfang (immer gleich) |
| Länge | len | Anzahl der folgenden Nutzbytes |
| Opcode | opcode | Befehlstyp |
| Params | 4 Bytes | Befehlsparameter |
| End | 10 EF | Rahmenende (immer gleich) |
Opcodes aus dem PCAP-Mitschnitt (69 analysierte Commands):
| Opcode | Funktion | Anteil | Beispiel |
|---|---|---|---|
0x05 | RGB-Farbe | 43,5 % | 7e 07 05 03 80 ff 00 10 ef = Farbe #80FF00 |
0x03 | Effektmodi | 36,2 % | 7e 05 03 [effect] [speed] 10 ef |
0x04 | Power Ein/Aus | 11,6 % | 7e 04 04 [on/off] 00 10 ef |
0x01 | Helligkeit | 4,3 % | 7e 04 01 [0-255] 00 10 ef |
Befehl entschlüsseln — so geht's
Nimm das RGB-Beispiel: 7e 07 05 03 80 ff 00 10 ef. Start 7e, Länge 07 (7 Nutzbytes folgen), Opcode 05 (Farbe), Parameter 03 (Farbmodus), 80 ff 00 (R=128, G=255, B=0 = Gelbgrün), dann Ende 10 ef. Wenn du dieses Muster einmal verstanden hast, kannst du jeden anderen Farbbefehl selbst konstruieren.
LED-Brille: Zustandsabhängiges Protokoll mit Verschlüsselung
Die Brille ist komplexer. Alle Pakete sind AES-128-ECB-verschlüsselt (mit dem in Phase 3 extrahierten Schlüssel). Erst nach der Entschlüsselung sind die Befehle lesbar:
DATS-Befehl (Datenübertragung ankündigen):
Klartext: 07 44 41 54 53 01 00 26 00 00 00 00 00 00 00 00
[7]['D']['A']['T']['S'][1][SIZE_HI][SIZE_LO][...Padding...]
Chiffretext: e7 03 dd 68 d7 c0 bb 9c a7 5f 01 40 df 55 e2 19
Das Byte 07 ist der interne Befehlstyp. DATS ist eine ASCII-Kennung. SIZE_HI und SIZE_LO kodieren die Gesamtgröße der folgenden Daten als Big-Endian-16-Bit-Zahl.
Zeichenkodierung: Die Brille hat ein 14×12-LED-Matrix-Display. Jedes Zeichen wird als Spaltenbitmap kodiert: 2 Bytes pro Spalte, 12 Spalten pro Zeichen, also ca. 24 Bytes pro Zeichen. Das Wort "HELLO" benötigt damit 52 Bytes und wird in 16-Byte-AES-Blöcken übertragen (1 Byte Längenheader + bis zu 15 Bytes Nutzdaten pro Block).
Körperwaage: Advertisement-Payload dekodieren
Der Manufacturer-Data-Payload (Hersteller-ID 0x05C0) hat folgendes Format:
Offset Bytes Bedeutung
------ ------ ---------
0-1 c0 0e Status/Flags
2-3 0c 99 Gewicht (Big Endian, Einheit: 0,01 kg)
4-5 13 88 Impedanz (Big Endian, Einheit: 0,1 Ohm)
Dekodierung Gewicht: 0x0C99 = 3225 → 3225 × 0,01 kg = 32,25 kg
Dekodierung Impedanz: 0x1388 = 5000 → 5000 × 0,1 Ω = 500,0 Ω
Impedanzwert 500 Ohm ist ein Standardwert
Der Impedanzwert 0x1388 (500,0 Ω) erscheint, wenn die BIA-Messung nicht stabil ist — zum Beispiel wenn der Nutzer Socken trägt. Die App berechnet daraus lokal Körperfett-Werte unter Einbeziehung von Alter, Größe und Geschlecht aus dem Nutzerprofil. Dieser Wert signalisiert: Messung unvollständig.
Schritt 4: DFA-Modellierung
Ein DFA (Deterministischer Finiter Automat — englisch: Deterministic Finite Automaton) ist ein formales Modell für zustandsabhängige Systeme. Im BLE-Kontext beschreibt er, in welchem Zustand sich das Gerät gerade befindet und welche Nachrichten es in diesem Zustand erwartet.
Das ist keine akademische Übung — ohne DFA-Modell wirst du in Phase 5 fehlerhaften Exploit-Code schreiben, weil du eine Nachricht in der falschen Reihenfolge sendest.
Wann brauchst du einen DFA?
- Wenn das Gerät auf Nachrichten mit Bestätigungen antwortet (Notification-Charakteristik).
- Wenn die Reihenfolge der Nachrichten einen Unterschied macht (fehlgeschlagene Übertragung ohne vorherige Ankündigung).
- Wenn bestimmte Nachrichten nur in bestimmten Zuständen akzeptiert werden.
Der LED-Strip hat keinen DFA — jeder Befehl funktioniert sofort, unabhängig von vorherigen Befehlen. Die LED-Brille hat einen DFA mit 5 Zuständen.
Praxisbeispiel: Fünfstufiger Handshake der LED-Brille
Der PCAP-Mitschnitt (420+ erfasste Pakete) zeigt ein klares Muster: Bevor das Gerät Daten annimmt, muss ein Handshake abgeschlossen werden.
Smartphone LED-Brille
| |
| 1. DATS (Ankündigung) |
|----------------------------->| Handle 0x0012 (Control)
| |
| 2. DATSOK (Bereit) |
|<-----------------------------| Handle 0x001B (Notification)
| |
| 3. DATA (Zeichendaten) |
|----------------------------->| Handle 0x0015 (Data), mehrere Pakete
| |
| 4. DATCP (Ende) |
|----------------------------->| Handle 0x0012 (Control)
| |
| 5. DATCPOK (Fertig) |
|<-----------------------------| Handle 0x001B (Notification)
| |
Wichtig: Ohne die Bestätigung DATSOK in Schritt 2 darf kein DATA-Paket gesendet werden. Das Gerät ignoriert DATA ohne vorherigen Handshake. Außerdem gilt ein Pflicht-Pause von 50 ms zwischen DATA-Paketen — sonst verwirft das Gerät Pakete.
BLE-Verbindungszustandsautomat
DFA aus dem PCAP ableiten
Öffne deinen PCAP-Mitschnitt in Wireshark und sortiere nach Zeit. Markiere alle Notifications vom Gerät (Handle 0x001B) — das sind die Zustandsübergänge. Jede Notification ist ein Übergang in einen neuen Zustand. Dazwischen liegen die Nachrichten, die diesen Übergang ausgelöst haben.
Schritt 5: Protokollspezifikation schreiben
Am Ende von Phase 4 erstellst du ein schriftliches Dokument — die Protokollspezifikation. Dieses Dokument ist die Grundlage für Phase 5 (PoC-Entwicklung).
Eine minimale Protokollspezifikation enthält:
- GATT-Tabelle: Alle UUIDs, Handles, Permissions
- Befehlstabelle: Alle Opcodes, Parameter, Beispiel-Bytes
- DFA-Diagramm: Zustände und Transitionen (falls zustandsbehaftet)
- Timing-Anforderungen: Pflicht-Pausen zwischen Paketen
- Kodierungsregeln: Endianness (Big/Little Endian), Einheiten, Padding
Praxisbeispiel: Protokollspezifikation LED-Strip (Kurzform)
Gerät: Smart-LED-Strip (wl.smartled)
Protokoll: Klartext GATT-Write, zustandslos
GATT:
Service: 0000fff0-0000-1000-8000-00805f9b34fb
Characteristic: 0000fff3-0000-1000-8000-00805f9b34fb
Permission: WRITE, WRITE_WITHOUT_RESPONSE
Frame-Format: 7E [len] [opcode] [p1] [p2] [p3] [p4] 10 EF
Befehle:
RGB-Farbe: 7e 07 05 03 [R] [G] [B] 10 ef
Effektmodus: 7e 05 03 [effect_id] [speed] 10 ef
Power: 7e 04 04 [01=an / 00=aus] 00 10 ef
Helligkeit: 7e 04 01 [0-255] 00 10 ef
DFA: keiner (zustandslos — jeder Befehl sofort gültig)
Authentifizierung: keine
Verschlüsselung: keine
Vergleich der drei Geräte
| Gerät | Protokolltyp | DFA? | Verschlüsselung | Besonderheit |
|---|---|---|---|---|
| LED-Brille | GATT-Write (verschlüsselt) | Ja, 5-stufig | AES-128-ECB | Handshake mit Notifications |
| LED-Strip | GATT-Write (Klartext) | Nein | Keine | Opcode-basiertes Frameformat |
| Körperwaage | BLE-Advertisement | Nein | Keine | Keine Verbindung nötig |
Fehlende Authentifizierung bei allen drei Geräten
Bei der Protokollanalyse fällt auf: Kein einziges der drei Geräte implementiert eine Authentifizierung auf Applikationsebene. Wer die Protokollspezifikation kennt, kann sofort Befehle senden — ohne sich irgendwo anzumelden. Das ist das zentrale Sicherheitsproblem dieser Geräteklasse.
Zusammenfassung
- Protokoll-Rekonstruktion korreliert JADX-Code und PCAP-Mitschnitt, um Byte-Sequenzen Funktionen zuzuordnen
- Die GATT-Hierarchie (Services, Charakteristiken, Permissions) ist das strukturelle Gerüst des Protokolls
- Einfache Geräte wie der LED-Strip haben ein zustandsloses Opcode-Frame-Format; komplexere Geräte wie die LED-Brille haben einen DFA mit Handshake
- Geräte wie die Körperwaage nutzen ausschließlich Advertisements und erfordern keine aktive Verbindung
- Die Protokollspezifikation am Ende von Phase 4 ist die direkte Eingabe für Phase 5 (PoC-Entwicklung)
Phase-4-Checkliste
0/7Die LED-Brille sendet eine Notification mit dem Inhalt 'DATSOK' an dein Smartphone. Was bedeutet das für deinen Exploit-Code?