Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
AndroidAuto — Open-Source-Implementierung der Android-Auto-Telefonseite mit Reverse Engineering des Protokolls, gegenseitiger TLS-Authentifizierung, H.264-Videoprojektion, Injektion von Touch-Eingaben und Streaming von Sensordaten über USB AOA. | Kitploit
Tools/GitHubGitHub/mretallack/androidauto
Android-SicherheitBluetooth-SicherheitReverse EngineeringDrahtlose SicherheitMobile SicherheitPapers & ForschungLernen & Bildung
GitHubmretallack/androidauto

AndroidAuto

Open-Source-Implementierung der Android-Auto-Telefonseite mit Reverse Engineering des Protokolls, gegenseitiger TLS-Authentifizierung, H.264-Videoprojektion, Injektion von Touch-Eingaben und Streaming von Sensordaten über USB AOA.

Repository anzeigen
1128vor 4 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Open Android Auto

Eine Open-Source-Implementierung der telefonseitigen Android-Auto-App. Diese App läuft auf deinem Telefon und projiziert über USB auf die Headunit deines Autos. Sie ersetzt die proprietäre Google-APK com.google.android.projection.gearhead.

⚠️ IN ARBEIT

Dieses Projekt befindet sich in einem frühen Entwicklungsstadium. Der Protokoll-Handshake und die Videoprojektion funktionieren mit einer echten Headunit. Der Telefonbildschirm wird auf der Headunit des Autos für mehrere Sekunden erfolgreich angezeigt, bevor die Verbindung getrennt wird (die Videostabilität wird verbessert).

Funktionen

Protokoll & Verbindung

  • Erkennung und Verbindung des USB-AOA-Zubehörmodus
  • TLS-1.2-gegenseitige Authentifizierung (Telefon als Server)
  • Versionsaushandlung (Protokoll v1.7)
  • Diensterkennung (Anfrage/Antwort)
  • Kanalöffnung auf Zielkanälen (Video, Audio, Eingabe, Sensor)
  • Ping/Pong-Keepalive (bidirektional)
  • Verarbeitung von Audio-Fokus-Anfragen/-Antworten
  • Verarbeitung von Navigations-Fokus-Anfragen/-Antworten
  • Verarbeitung von Sprachsitzungs-Anfragen
  • Verarbeitung des kontrollierten Herunterfahrens
  • Prioritätswarteschlange für Schreibvorgänge (Steuernachrichten über Video)
  • Auf Audio-Fokus-Gewährung warten, bevor Audio gesendet wird (500 ms Timeout pro HUIG)
  • Bluetooth-Kopplungsaustausch (BluetoothPairingRequest/Response)
  • Mehrere USB-Wiederverbindungen ohne AOAP-Neuinitialisierung behandeln

Videoprojektion

  • H.264-Encoding über MediaCodec (800x480 @ 30fps, Baseline-Profil)
  • MediaProjection-Bildschirmaufnahme (mit Benutzerberechtigungsdialog)
  • Video-Kanaleinrichtung (SETUP → CONFIG → FOCUS → START-Ablauf)
  • Nullbasierte Zeitstempel in Mikrosekunden
  • SPS/PPS an Keyframes vorangestellt (Annex-B-Format)
  • Flusskontrolle (max_unacked-Verfolgung, Backpressure)
  • Frame-Taktung (konsistente 33-ms-Intervalle)
  • Stabiles langlaufendes Video (trennt derzeit nach ~7 Sekunden)
  • Auflösungsaushandlung anhand der Diensterkennung der Headunit
  • Adaptive Bitrate basierend auf der Verbindungsqualität

Touch-Eingabe

  • Eingabekanal öffnen und Bindungsanfrage
  • Parse von Touch-Ereignissen (Einzel- und Multi-Touch)
  • Parse von Tastenereignissen (Tasten, Medientasten)
  • Koordinatenzuordnung (Headunit → Telefonauflösung)
  • TouchInjector mit MotionEvent-Erstellung
  • Touch-Ereignisse in VirtualDisplay injizieren
  • Tastenereignisse in das Android-System injizieren

