All checks were successful
CI-Build/Kettenoeler/pipeline/head This commit looks good
91 lines
4.3 KiB
Markdown
91 lines
4.3 KiB
Markdown
# HOW-TO_REVERSE – Praxisleitfaden fürs CAN-Reverse-Engineering
|
||
|
||
Dieses How-To ist dein Werkzeugkasten, um aus nackten Frames echte Signale zu destillieren. Es ist kein Orakel, sondern ein **Experimentier-Protokoll**: miss, verifiziere, falsifiziere. Nutze es zusammen mit der GUI/CLI (Splitter, Explorer, Batch-Analyzer, Range-/Unsupervised-Fit).
|
||
|
||
---
|
||
|
||
## 0) Vorbereitungen (Daten sammeln wie ein Ingenieur)
|
||
- **Zustände trennen**: *Zündung an*, *Motor aus*, *Motor an Leerlauf*, *Schieben*, *aufgebockt Hinterrad drehen*, *kurze Fahrt*.
|
||
- **Aktoren toggeln**: Blinker, Bremse, Licht, Lüfter → generiere Ground-Truth für Bits/Flags.
|
||
- **Nur RX** analysieren, wenn deine Hardware parallel TX sendet (Störmuster vermeiden).
|
||
|
||
---
|
||
|
||
## 1) Frame- & ID-Ebene zuerst
|
||
- **Repetition Rate (Hz)**: Zyklische Sensor-IDs senden stabil.
|
||
- *Daumenwerte*: WheelSpeed 20–100 Hz, RPM 10–50 Hz, TPS/APS 20–100 Hz, Lenkwinkel 50–100 Hz, Temperaturen 1–10 Hz.
|
||
- **Jitter** der Periodizität: Streuung der Inter-Arrival-Times. Niedrig = sauberer Zyklus.
|
||
- **DLC-Stabilität**: schwankende Payload-Länge → ggf. ISO-TP / Multiplex.
|
||
- **Change-Density**: Anteil Frames mit Payload-Änderung. Zu hoch → Counter/Checksumme, zu niedrig → Status/Träge.
|
||
|
||
---
|
||
|
||
## 2) Byte/Bit-Signaturen
|
||
- **Bit-Flip-Rate** pro Bit: ~50% → Flag/Event; sehr regelmäßig → Pattern/Timer.
|
||
- **Rolling Counter**: 4/8-bit Sequenzen (0..15/255), oft konstant steigend.
|
||
- **Checksumme**: Byte hängt deterministisch von anderen Bytes ab; häufig letzte Position.
|
||
- **Endianness**: 16-bit LE/BE testen. Monotone Trends/kleine Deltas weisen auf richtige Byteordnung.
|
||
- **Quantisierung**: typische Schrittweiten (z. B. 0.5 °C, 0.25 km/h).
|
||
|
||
---
|
||
|
||
## 3) Physik als Filter (Slew-Rate & Grenzen)
|
||
Miss **ΔWert/Δt** robust (95-Perzentil, nicht Max):
|
||
- **Temperaturen**: sehr träge → ΔT/s ≪ 1 °C/s.
|
||
- **Fahrgeschwindigkeit**: 0→100 km/h < 1 s unrealistisch; grob ≤ 30–50 km/h/s (Straße).
|
||
- **RPM**: schnelle Sprünge möglich, aber nicht teleport. 1k→8k in 1–3 s plausibel.
|
||
- **Lenkwinkel**: schnell, aber begrenzt; **Jerk** (ΔΔ/Δt) nicht absurd.
|
||
|
||
Alles, was diese Checks bricht, ist selten dein gesuchtes physikalisches Signal (oder deine Skalierung ist falsch).
|
||
|
||
---
|
||
|
||
## 4) Korrelation & Kausalität
|
||
- **Cross-Korrelation**: RPM ↔ WheelSpeed (Gang drin), Brake-Bit ↔ Pressure, Blinker-Bit ↔ Blinkfrequenz (~1–2 Hz).
|
||
- **Gang** aus Ratio (RPM/Speed) ableiten und Kandidaten validieren.
|
||
- **Event-Marker** setzen und zeitgleichen Byte-Kipp suchen.
|
||
|
||
---
|
||
|
||
## 5) Protokoll & Multiplex
|
||
- **ISO-TP**: Muster `0x10 len …` (First Frame), `0x21…` (Consecutive). Enthält selten einzelne Sensorkanäle.
|
||
- **Multiplexer**: Ein Byte schaltet die „Seite“ der Payload um. Erkennbar am Sprungverhalten.
|
||
|
||
---
|
||
|
||
## 6) Statistik-Fingerabdrücke
|
||
- **Unique-Ratio** = |unique|/n. Zu klein → Flag/Konstante; moderat → analog.
|
||
- **Entropy** pro Byte → Daten/Checksumme vs. Status.
|
||
- **Plateaus/Hysterese**: aktualisiert nur bei Δ≥Schwelle.
|
||
|
||
---
|
||
|
||
## 7) Scale/Offset systematisch schätzen
|
||
- **Scale-Raster**: Dekaden + praxisnahe Werte (0.0625, 0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10 …).
|
||
- **Offset** via **Intervall-Überdeckung**: wähle das Offset, das die meisten Samples in [rmin, rmax] bringt.
|
||
- **Vorzeichen prüfen**: signed/unsigned, ggf. negative Scales zulassen.
|
||
|
||
---
|
||
|
||
## 8) Workflow-Cookbook
|
||
1. **Splitten** (Logs → Traces).
|
||
2. **ID-Explorer/Batch**: Periodizität, Change-Density, 8/16-bit Plots.
|
||
3. **Range-Fit** mit physikalischen Ranges *und* **Slew-Limits** (Δ/Δt) + **Rate/Jitter-Constraints**.
|
||
4. **Cross-Checks**: Kandidaten gegen andere Kanäle testen (RPM↔Speed, Brake↔Pressure).
|
||
5. **Iterieren**: Range/Constraints verfeinern, Plots sichten, Hypothesen anpassen.
|
||
|
||
---
|
||
|
||
## 9) Typische Fallen
|
||
- Falsche Endianness → Teleports.
|
||
- Counter/Checksumme im selben 16-bit-Wort → zuerst trennen.
|
||
- DLC<8 → 16-bit-Kombis fehlen; keine Dummies einstreuen.
|
||
- ×10/×100-Skalierung: Δ/Δt wirkt absurd groß.
|
||
- BCD/ASCII in Diag/Odometer – nicht physikalisch.
|
||
|
||
---
|
||
|
||
## 10) Ziel: Berichte statt Bauchgefühl
|
||
Automatisiere Tests & Schwellen. Lass Skripts einen **Analysebericht** schreiben: „PASS (smooth, low jitter, rate ok)“ vs. „FAIL (jitter, slope99 zu hoch, hit-ratio zu klein)“.
|
||
Das minimiert Confirmation Bias – und macht Ergebnisse reproduzierbar.
|