winstar
Goto Top

Reverse Engineering: (Android .dex) und HTTP API-Signatur

Guten Tag Leute.
Ich hoffe, mir kann hier jemand weiter helfen. Ich bin leider mit meinen Möglichkeiten so gut wie am Ende.
Bitte lasst mich vorab gesagt haben, dass ich keine illegalen Zwecke verfolge!

Folgendes Problem/Vorgeschichte:
Ich habe ein 7" Android-System in meinem Auto installiert. Dieses kommuniziert über die MCU mit der Canbus-Box (Simple Soft) und diese wiederum mit dem Fahrzeug-CAN. Die Informationen von z.B. offenen Türen, Klima- und Lichtsteuerung, Außentemperatur) werden mir ohne weiteres mitgeteilt. Probleme gibt es allerdings mit dem Radio-Bedienteil (Tastenfeld). Dieses erkennt nach einer Umprogrammierung der MCU die Tasten nicht mehr richtig, sie werden falsch zugewiesen (z.B. aus "Zurück" wird "Stumm/Mute") oder beim Anlernen der Tasten werden vorhandene Einstellungen überschrieben ("CONFIG" soll die Android-Einstellungen aufrufen, "TONE" den Equalizer; wird "CONFIG" angelernt, wird z.B. "TONE" überschrieben.)

Das Problem ist erst aufgetreten, nachdem die MCU ab Werk der Chinesen neu auf mein Fahrzeugmodell abgestimmt wurde, welches ich (dummerweise) selbst durchgeführt habe. Die Programmierung erfolgt durch die Android-App "Car Choose", welche die entsprechende MCU, APK (für Klima etc.) und Logo von einem chinesischen Server bezieht.

Mein Vorhaben:
Ich möchte unbedingt wieder auf die Werks-MCU der Chinesen (Auslieferungszustand) zurück setzen. Leider habe ich davon weder einen Screenshot noch weitere Informationen. Der russische Händler (und dessen Techniker) können mir scheinbar keinen richtigen Support anbieten. Ich habe sämtliche Foren durchkämmt (u.a. 4PDA, RedMOD, XDA) und bin bis jetzt auf keine Lösung gestoßen.

Mein Fortschritt:
Nun, da sich die Werks-MCU nicht so leicht beziehen lässt, habe ich mit IDA die Car Choose Anwendung auseinander genommen und versuche seitdem zu verstehen, welche Bedeutung folgende Signatur ("sig":"") im http-body hat. Dank Proxymon konnte ich die http-Anfragen aufzeichnen. Was ich bis jetzt feststellen konnte, dass diese Signatur scheinbar keinen Datum/Zeitstempel besitzt. Die folgende Anfrage lässt sich zu jeder Zeit aufrufen.
http://api.mcu.cardoor.cn/move/mcu/queryRelationConfig
POST /move/mcu/queryRelationConfig HTTP/1.1
Host: api.mcu.cardoor.cn
Content-Type: application/json
Charset: UTF-8
Content-Length: 168
User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; Octa - TS9 Build/OPM2.171019.012)
Connection: Keep-Alive
Accept-Encoding: gzip

{"appid":"dfsgherthdfghkj6o78tdftyw4uyrtyj","id":"11","language":"de-DE","level":"1","ratio":"0","remark":"2","resourcesId":"","sig":"af3a3dcc6107fb5ad137ec5823cc7176"}  

Hat jemand eine Idee, welchen Algorythmus diese Signatur besitzt und wie sie sich zusammen setzen könnte? Sie scheint wie erwähnt unabhängig von Datum und Uhrzeit von der Car Choose App generiert worden zu sein. Leider sind meine Möglichkeiten in IDA begrenzt und ich finde dazu keine näheren Informationen.

Content-Key: 3348846875

Url: https://administrator.de/contentid/3348846875

Printed on: April 25, 2024 at 11:04 o'clock