Audio

  • Audiokanal öffnen und einrichten
  • Auf Audio-Fokus-Gewährung warten, bevor Audio gesendet wird (500 ms Timeout pro HUIG)
  • Bei der ersten Verbindung AUDIO_FOCUS RELEASE senden, beim Abspielen dann GAIN
  • Telefon-Audioerfassung (MediaProjection AudioPlaybackCapture)
  • PCM/AAC-Encoding und Streaming an die Headunit
  • Mikrofon-Eingang von der Headunit (Sprachbefehle)
  • Mehrere Audiokanäle (Media, System, Sprache, Navigation)
  • Streaming von Stille, um den Kanal aktiv zu halten

Sensoren

  • Sensorkanal öffnen
  • Verarbeitung von Sensorstart-Anfragen/-Antworten
  • Parsen und Senden von Nachtmodus-Daten
  • Parsen und Senden von Fahrstatusdaten
  • GPS-Standortweiterleitung
  • Kompassrichtung
  • Fahrzeuggeschwindigkeit
  • Drehzahl
  • Kilometerzähler (Gesamt- + Tageskilometer)
  • Kraftstoffstand und Reichweite
  • Status der Feststellbremse
  • Getriebeposition (P/R/N/D/1-10)
  • OBD-II-Diagnose
  • Umgebung (Temperatur, Druck, Regen)
  • HVAC (Ziel-/aktuelle Temperatur)
  • Koppelnavigation

Video (zusätzlich)

  • Auflösungsaushandlung anhand der Diensterkennung der Headunit
  • Adaptive Bitrate basierend auf der Verbindungsqualität
  • Unterstützung für 720p-, 1080p-, 1440p- und 4K-Auflösungen
  • Hochformat-Auflösungen (720x1280, 1080x1920 usw.)
  • UI-Konfigurationsupdates (Design, Insets)

Sonstiges

  • Bluetooth-Kopplungskoordination (A2DP, HFP)
  • Turn-by-Turn-Navigation zum Kombiinstrument
  • Navigationsstatus (Manöver, Spuren, Entfernungen, aktuelle Position)
  • Medienstatus (Infos zum aktuell Wiedergegebenen)
  • Metadaten der Medienwiedergabe (Titel, Interpret, Album)
  • Medienbrowser (Medienbibliothek des Telefons von der Headunit aus durchsuchen)
  • Telefonstatus (Benachrichtigungen zum Anrufstatus)
  • Allgemeine Benachrichtigungen (Abonnieren/Abmelden-System)
  • Herstellererweiterungen
  • Kabelloses Android Auto (WiFi + Bluetooth-Übergabe)
  • Benachrichtigung über Kanalschließung
  • Anfrage/Antwort zu verbundenen Geräten des Autos
  • Anfrage/Antwort zum Benutzerwechsel
  • Benachrichtigung zum Batteriestatus
  • Verfügbarkeitsstatus für Anrufe

⚠️ HAFTUNGSAUSSCHLUSS

NUTZUNG AUF EIGENE GEFAHR. Diese Software wird „wie besehen" ohne jegliche Gewährleistung bereitgestellt.

  • Diese Software kann unerwartetes Verhalten mit der Headunit deines Autos verursachen
  • Diese Software kann dein Telefon oder die Headunit beschädigen — die Autoren übernehmen keine Haftung
  • NICHT WÄHREND DER FAHRT VERWENDEN
  • INTERAGIERE NICHT MIT DIESER ANWENDUNG, WÄHREND DU EIN FAHRZEUG FÜHRST
  • Diese Anwendung ist ausschließlich für Entwicklungs- und Testzwecke bestimmt
  • Halte immer an und stoppe dein Fahrzeug, bevor du mit einer Telefonanwendung interagierst
  • Die Autoren sind nicht verantwortlich für Unfälle, Verletzungen oder Schäden, die aus der Nutzung dieser Software resultieren

