From f21df415066a602327a83c972be7032b10c29e63 Mon Sep 17 00:00:00 2001 From: Seb3thehacker Date: Thu, 1 Oct 2026 20:37:04 -0700 Subject: [PATCH] audi 32 to 64 bit fix --- .../main/java/app/seb3thehacker/gearslip/GearslipRunner.kt | 6 ++++-- .../src/main/java/app/seb3thehacker/gearslip/Protobuf.kt | 7 +++++-- .../main/java/app/seb3thehacker/gearslip/host/KnownApps.kt | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/GearslipRunner.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/GearslipRunner.kt index f3d7f8e..6c27449 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/GearslipRunner.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/GearslipRunner.kt @@ -800,9 +800,11 @@ class GearslipRunner( } private fun onPingRequest(body: ByteArray) { - val timestamp = Protobuf.readInt32Field(body, 1)?.toLong() ?: System.nanoTime() + // The timestamp is an int64 and has to come back unchanged. Read as an int32 it was cut + // short, and a car that checks the echo (an Audi MIB2+) gave up at its second ping. + val timestamp = Protobuf.readInt64Field(body, 1) ?: System.nanoTime() send(MSG_PING_RESPONSE, Protobuf.varintField(1, timestamp), encrypted = tls.handshakeComplete) - log.i("<- PingRequest / -> PingResponse (keeping the session alive)") + log.i("<- PingRequest(timestamp=$timestamp) / -> PingResponse (keeping the session alive)") } private fun send( diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/Protobuf.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/Protobuf.kt index 48af4fe..e253147 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/Protobuf.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/Protobuf.kt @@ -35,7 +35,10 @@ object Protobuf { varint((field shl 3).toLong()) + varint(value) /** Reads the single int32 in AuthResponse. Negative values are 10-byte varints. */ - fun readInt32Field(data: ByteArray, field: Int): Int? { + fun readInt32Field(data: ByteArray, field: Int): Int? = readInt64Field(data, field)?.toInt() + + /** Reads a varint field whole, for int64s such as a ping's timestamp. */ + fun readInt64Field(data: ByteArray, field: Int): Long? { var pos = 0 while (pos < data.size) { val (tag, afterTag) = readVarint(data, pos) ?: return null @@ -45,7 +48,7 @@ object Protobuf { 0 -> { val (value, afterValue) = readVarint(data, pos) ?: return null pos = afterValue - if (number == field) return value.toInt() + if (number == field) return value } 2 -> { val (len, afterLen) = readVarint(data, pos) ?: return null diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/host/KnownApps.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/host/KnownApps.kt index 2693da0..7d2723e 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/host/KnownApps.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/host/KnownApps.kt @@ -51,6 +51,7 @@ object KnownApps { private val hidden = setOf( "com.google.android.dialer", // Google Phone "com.google.android.googlequicksearchbox", // Google Assistant driving surfaces + "com.google.android.apps.maps", // Google Maps: shows as a messenger, and its car UI is Android Auto's own ) fun isHidden(packageName: String): Boolean = packageName in hidden