Member: Mystery-at-min
Mystery-at-min Jul 15, 2022 at 15:40:32 (UTC)
Goto Top
Endlich mal was spannendes.

Fragen vorab:
Was für ein Fahrzeug, BJ, Ausstattung
Was für eine MCU, Name, Hersteller, ggf. weitere dienliche Informationen
Bezugsort?
Was für ein Androidsystem, ggf Schnittstellen - einfach, vollständiges Bild.
Member: Winstar
Winstar Jul 15, 2022 updated at 16:32:43 (UTC)
Goto Top
Es handelt sich hier um einen Opel Astra J OPC, Baujahr 2012 mit serienmäßigem Navi 600 (das Navi 600-Bedienteil wurde durch das CD600-Bedienteil getauscht; nur die CD300/CD400 und CD600-Bedienteile sind mit der Canbus-Box kompatibel).

Link zum Händler des Systems:
KR-7051-S9

Aktuelle MCU (mit besagten Tastenproblemen):

screenshot_20220425-150802
screenshot_20220615-193930

Android-System:

screenshot_20220425-150728

Weitere Links aus meiner Cloud:

CD600 - Bedienteil & Steckerbelegung

CD600 - MCU-CAN-Fehler

CD600 - falsch zugeordnete Tasten

CD600 - Zuordnung schlägt fehl
Member: Mystery-at-min
Mystery-at-min Jul 15, 2022 updated at 16:27:30 (UTC)
Goto Top
Konkret würde mir da erstmal auffallen - Differenz zwischen 2012 und 2015, gab es da ggf. dazwischen einen Wechsel des Moduls?

Generell ist auch die Frage, wie wird die MCU angesprochen. Ich weiss es noch von meinem 2015er Mazda, da war am Anfang das Tweaken sehr easy und wurde immer mehr blockiert. GGf. ist das derselbe Effekt?

Hast du vielleicht einen Opeltechniker zu Hand, der da mal mit der Diagnose rangeht? ggf reichen auch Dinge wie OBD Analysen, die für schmales Geld machbar sind.
Member: C.R.S.
C.R.S. Jul 15, 2022 at 16:39:33 (UTC)
Goto Top
Hallo,

HMAC-MD5 finde ich naheliegend.

Grüße
Richard
Member: Winstar
Winstar Jul 15, 2022 at 16:47:48 (UTC)
Goto Top
Soweit mir bekannt, gibt oder gab es mehrere dieser Module - leider habe ich bis jetzt keine Info darüber gefunden, ab wann und bis zu welchem Baujahr diese verbaut wurden.

Wenn ich mich nicht täusche, müsste die MCU über die serielle Schnittstelle angesprochen werden. Leider habe ich auch hierzu keine weiteren Informationen, außer, dass dieser Mikrocontroller im System integriert ist und nur eine geringe Anzahl an Schreibzyklen besitzt.

OBD wurde schon mehrfach ausgelesen (kann ich auch selbst) und es wurde nichts gefunden.
Merkwürdig ist halt, dass am Anfang das Bedienteil korrekt funktionierte und sich die Tasten programmieren lassen haben. Wie erwähnt, erst nach dem manuellen Flashen auf die 2015er Version traten die Probleme auf.

In einer weiteren Untersuchung konnte ich außerdem feststellen, dass die Chinesen die Systeme standardmäßig mit der MCU "通用机" ausliefern, was wörtlich so viel heißt wie "Universalmaschine". Ich bin mir ziemlich sicher, dass ich genau diese MCU hatte. Hier mal ein Bild anhand eines T3L-Systems:

1
Member: Winstar
Winstar Jul 15, 2022 at 16:50:22 (UTC)
Goto Top
Zitat von @c.r.s.:

Hallo,

HMAC-MD5 finde ich naheliegend.

Grüße
Richard
Gibt es eine Möglichkeit herauszufinden, wie sich diese Signatur zusammen setzen könnte?
Member: C.R.S.
C.R.S. Jul 15, 2022 at 20:10:03 (UTC)
Goto Top
Zitat von @Winstar:

Gibt es eine Möglichkeit herauszufinden, wie sich diese Signatur zusammen setzen könnte?

Aus den signierten Daten und dem Schlüssel, also nur durch Analyse der Anwendung zu bestimmen. Wenn man HMAC vermutet, kann man ja danach suchen. Oder die signierten Daten verfolgen.
Member: Winstar
Winstar Jul 16, 2022 at 05:10:20 (UTC)
Goto Top
Genau das ist der Punkt. Darüber finde ich in IDA kaum Informationen und keine Hilfe, mir fehlen da leider die Kenntnisse. Demnach müsste der Secret Key doch auch in der Anwendung versteckt sein. Vielleicht kann sich das jemand mal anschauen?
Member: colinardo
colinardo Jul 16, 2022 updated at 07:13:50 (UTC)
Goto Top
Servus.
Kannst du die APK der Anwendung mal als Link bereitstellen, evt. auch per PN? Dann schau ich da mal drüber.

Grüße Uwe
Member: Winstar
Winstar Jul 16, 2022 at 07:26:13 (UTC)
Goto Top
Natürlich. Bitteschön: com.tw.carchoose_3f18_00_220407.apk
Member: colinardo
colinardo Jul 16, 2022 updated at 14:19:46 (UTC)
Goto Top
Also,
das was hinter "sig:" steht ist ein einfacher MD5 Hash, also nichts mit "Secret Key" face-smile.
Als erstes wird ein TreeMap-Objekt erstellt, das aus sich aus den folgenden Bestandteilen zusammensetzt
file: <output-path>
mcu_version : <mcu_version>
sys_version: <sys_version>
Diese wird dann an die Funktion com/tw/carchoose/upgrade/utils/NetworkUtils;->getSig übergeben. Die Funktion wandelt das TreeMap Objekt dann mit einem while loop in ein Stringbuilder-Objekt (Objekt um Strings effizient zusammenzusetzen) um, bei dem die Values aneinander gehangen werden und am Ende das ganze als ein langer String zurückgegeben wird.
Das Ergebnis der Funktion wird seinerseits an ein StringBuilder Objekt angehängt zusammen mit einer Konstanten "dfsgherthdfghkj5j6o78tdftyw4uyr". Dieses StringBuilder-Objekt wird dann zu einem String umgewandelt und daraus wird dann der finale MD5 Hash erstellt der in der property "sig" im JSON-String des POST Requests landet.

Diese Prozeduren finden hauptsächlich in den Klassen com/tw/mcudebug/MCUService/MCUService und com/tw/carchoose/upgrade/utils/NetworkUtils statt.

Updatefiles werden dann so wie ich das auf den ersten Blick sehe unter der Base-URL
http://update.cardoor.cn/terminal/software/update/car/android/
in der jeweilig angeforderten Version heruntergeladen.

Vielleicht hilft dir das bei dem Kram aus der Bucht weiter face-smile.

Falls du das Disassembly der App brauchst (ressources und SMALI Files), kurz Bescheid geben dann schick ich dir einen Link zum ZIP.

Grüße Uwe

p.s. der Popel gehört doch eigentlich in die Presse 😀. Duck und wech ...
Member: Winstar
Winstar Jul 16, 2022 updated at 17:01:37 (UTC)
Goto Top
Vielen lieben Dank, das hat mir schon etwas weiter geholfen! face-smile Zumal, da ich keine Info über die API-Signatur hatte.

Nun möchte ich anhand dieser Informationen und mit Hilfe der apk-assets (json.txt & translate.json) die ursprüngliche MCU-Datei vom chinesischen Server beziehen. Dieser erfordert wie erwähnt eine HTTP POST-Anfrage mit bestimmten Parametern. Nur dann soll laut meinen eigenen Beobachtungen erst ein Downloadlink vom API-Server api.mcu.cardoor.cn generiert werden. Dieser sieht z.B. so aus, wobei der .zip-Name in der URL sowie weitere Inhalte variabel sind:
cdn.mcu.cardoor.cn/zip/tw-carchoose/202006/Ts9.4.3-11-81-453681-200608.zip
(cdn.mcu.cardoor.cn/zip/tw-carchoose/YYYYMM/Ts9.4.3-xx-xx-xxxxxx-MCUVERSION.zip)