Architektur```

USB Plug-in → MainActivity → ProjectionService ↓ UsbAoaTransport (USB AOA accessory mode) ↓ MessageFramer (16KB frame fragmentation) ↓ InBandTls (TLSv1.2 via SSLEngine) ↓ ProtocolEngine (AAP state machine) ↓ ┌───────────┼───────────┐ Video Input Audio (H.264) (touch/keys) (PCM)

root@kitploit:~
## Bekannte Fehler

- **Kanalzuordnung setzt Reihenfolge voraus** – Wir weisen den ersten `av_channel` in der SERVICE_DISCOVERY_RESPONSE als Video und den zweiten als Audio zu. Das funktioniert mit dem Headunit (Kanal 1 = Video), scheitert aber bei openauto (Kanal 4 = Audio, nicht Video). Fix: Das Feld `stream_type` innerhalb von `av_channel` parsen, um `VIDEO(3)` von `AUDIO(1)` zu unterscheiden.
- **Videostabilität** – Verbindungsabbrüche nach längerem Streaming aufgrund eines USB-Pufferüberlaufs im Headunit. Siehe Testergebnisse unten.
- **Doppelte Geräteliste auf dem Headunit** – Die Smartphone-Seite des Headunits zeigt unsere App als zwei separate Einträge (einen für Android Auto, einen für Bluetooth), statt eines einzelnen Eintrags mit beiden Fähigkeiten. Ursache ist, dass Android 12+ den Zugriff auf die echte Bluetooth-MAC-Adresse blockiert (`02:00:00:00:00:00` wird zurückgegeben). Workaround: Die echte Adresse über `adb shell "echo $(adb shell settings get secure bluetooth_address) > /sdcard/Android/data/org.openandroidauto/files/bt_address.txt"` in eine Konfigurationsdatei schreiben. Es wird ein UI-Einstellungsbildschirm benötigt, damit der Benutzer seine BT-MAC manuell eingeben kann.
- **Sprachassistent-Taste nicht behandelt** – Wenn der Fahrer die Sprach-/Assistent-Taste auf dem Headunit drückt, empfangen wir eine VOICE_SESSION_REQUEST und versuchen, einen Sprachassistenten (Dicio oder Systemstandard) zu starten. Der gestartete Assistent empfängt jedoch noch kein Audio vom Mikrofon des Headunits.

### Testergebnisse zur Videostabilität

Testmuster (Farbbalken) bei 800x480, I-Frame-Intervall 1 Sekunde:

| FPS | Bitrate | Fragment | Dauer | Frames | Status |
|-----|---------|----------|----------|--------|--------|
| 30 | 2Mbps | Nein | ~3s | ~90 | ❌ Zu schnell |
| 15 | 2Mbps | Nein | ~33s | ~500 | ⚠️ Besser |
| 10 | 2Mbps | Nein | ~93s | ~930 | ⚠️ Gut |
| 30 | 2Mbps | Ja (2KB) | 5-25s | 150-750 | ⚠️ Variabel |
| 30 | 500Kbps | Ja (2KB) | ~54s | ~1691 | ⚠️ Besser |
| 15 | 250Kbps | Ja (2KB) | ~67s+ | 1000+ | ⚠️ Gut |
| 30 | 250Kbps | Ja (2KB), I=5s | ~20s | ~600 | ❌ Schlechter mit langem I-Frame |
| 15 | 250Kbps | Nein | ~13s | ~200 | ❌ Fragmentierung half hier |

Hauptursache: Der USB-Empfangspuffer des Headunits läuft bei dauerhaft hohem Datendurchsatz über. Niedrigere Datenrate = längere Verbindung.

**Beste bestätigte Konfiguration:** 10fps, 2Mbps, keine Fragmentierung = 93 Sekunden. Die Fragment-vor-Verschlüsselung-Implementierung ist defekt (das Headunit kann nicht reassemblen) – bedarf weiterer Untersuchung.

## Build```bash
./gradlew assembleDebug

Erfordert Android SDK mit Plattform 35.

Tests

Unit-Tests```bash

./gradlew testDebugUnitTest

root@kitploit:~
113 Unit- und Integrationstests, die Protokoll, Framing, TLS, Kanallogik, Video-Zustandsmaschine, Sensorverarbeitung und Touch-Eingabe abdecken.

### Integrationstests mit openauto (Docker)

openauto ist ein Drittanbieter-Head-Unit-Emulator, der das vollständige Android-Auto-Protokoll spricht. Wir verwenden ihn, um unsere Protokollimplementierung zu verifizieren, ohne ein echtes Auto zu benötigen.

#### Voraussetzungen

- Docker installiert und läuft
- Telefon per ADB verbunden (USB oder kabellos)
- App auf dem Telefon installiert: `./gradlew assembleDebug && adb install -r app/build/outputs/apk/debug/app-debug.apk`

#### 1. Das openauto-Docker-Image erstellen (einmalig)```bash
cd thirdparty/openauto
docker build -f Dockerfile.headless -t openauto-headless .

Dies erstellt openauto mit allen Abhängigkeiten (Qt5, boost, protobuf, OpenSSL) in einem Debian-Container. Dauert beim ersten Build etwa 5 Minuten.

2. openauto starten```bash

docker run --rm -p 5100:5000 -e QT_QPA_PLATFORM=offscreen
openauto-headless timeout 60 /src/build/bin/autoapp

root@kitploit:~
openauto lauscht auf Port 5000 im Container, der auf Port 5100 des Hosts gemappt ist. Es läuft im Headless-Modus (kein Display erforderlich).

#### 3. ADB-Reverse-Port-Weiterleitung einrichten```bash
adb reverse tcp:5000 tcp:5100

Dadurch wird der localhost:5000 des Telefons zum localhost:5100 (openauto) des Computers getunnelt. Unsere App verbindet sich als TCP-Client mit localhost:5000, wenn kein USB-Zubehör gefunden wird.

4. Starte die App```bash

adb shell am start -n org.openandroidauto/.MainActivity

root@kitploit:~
Die App wird:
1. Kein USB-Zubehör finden
2. Zu `localhost:5000` verbinden (openauto per adb reverse)
3. Den vollständigen Protokoll-Handshake durchführen (VERSION → TLS → AUTH → SERVICE_DISCOVERY)
4. Kanäle öffnen (video, audio, input, sensor)
5. Video-Streaming starten (Testbild)

#### 5. In openauto-Logs überprüfen

In der openauto-Ausgabe sollten Sie Folgendes sehen:```
[OpenAuto] handleNewClient() - Handle WIFI Client Connection
[OpenAuto] [AndroidAutoEntity] Send Version Request.
[OpenAuto] [AndroidAutoEntity] onVersionResponse()
[OpenAuto] [AndroidAutoEntity] Beginning SSL handshake.
[OpenAuto] [AndroidAutoEntity] Handshake completed.
[OpenAuto] [AndroidAutoEntity] onServiceDiscoveryRequest()
[OpenAuto] [AndroidAutoEntity] onAudioFocusRequest()
[OpenAuto] [AudioMediaSinkService] onChannelOpenRequest()
[OpenAuto] [VideoMediaSinkService] onChannelOpenRequest() (if video focus granted)

6. App-Logs abrufen```bash

adb pull /sdcard/Android/data/org.openandroidauto/files/aa_log.txt cat aa_log.txt

root@kitploit:~
Die Protokolldatei bleibt auf dem Telefon zwischen USB-Wechseln erhalten (nützlich beim Testen mit einem echten Autoradio).

#### Schneller Einzeiler-Test```bash
# Assumes openauto image already built and app installed
docker run --rm -p 5100:5000 -e QT_QPA_PLATFORM=offscreen openauto-headless timeout 20 /src/build/bin/autoapp &
sleep 3 && adb reverse tcp:5000 tcp:5100 && adb shell am start -n org.openandroidauto/.MainActivity

Hinweise

  • openauto verwendet Protokoll v1.6; unsere App antwortet mit v1.7 (beide werden akzeptiert)
  • openauto protokolliert Message Id Not Handled: 4 für AUTH_COMPLETE — das ist eine bekannte openauto-Eigenheit, kein Fehler
  • Die Verbindung sollte auf unbestimmte Zeit stabil bleiben (kein Timeout/kein Verbindungsabbruch)
  • Video wird nicht angezeigt (Headless-Modus), aber der Protokollaustausch ist vollständig validiert

Protokoll-Referenzen

  • uglyoldbob/android-auto (Rust, LGPL-3.0) — Protokollimplementierung mit Protobuf-Definitionen
  • opencardev/aasdk (C++, GPL-3.0) — aktualisierte Protokollbibliothek mit vollständigen Protobuf-Definitionen
  • opencardev/openauto (C++, GPL-3.0) — Head-Unit-Emulator (Crankshaft-NG)
  • tomasz-grobelny/AACS (C++, GPL-3.0) — telefonseitige AA-Implementierung für ODROID
  • headunit-revived (Kotlin, AGPL-3.0) — Implementierung auf Seiten der Head-Unit
  • f1xpl/aasdk (C++, GPL-3.0) — ursprüngliche Protokollbibliothek
  • GAL protocol research — Protokollnotizen, Wireshark-Dissector und zwischengespeicherter Head-Unit-Integrationsleitfaden

Entwicklung der Protobuf-Definitionen

Das Android-Auto-Protokoll wurde in mehreren Projekten per Reverse Engineering untersucht. Jedes baute auf dem vorherigen auf:

Was opencardev/aasdk gegenüber AACS zusätzlich bietet:

  • Radiodienst (AM/FM/HD/DAB-Abstimmung, Senderlisten, RDS, Verkehr)
  • Navigationsstatus (vollständige Abbiegehinweise: Manöver, Fahrspuren, Entfernungen, Hinweise)
  • Telefonstatus (Anrufstatus-Benachrichtigungen)
  • Medienbrowser (Mediathek des Telefons von der Head-Unit aus durchsuchen)
  • Wiedergabestatus (Metadaten zu aktuell laufender Wiedergabe)
  • Allgemeine Benachrichtigungen (Abonnement-/Abbestellsystem)
  • WLAN-Projektion (drahtlose AA-Anmeldedaten und Konfiguration des Zugangspunkts)
  • GAL-Verifizierung (Testen/Debuggen von Google Automotive Link)
  • Instrumentencluster (Eingabe für Sekundärdisplay)
  • UI-Konfiguration (Tag-/Nachtthema, Einfügungen, Anzeigekonfiguration)
  • Batteriestatus, Benutzerwechsel, Mautkarte, EV-Steckertypen
  • Dienstermittlungs-Update (dynamische Kanaländerungen)
  • Erweiterte Videoauflösungen (1440p, Hochformatvarianten)
  • Erweiterte Steuernachrichten (26 Typen gegenüber 13)

Wichtige strukturelle Unterschiede:

  • AACS verwendet priority + channel_id in ChannelOpenRequest; aasdk verwendet priority (sint32) + service_id
  • AACS ServiceDiscoveryResponse ist nur eine Kanalliste; aasdk fügt HeadUnitInfo, DriverPosition, PingConfiguration, ConnectionConfiguration hinzu
  • aasdk trennt Medien in Senke (Head-Unit empfängt) und Quelle (Head-Unit sendet) mit unterschiedlichen Nachrichten-IDs

Das Verzeichnis thirdparty/aasdk/protobuf/ ist die maßgebliche Protokollreferenz für dieses Projekt.

TLS-Authentifizierung

Android Auto verwendet gegenseitiges TLS. Das Telefon fungiert als TLS-Server und muss ein Zertifikat vorweisen, das von der Google Automotive Link CA signiert ist (fest in der Firmware der Head-Unit eingebettet). Ohne den korrekten privaten Schlüssel lehnt die Head-Unit die Verbindung mit AUTH_COMPLETE status=-3 ab.

Zertifikatskette

Das Telefon präsentiert eine Kette aus 2 Zertifikaten:

  1. CarService-Zertifikat — O=CarService, signiert von der Google Automotive Link CA
  2. Google Automotive Link CA — selbstsignierte Root, O=Google Automotive Link (gültig 2014-2044)

Wie die Authentifizierung funktioniert

  1. Die Head-Unit hat den öffentlichen Schlüssel der Google Automotive Link CA in ihrer Firmware fest eingebettet und vertraut ihm.
  2. Während TLS präsentiert das Telefon das CarService-Zertifikat (das von dieser CA signiert ist).
  3. Das Telefon weist das Eigentum am Zertifikat nach, indem es den TLS-Handshake mit dem entsprechenden privaten Schlüssel signiert.
  4. Die Head-Unit prüft, dass die Signatur zum öffentlichen Schlüssel des Zertifikats passt und dass das Zertifikat bis zur vertrauenswürdigen CA zurückverfolgt werden kann.

Zertifikatsrotation (Theorie — unbestätigt)

Google scheint das in der Android-Auto-APK eingebettete Zertifikat und den Schlüssel ungefähr alle 8 Monate zu rotieren (passend zur Gültigkeitsdauer des Zertifikats). Dies könnte eine bewusste Maßnahme sein, um den Nutzen extrahierter Schlüssel zu begrenzen — wenn eine Head-Unit das Ablaufdatum des Zertifikats prüft, würde ein alter extrahierter Schlüssel nicht mehr funktionieren. Benutzer der offiziellen App erhalten über App-Updates frische Zertifikate. Wenn diese Theorie korrekt ist, könnte ein Benutzer, der die offizielle App nie aktualisiert, schließlich von Head-Units abgelehnt werden, die den Ablauf erzwingen. Nicht alle Head-Units prüfen möglicherweise den Ablauf — dieses Verhalten ist modellabhängig.

Beschaffung des privaten Schlüssels