In der json.txt bin ich bereits fündig geworden und auf folgenden Inhalt gestoßen, der für mich relevant aussieht:
{
      "id": "10041087",  
      "configId": "0001",  
      "rank": "100",  
      "type": "0",  
      "name": "通用机",  
      "level": "3",  
      "superId": "81",  
      "logo": "null",  
      "remark": "2_219_81",  
      "configJson": ""  
}
{
      "id": "10040774",  
      "configId": "0001",  
      "rank": "100",  
      "type": "0",  
      "name": "通用机",  
      "level": "3",  
      "superId": "80",  
      "logo": "null",  
      "remark": "2_219_80",  
      "configJson": ""  
}

Wie schon erwähnt, war standardmäßig die MCU namens
"通用机"  
installiert. Über die
"superId"  
habe ich dann z.B. herausgefunden, dass
"81"  
für OPEL und
"80"  
für GM steht.

Proxymon zeichnete z.B. folgenden Inhalt aus der Car Choose App auf:
http://api.mcu.cardoor.cn/move/mcu/queryRelationConfig
POST /move/mcu/queryRelationConfig HTTP/1.1
Host: api.mcu.cardoor.cn
Content-Type: application/json
Charset: UTF-8
Content-Length: 202
User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; Octa - TS9 Build/OPM2.171019.012)
Connection: Keep-Alive
Accept-Encoding: gzip

{"appid":"dfsgherthdfghkj6o78tdftyw4uyrtyj","id":"11","language":"de-DE","level":"7","ratio":"0","remark":"2_203_81_8111_80_Ts9.4.3_11","resourcesId":"10040312","sig":"749f9e7c78c840e8e7ad7c0d5de81dfd"}  

HTTP/1.1 200 OK
Server: Tengine
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Date: Mon, 11 Jul 2022 22:43:50 GMT
Via: cache30.l2st4-5[50,0], cache7.de3[252,0]
Timing-Allow-Origin: *
EagleId: 4f85b19b16575794305394119e

{"code":"CD000001","msg":"处理成功","body":{"appRelationConfigList":[{"configJson":"","cipherStatus":"","level":"7","configId":"2","name":"A\\C Control","rank":100,"logo":"null","remark":"2_203_81_8111_80_Ts8_100","id":"10040315","superId":"100","type":1}]}}  

Wie kann ich nun die erforderliche MD5-Signatur selbst berechnen? Hat jemand eine Vorgehensweise?
Member: Winstar
Winstar Jul 18, 2022 at 14:41:05 (UTC)
Goto Top
Irgendjemand der mir helfen kann? face-sad Ich rätsel nun mehrere Wochen lang an einer Lösung. Speziell geht es um die angesprochen Funktionen "getSig" und "StringBuilder"-Objekt.
Member: Winstar
Winstar Jul 24, 2022 at 06:17:40 (UTC)
Goto Top
Hat denn hier niemand eine Idee oder kann mir die Vorgehensweise anhand eines Beispiels zeigen?
Member: colinardo
colinardo Jul 24, 2022 updated at 07:52:41 (UTC)
Goto Top
Zitat von @Winstar:

Hat denn hier niemand eine Idee oder kann mir die Vorgehensweise anhand eines Beispiels zeigen?