Der private Schlüssel ist in der Android-Auto-APK mit AES-256-CBC verschlüsselt. Die Head-Unit validiert das Zertifikat des Telefons gegen die Google Automotive Link CA — jedes von dieser CA signierte Zertifikat wird akzeptiert.

Weg A: Entschlüsselung aus der APK

Der Schlüssel ist (verschlüsselt) in der Android-Auto-APK eingebettet und kann mit dem eigenen Algorithmus der APK entschlüsselt werden. Dafür ist ein beliebiges Android-Gerät mit ADB-Zugriff erforderlich (kein Root, keine Google Play Dienste nötig), um die Entschlüsselung auszuführen, da der Base64-Decoder von Android sich anders verhält als die Desktop-JVM.

Voraussetzungen:

  • Die Android-Auto-APK (mit adb pull von einem Telefon ziehen oder von APKPure/APKMirror herunterladen)
  • Ein beliebiges Android-Gerät mit ADB-Zugriff zum Ausführen der Entschlüsselung (kein Root, keine Google Play Dienste nötig)
  • Android SDK (d8-Buildtool, adb)

Vorgang:

  1. AA-APK von einem Telefon ziehen: adb pull $(adb shell pm path com.google.android.projection.gearhead | grep base | cut -d: -f2) aa.apk
  2. Mit JADX dekompilieren, um die Zertifikatsanbieter-Klasse zu finden
  3. Die Binärdaten extrahieren (256-Byte-KDF-Salt + ~1712-Byte-verschlüsselter Schlüssel + Zertifikats-PEMs)
  4. Die Java-Entschlüsselungsklasse zu DEX kompilieren und mit dalvikvm auf dem Gerät ausführen

Die Zertifikatsanbieter-Klasse finden (Schritt 2):

Die Klassennamen sind verschleiert und ändern sich zwischen APK-Versionen, aber die Struktur ist immer gleich. Suche in JADX nach "-----BEGIN CERTIFICATE-----" — du findest eine kleine Klasse, die ein Interface mit drei Methoden implementiert:

  • a() → gibt einen String zurück (das CarService-Zertifikat als PEM)
  • b() → gibt ein byte[] zurück (~1712 Bytes — der AES-verschlüsselte private Schlüssel)
  • c() → gibt ein byte[] zurück (256 Bytes — das KDF-Salt)

Bekannte Klassennamen nach Version:

Die Entschlüsselungsfunktion befindet sich in einer benachbarten Klasse — suche nach "AES/CBC/PKCS5Padding", um sie zu finden. Sie nimmt das Zertifikatsanbieter-Interface als Parameter entgegen.

Hinweis: Der Entschlüsselungsschritt (Schritt 4) benötigt nur dalvikvm — jedes Android-Gerät mit ADB funktioniert, kein Root oder Google Play Dienste erforderlich. Die GApps-Anforderung gilt nur für Schritt 1 (Ziehen der APK, da die AA-App über den Play Store vertrieben wird).

Hinweis: Du modifizierst oder führst den dekompilierten APK-Code nicht aus. Stattdessen schreibst du eine eigenständige Decrypt.java-Klasse, die die Entschlüsselungslogik neu implementiert, die extrahierten Byte-Arrays aus Dateien liest und einen eigenen main()-Einstiegspunkt hat. Der dekompilierte Quellcode wird nur als Referenz verwendet, um den Algorithmus zu verstehen und die Byte-Arrays zu kopieren. Siehe tools/decrypt_key_from_apk.md für den vollständigen Decrypt.java-Quellcode.

Kritischer JADX-Fehler: JADX dekompiliert den KDF-Helfer als byte b = bArr2[i2] & 255;, aber es muss int b = bArr2[i2] & 255; sein. Der Typ byte schneidet auf vorzeichenbehaftet zurück und erzeugt Müllausgabe. Ändere das zu int und die Entschlüsselung funktioniert.

Die KDF-Funktion (tweakBytes/ap):```java static void tweakBytes(byte[] bArr, byte[] bArr2, byte[] bArr3) { for (int i = 0; i < bArr.length; i++) { for (int i2 = 0; i2 < 48; i2++) { int b = bArr2[i2] & 255; // MUST be int, not byte bArr2[i2] = (byte) (((((b >> 7) | (b + b)) + 33) ^ bArr3[i2 % bArr3.length]) ^ bArr[i]); } } }

root@kitploit:~
Nach der AES-Entschlüsselung extrahiert die Funktion `T()` den Schlüssel:
- Überspringe die ersten 28 Bytes, entferne die letzten 26 Bytes
- Den mittleren Teil per Base64 dekodieren (URL_SAFE, flag=2)
- Das Ergebnis ist ein PKCS#8-DER-codierter privater RSA-Schlüssel

**Hinweis:** Muss auf Android ausgeführt werden (nicht auf der Desktop-JVM), da sich `android.util.Base64` und `java.util.Base64` unterscheiden. Der `Base64.getUrlDecoder()` der Desktop-JVM lehnt Standard-Base64-Zeichen (`+`, `/`) und Zeilenumbrüche ab, die der Android-Decoder akzeptiert. Verwende auf dem Desktop `Base64.getMimeDecoder()` oder führe die Entschlüsselung auf dem Gerät mit `dalvikvm` aus:```bash
# Compile to DEX and run on any Android device with ADB access
javac Decrypt.java -d out
d8 out/Decrypt.class --output dex_out
adb push dex_out/classes.dex /data/local/tmp/decrypt.dex
adb shell "dalvikvm -cp /data/local/tmp/decrypt.dex Decrypt"

This outputs the PKCS#8 private key in base64. Wrap it in PEM headers and place at app/src/main/assets/carservice_key.pem.

See tools/decrypt_key_from_apk.md for the full step-by-step guide.

Path B: Ein zuvor extrahiertes Zertifikat+Schlüssel verwenden

Da einige Head-Units das Ablaufdatum des Zertifikats möglicherweise nicht prüfen, kann ein zuvor extrahiertes Zertifikat+Schlüssel-Paar (auch wenn es abgelaufen ist) weiterhin funktionieren. Quellen:

  1. Kontaktieren Sie den Autor von opengal_proxy — E-Mail [email protected] (siehe gamelaster/opengal_proxy)
  2. Extraktion von einem gerooteten Telefon mit GApps — verwenden Sie Frida, um KeyFactory.generatePrivate() zu hooken (erfordert sowohl Root als auch Google Play Services auf demselben Gerät): ```bash frida -U -n "com.google.android.projection.gearhead" -l tools/dump_key_frida.js
    root@kitploit:~
  3. Community – siehe AACS#15 für Diskussion

Sobald du sie erhalten hast, lege das Zertifikat und den Schlüssel unter app/src/main/assets/carservice_key.pem ab.

Siehe tools/dump_key.sh und tools/dump_key_frida.js für Skripte zur Laufzeit-Extraktion.

Lizenz

Dieses Projekt ist unter der GNU General Public License v3.0 lizenziert.

Dieses Projekt enthält Protocol-Buffer-Definitionen von aasdk (GPLv3, Copyright © 2018 f1x.studio / Michal Szwaj) als Git-Submodul.

Tool herunterladen
  • Passagieranwesenheit
  • Türstatus (Motorhaube, Kofferraum, einzelne Türen)
  • Lichtstatus (Scheinwerfer, Blinker, Warnblinker)
  • Reifendruck
  • Beschleunigungssensor (3-Achsen)
  • Gyroskop (3-Achsen)
  • GPS-Satellitendaten
  • Proaktiv auf Sensoranfragen der Headunit antworten
  • Diensterkennungsupdate (dynamische Kanaländerungen)
  • Eingabe-Feedback (haptisches/visuelles Feedback an die Headunit)
  • Mikrofon-Anfrage/-Antwort (Spracheingabe von der Headunit)
  • Audio-Underflow-Benachrichtigung
  • Radiodienst (AM/FM/HD/DAB-Abstimmung, Senderspeicher, RDS)
  • ProjektJahrProto-DateienRolle
    f1xpl/aasdk20181 monolithisch (Wifi.proto)Ursprüngliches RE — Kernprotokoll, Video, Audio, Eingabe, Sensoren
    AACS202028 (nach Nachricht aufgeteilt)Telefonseitige Implementierung — minimale Abdeckung für Videoprojektion
    opencardev/aasdk2024254 (hierarchisch nach Dienst)Definitive Referenz — vollständiges Protokoll mit allen Diensten
    APK-VersionZertifikatsanbieter-KlasseSalt+Schlüssel-KlasseEntschlüsselungsklasse
    v6.4SslWrapper (Felder o, p)dieselbe KlasseSslWrapper.m23915f()
    v16.8ivo / rqiivq / rql (Felder b, c)ivq.d()