Lerne wie man Java programmiert dann verstehst du auch meine detaillierte Beschreibung dazu oben und auch den Smali-Code und wie sich die Signatur zusammensetzt, ist im Endeffekt nur eine Aneinanderreihung der entsprechenden Strings in der richtigen Reihenfolge die man dann an die allseits bekannte MD5() Hashing-Funktion übergibt.
Das berechnen der Signatur wird dich aber trotzdem auch nicht viel weiter bringen, denn die Links lassen sich auch so ohne die Signatur abrufen du musst nur den richtigen Dateinamen und URL zusammensetzen.

https://mobsecguys.medium.com/smali-assembler-for-dalvik-e37c8eed22f9

Ohne grundlegendes Programmierverständnis, wirst du hier nicht weiterkommen auch wenn ich es dir noch detaillierter erklären würde, du würdest es mangels Programmierkenntnisse trotzdem nicht verstehen. Mangels vorliegendem Gerät und Testmöglichkeit ist meine Zeit dann doch ehrlich gesagt zu schade für so einen China-Schrott. Sorry, aber wer sich den Mist selbst einbrockt und sich die Originaldaten vorher nicht notiert und den Flash nicht in eine Datei sichert muss ihn auch auslöffeln.

Von meiner Seite aus wünsche ich trotzdem viel Erfolg. 🖖

Grüße Uwe
Member: Winstar
Winstar Jul 24, 2022 at 08:59:02 (UTC)
Goto Top
ist im Endeffekt nur eine Aneinanderreihung der entsprechenden Strings in der richtigen Reihenfolge die man dann an die allseits bekannte MD5() Hashing-Funktion übergibt.
Das ist mir im Groben mittlerweile auch klar geworden. Mein Problem bezieht sich jedoch auf den generellen Aufbau der Struktur des Strings - ich denke, der kleinste Fehler darin gibt später schon einen ungültigen MD5-Hash aus, z.B. eine falsch gesetzte Klammer.

Das berechnen der Signatur wird dich aber trotzdem auch nicht viel weiter bringen, denn die Links lassen sich auch so ohne die Signatur abrufen du musst nur den richtigen Dateinamen und URL zusammensetzen.
Auch das ist mir klar - die Daten können auch direkt von cdn.mcu.cardoor.cn geladen werden, ich habe es schon mehrfach mit einer in der App versteckten URL+Dateiname getestet. Vorrausgesetzt, man kennt den exakten Dateinamen... in meinem Fall bringt das leider nichts, da selbst die Dateinamen in der URL scheinbar durch Zahlenwerte formatiert werden. Einige Definitionen des Dateinamens konnte ich ausfindig machen, aber das reicht natürlich nicht. Ich benötige daher zwingend die API-Abfrage.

Sorry, aber wer sich den Mist selbst einbrockt und sich die Originaldaten vorher nicht notiert und den Flash nicht in eine Datei sichert muss ihn auch auslöffeln.
Der MCU-Flash auf diesen Geräten lässt sich nicht ohne weiteres bis gar nicht sichern - 4PDA bestätigte, dass dies nicht möglich sei. In der Car Choose App stand (meines Wissens) diese MCU: 通用机 (Allzweckmaschine).
Laut der json.txt in den Car Choose assets gibt es für OPEL
"superId": "81"  
nur diesen einzigen Eintrag für die API-Abfrage:
{
      "id": "10041087",  
      "configId": "0001",  
      "rank": "100",  
      "type": "0",  
      "name": "通用机",  
      "level": "3",  
      "superId": "81",  
      "logo": "null",  
      "remark": "2_219_81",  
      "configJson": ""  
}

Mir macht das mit sehr großer Sicherheit auch keinen Spaß mehr - vor allem auch, da der Support für diese Geräte offiziell eingestellt wurde und der Service einfach katastrophal ist. Es ist sicher nur noch eine Frage der Zeit, bis die Download-Server abgeschaltet werden. Dass das Ganze auf meinen Mist gewachsen ist, weiß ich selbst. Nur: Wenn man sich schon die Mühen macht und den ganzen Inhalt aus den vergebenen letzten Wochen zusammenträgt, wäre es schön, wenn man nicht hängen gelassen wird!