.bin Datei bearbeitbar?

enigma2man

Newbie
Registriert
Feb. 2024
Beiträge
5
Hallo Forum-Gemeinde,

ich habe ein kleines Problem, welches ich trotz intensiver Recherche nicht alleine lösen kann. Und vielleicht ist ja ein Experte hier im Forum der mir bei der Lösung behilflich sein kann oder entsprechende Anleitung geben.
Ich versuche mich so kurz wie möglich zu halten. Zunächst kurz zu meinen Voraussetzungen. Ich habe Kenntnisse in HTML, CSS, und Java. Und da ich einige Webseiten betreue habe ich auch ein paar Grundkenntnisse in MySQL und PHP.
Derzeit beschäftige ich mich auch mit Python, bin aber auch schon Mitte 60 und mit dem Lernen wird das auch nicht einfacher. :confused_alt::D

Nun zum Problem:
Ich habe mir für mein Bike einen CarPlay Monitor (Iphone) gekauft. Dieser hat als Basis OS Linux. Vom Hersteller habe ich zur Aktualisierung eine ISPBOOT.bin Datei und eine Anleitung bekommen um das Gerät auf den neusten Stand zu bekommen.

Die Originalsoftware hat folgendes Bild als Bootlogo.

Screenshot (18).png

Dieses möchte ich gerne austauschen gegen ein Bild welches ein Bild meines Herstellers zeigt.

Spruce_ktk_large_gallery_1280_960.png

Das Bild liegt in der richtigen Größe und allen gängigen Formaten vor.

Ich habe den Hersteller gefragt ob es möglich ist dieses Bootlogo auszutauschen. Das wurde bejat. Ich sollte ein entsprechendes Bild einsenden was ich auch getan habe. Dennoch werde ich immer mehr hingehalten. Kurz die wollen mir (China) wohl nicht helfen.

Meine Frage ist nun: Wie kann ich diese .bin Datei so bearbeiten, dass ich die Bilddatei in dem Image austauschen kann. Oder vielleicht ist ja hier im Forum jemand der da Erfahrung hat und mit helfen kann die Flashdatei zu bearbeiten. Eventuelle Risiken das Image zu breaken sind mir bewusst.

ich danke euch im Voraus für eure Zeit meinen Beitrag zu lesen
 
Du nicht.
 
  • Gefällt mir
Reaktionen: BeBur
Und sonst hier voraussichtlich auch niemand. Wird niemand hingehen und random bytes in einer Datei zu analysieren nur damit irgendwer ein anderes Bild beim Booten hat.
 
Da die Dateiendung .bin halt erstmal nur für das generische "binary" steht, kann das schlicht alles Mögliche sein, was kein lesbarer Text ist. Das kann eine umbenannte Zip-Datei sein oder eben auch eine komplett unbekannte, proprietäre Ansammlung an Binärdaten, dessen Struktur letztlich nur der CarPlay Monitor (und halt der Hersteller) kennt.
 
  • Gefällt mir
Reaktionen: enigma2man, Gizzmow, Azghul0815 und eine weitere Person
Die Kenntnisse in HTML/CSS/Java/PHP/MySQL nützen dir hier alles nichts - außer dass technisches Verständnis natürlich immer hilfreich ist!

Der Hersteller listet die Firmware Updates nicht öffentlich (nur per Mail für Käufer) aber mit etwas googeln findet sich ein Facebook Post des Herstellers von 2022 mit einem öffentlichen Download Link für die Firmware des MAXCA Xplay C5. Dein Gerät nennst du nicht aber die Architektur und Software sind sicher ähnlich.

Neben der ISPBOOOT.BIN finden sich im heruntergeladenen Archiv ja noch ein paar weitere Dateien (die auf der SD Karte liegen bleiben oder beim Update ausgelesen werden?), siehe dazu den von @jodd2021 verlinkten Post.

Aus Interesse habe ich mir die ISPBOOOT.BIN (72 MiB) mal angeguckt. Verschlüsselt ist die nicht. Darin finden sich zahlreiche uImages für den uBoot bootloader. Diese umfassen 3 identische Kopien von uBoot selbst (424 KB), dann eins mit dem eCos RTOS (2,5 MB), ein Kernel Image von Linux 4.9.217 (4,2 MB) und zwei Images mit dem Titel ISP script for ISPBOOOT.BIN (44,8 KB und 29,7 KB) sowie 6 SquashFS Dateisysteme.

Am Ende der Datei befindet außerdem eine gzip-kompromierte Linux-Binary isp (1 MB). Diese enthält reichlich nützliche Strings und hat wohl die Aufgabe die ISPBOOOT.BIN auf den internen NAND zu installieren. Mit etwas suchen findet man heraus das es sich dabei um dieses Werkzeug von Sunplus handelt welches ISPBOOOT.BIN Dateien packen und flashen kann. Das Beispiel in der README entspricht ziemlich genau unserer ISPBOOOT.BIN: 3x uboot, Kernel image, eCos image sowie SquashFS für die Applikation.

Die SquashFS Dateisysteme enthalten ein rootfs mit Linux userland (libc + busybox + dbus) und einigen low-level Android Komponenten (Android Init, logcat, setprop). Die restlichen werden wie folgt gemountet
Code:
on init
    mount squashfs /dev/blockrom9  /opt wait ro
    mount squashfs /dev/blockrom10 /usr/local wait ro
    mount squashfs /dev/blockrom11 /application wait ro
    mount squashfs mtd@appdata /media/flash/appdata
    mount squashfs mtd@appbins /application/bin/
    mount yaffs2 mtd@nvm /media/flash/nvm wait noatime
    mount yaffs2 mtd@userdata /media/flash/userdata wait noatime
  • /opt enthält nur eine libstdc++.so.
  • /usr/local enthält einige Treiber/Kernel-Module und bekannte Linux-Software, u.a. OpenSSL, ffmpeg, gstreamer, wpa_supplicant/hostapd, sqlite3, mDNSd, tslib für touch input sowie DirectFB+Qt5 für grafische Ausgabe. An mehreren Stellen wird dieses Paket als "SP SDK" bezeichnet. SP steht hier wahrscheinlich für Sunplus, den Hersteller des SoCs im Gerät.
  • /application enthält die Software des Geräteherstellers (MAXCA). Aus irgendeinem Grund wurde das Unterverzeichnis bin/ auf eine weitere Partition separiert. Die Software besteht aus mehreren dutzend Binaries und Libraries. Neben Fonts, Sprachen und Icons finden sich in /application/resource/logo endlich die Bilder die während dem Start angezeigt werden; JPEGs und eine BMP in der Größe 800x480.
  • /media/flash/appdata enthält den Treiber für den Touchscreen und diverse kleine Konfigurationsdateien.
  • Die letzten beiden Mounts sind beschreibbar und finden sich nur auf dem NAND des Geräts. Dort werden Nutzerdaten abgelegt.
Interessante Strings mit Bezeichnungen zum SDK bzw. dem Gerät in /application/appinfo.rc:
Code:
on app_laterc
    export SP_CONFIG_MODEL_PLATFORM_CFG 4RlsCode_8368_U_demov1.4_openall_ew_qt_cfg
    export SP_CONFIG_GLB_GMNCFG_MODEL_UBOOT_CFG gemini_evb_def_config
    export SP_CONFIG_GLB_GMNCFG_MODEL_ECOS_CFG sunplus/gemini_disc
    export SP_CONFIG_GLB_GMNCFG_MODEL_KERNEL_CFG gemini_8368_U_td_defconfig 
    export SP_CONFIG_GLB_GMNCFG_MODEL_SDK_CFG gemini_servo_cfg
    export SP_CONFIG_GLB_GMNCFG_MODEL_APP_CFG sunplus/ew

Auf dem Github Account sunplus-plus1 wo man auch das isp Tool findet veröffentlicht der SoC-Hersteller vorbildlich sämtlichen Quellcode ihrer uBoot und Linux forks, firmware und build tools. Hardware-Bastler dürften hier reichlich Freude haben!

Interessanter Fund /etc/usb_action_8368-U: Schließt man einen mit FAT32 oder exFAT formatierten USB-Stick an und befindet sich darauf eine Datei mit dem Namen gemn_auto.sh wird selbige scheinbar automatisch mit root-Rechten ausgeführt. Grundsätzlich läuft in dem System alles als root und standardmäßige Sicherheitsfunktionen wie ASLR werden noch explizit abgeschaltet. Dies alles hat aber scheinbar der Geräte-Hersteller MAXCA eingebaut.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: titanskin, JumpingCat, nonick65 und 10 andere
Hallo, vielen Dank für eure Antworten. Ich muss mir erstmal alles in Ruhe anschauen und die verschiedenen Lösungen angehen.
Danke!!!
 
@Marco01_809 Danke für deine Ausführlichen Erklälungen. Ich brauche etwas länger um mich da einzuarbeiten. Mein Gerät ist ein Navifly 5" von der Firma Mekede , www.szmekede.com.
Im Grunde das gleiche wie die anderen Geräte.
So nun gucke ich mal ob ich das hinbekomme und würde an dieser Stelle nochmal schreiben. ;)
 
Dieses hier, Mekede (SS-)MTC5? https://www.mekede.com/Wireless/3361.html
Dafür finde ich leider auf die schnelle gar keine firmware zum Download.
In dem Markt werden leider endlos viele kaum zu unterscheidende Geräte auf den Markt gepumpt und auf diesen Marktplätzen unter ungenauen Namen verkauft.

https://www.mekede.com/Software Download Address1/
Hier sind für andere Geräte Downloads gelistet aber die Links funktionieren alle nicht bei mir.

Man kann wohl davon ausgehen dass Mekede wie MAXCA die gleiche Hardware-Platform von Sunplus und das bereitgestellte "SP SDK" verwenden (Sunplus scheint spezialisiert zu sein auf solche Car displays), aber die tatsächliche grafische Anwendung könnte eine andere sein.

Die generelle Vorgehensweise wäre mit binwalk die ISPBOOOT.BIN zu extrahieren so dass man die squashfs Dateisysteme hat. Aus den *.rc Dateien für Android Init lässt sich rauslesen wie die Partitionen gemountet werden. Und dann muss man die Anwendung finden und wo diese die Bilder ablegt. Aber die Daten die binwalk da rauszieht sind nicht vollständig da es die ISPBOOOT Struktur nicht kennt und nur nach bekannten Fomaten innerhalb des Binärmatsches sucht.

Der eigentlich schwierige Teil wird aber eine funktionsfähige ISPBOOOT.BIN selber wieder zusammenzubauen. Dazu wird man das isp Tool von Sunplus kompilieren und verstehen müssen. Wenn das Tool keinen Befehl hat um die Images sauber zu extrahieren bleibt nichts als die Dateistruktur aus der isp.c zu lernen und die Daten händisch von den richtigen Byte-Offsets der ISPBOOOT.BIN rauszukopieren.

Dann nur das eine squashfs mit den Bildern modifizieren, re-komprimieren und zusammen mit den anderen Bestandteilen mit isp wieder zu einer ISPBOOOT.BIN zusammenfügen. Dazu muss man den Befehl kennen, bzw. anhand der originalen Datei bestimmen. Und hoffen dass man alles gefunden hat was in die ISPBOOOT.BIN gehört. Ich habe zwar keine Signatur gesehen die eine Modifikation unmöglich macht, aber man riskiert auf jeden Fall das Gerät bei der Installation zu bricken.

Insgesamt sehe ich wenig Chance das alles hinzukriegen. Ohne das Gerät genau zu kennen weiß man nicht welche Änderungen gehen und welche nicht. Man müsste sich schon sehr ausgiebig damit beschäftigen wie der bootloader und flash-prozess in dem Gerät funktioniert, was die ISPBOOOT-Struktur alles kann und vorallem was es mit den ISP scripts auf sich hat. Man sollte damit rechnen mehrere Tage in Hex-Editoren zu verbringen wenn man das wirklich durchziehen will. Insbesondere Recovery-Mechanismen wären gut zu wissen wenn man es versaut. Ansonsten läuft das auf Gerät auseinandernehmen und mit JTAG/UART debuggen hinaus.

Die Alternative ist in der Linux-Umgebung (die man ziemlich vollständig allein mit binwalk bekommt) irgendeinen Mechanismus zu finden worüber man als root auf das System kommt (wie das usb_action script das ich bei MAXCA gefunden habe). Und dann die Änderungen nachträglich vornehmen. Dabei würde man nämlich nur mit der Linux-Umgebung arbeiten und würde sich das ganze Geraffel und Risiko mit Bootloader, ISP und Flash-Prozess sparen. Man braucht etwas know-how in Sachen mounts auf Linux um die Bilddateien zu tauschen obwohl die Dateisysteme read-only sind. Ist als root aber machbar. Für Persistenz über reboots hinweg muss man sich noch was einfallen lassen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Evil E-Lex, ni-sc und JumpingCat
@Marco01_809 , ja genau. Du hast in dem Link genau das Gerät um was es geht. Die die aktuell Originalfirmware habe ich. Die hat mir der Support mit einer Flashanleitung geschickt. Aber auch da ist ja das hässliche Moped als Bootbild drin.
Aber ich lese aus deinem Post das dies sehr schwierig wird aus dien funktionierende ISPBooot.bin wieder zu basteln.
Ich denke das ich da wohl leider passen muss. Aber versuchen werde ich das.

Danke nochmal für deine Zeit
 
Ich bin noch über diese Threads gestolpert:
https://xdaforums.com/t/any-idea-wh...s-wireless-aa-carplay-display-screen.4561807/
https://salvatorenoschese.it/carplay-lite-c5-aggiornamento-firmware/

Anscheinend sind die Firmwares der Hersteller MAXCA, Mekede und Carsara quasi gleich und in neueren Versionen der Firmware hätten sie ein Feature eingebaut um das Boot-Logo auszutauschen. Dazu eine LOGO.jpg in 1024x600/800x480 (je nach Gerät?) auf den gleichen Speicher legen wo man auch die ISPBOOOT.BIN hinkopiert. Wie man die Firmware dann dazu kriegt dieses Bild zu verwenden ist etwas unklar. Da wird gesprochen von einfach 2x Rebooten.
Der andere Artikel sagt die LOGO.jpg und ISPBOOOT.BIN auf einen FAT32 USB Stick, bei laufendem Gerät anstecken und es rebootet automatisch. Oder es gibt ein verstecktes Herstellermenü wo man eins von mehreren Logos auswählen kann und die jpeg Datei wäre auch darunter.

Diese Vorgehensweise wäre auf jeden Fall vorzuziehen. Ich habe in der Zwischenzeit aber auch nochmal ein bisschen rumgespielt und einen gangbaren Weg gefunden um die ISPBOOOT.BIN zu modifizieren. Ich habe das nicht bis zum Ende vollzogen und kann es mangels Gerät ohnehin nicht testen, aber meine gesammelten Erkenntnisse will ich zumindest aufschreiben :p

Es gibt hier ein paar Grafiken zur Struktur der ISPBOOOT.BIN. Die Partitionen treffen nicht genau zu weil dort ein SP7350 beschrieben ist. Aus den Strings der appinfo.rc wissen wir aber dass zumindest das MAXCA Gerät mit einem SPHE8368-U arbeitet. Die SPHE8* Familie ist für Car Displays gedacht und wird hier von Sunplus beschrieben.

Zum bearbeiten der ISPBOOOT.BIN schrieb ich ja das man sich die Struktur anhand der isp.c anlernen müsse um die richtigen Byte-Offsets zu finden. Ich hätte mir denken können dass jemand dafür bereits ein Tool gebastelt hat: https://github.com/tibbotech/ispe Das kann die Partitionen in der ISPBOOOT auflisten, löschen, anlegen und den Partitionsinhalt in eine Datei kopieren oder mit einer Datei überschreiben. Schaut man in die examples/mender.repack.sh wird aber klar: Sooo viel Arbeit nimmt einem das Ding dann doch nicht ab :lol: Ich gehe hier von Linux aus (WSL1/2 gehen) da wir eh die squashfs Werkzeuge brauchen.

Wir brauchen Git, GCC/G++, Make, die Entwicklerversion von OpenSSL und die Squashfs-Tools. Unter Debian z.B.
Code:
$ sudo apt update && sudo apt install git build-essential libssl-dev squashfs-tools
Dann ispe runterladen und kompilieren mit dem Flag SOC_SPHE. Das ist wichtig weil die SPHE-SoCs eine minimal abweichende ISP Struktur zu anderen Sunplus Systeme haben.
Code:
$ cd ~; git clone "https://github.com/tibbotech/ispe"
$ cd ispe
$ make CFLAGS+="-DSOC_SPHE"
Einen Ordner zum Arbeiten anlegen (auf einem Linux-Dateisystem!) und unsere ISPBOOOT.BIN dort reinkopieren. Original behalten nicht vergessen.
Mit ispe können wir uns jetzt die Partitionen anschauen. Wir überprüfen dass die Daten Sinn ergeben: mehrere Partitionen gelistet, keine negativen sizes oder tail data len.
Code:
$ cd ~/Mod
$ ~/ispe/ispe ISPBOOOT.BIN list
HEADER 0x100000 :
        sign (str,32/32): Gemini_ISP_image
        sign (hex,32/32): 47656D696E695F4953505F696D6167650000000000000000
        init script (str,16/1976): if test "$isp_if<skipped...>
        init script size: 1328
        flags: 0x1
PARTITION[0]
        filename: xboot1
        md5sum: f310fe4cfedb35b60ac3ff86ff684b4c
        file offset: 0x104000
        file size: 20480
[....]
Dann kopieren wir die Partition die wir bearbeiten wollen in eine separate Datei. Falls nötig probieren bis man die richtige gefunden hat. In der MAXCA Firmware die mir vorliegt heißen die Squashfs-Partitionen rootfs. (/), opt. (/opt), spsdk. (/usr/local), spapp. (/application), appdata (/media/flash/appdata) und appbins (/application/bin). (Der Punkt bei den ersten 4 ist kein Fehler).
Code:
$ ~/ispe/ispe ISBOOOT.BIN part spapp. extp
Das erstellt uns eine Datei isp.p.spapp. die nur den Inhalt dieser Partition enthält. Mit file können wir testen ob es sich um ein squashfs handelt. Ist das der Fall schauen wir uns noch die Squashfs-Metadaten an und entpacken es als root damit die ganzen Dateiattribute erhalten bleiben. (Darum ist auch das Linux-Dateisystem wichtig).
Code:
$ file isp.p.spapp.
isp.p.spapp.: Squashfs filesystem, little endian, version 4.0, lzo compressed, 14518236 bytes, 826 inodes, blocksize: 32768 bytes, created: Fri Jul 15 04:24:30 2022
$ sudo unsquashfs -s isp.p.spapp.
Found a valid SQUASHFS 4:0 superblock on isp.p.spapp..
Creation or last append time Fri Jul 15 06:24:30 2022
Filesystem size 14518236 bytes (14177.96 Kbytes / 13.85 Mbytes)
Compression lzo
        algorithm lzo1x_999
        compression level 9
Block size 32768
[...]
$ sudo unsquashfs isp.p.spapp.
Nun haben wir einen Ordner squashfs-root in dem die ganzen Dateien aus dem squashfs liegen. Diese können wir jetzt modifzieren. In diesem Fall die bmp und jpg Bilder in resource/logo. Mit file vorher und nachher sollten wir überprüfen das wir die Dateiformate möglichst genau nachahmen, da wir nicht wissen wie genau die App es nimmt.

Aus einem Grund der erst später klar wird dürfen wir in Summe nicht mehr Bytes haben als vorher. Das können wir z.B. beeinflussen indem wir die Qualität der jpg runterdrehen bis sie kleiner ist als die alte. Oder wir überschreiben alle dort liegenden jpgs durch unsere eigene; durch die squashfs deduplication wird der Platz in Wirklichkeit nur einmal gebraucht.
Dann bauen wir uns eine neue squashfs zusammen. Dabei berücksichtigen wir die Block size und Komprimierung die wir vorher aus den Metadaten ausgelesen haben:
Code:
$ mksquashfs squashfs-root/ spapp.sqfs -b 32K -comp lzo -Xcompression-level 9
Wir stellen sicher dass das neue Squashfs auf das Byte genau gleich groß oder kleiner ist als das alte. Dann füllen wir die neue Datei mit Nullen auf die gleiche Größe auf:
Code:
$ stat --printf '%s\n' isp.p.spapp.
14520320
$ stat --printf '%s\n' spapp.sqfs
14053376
$ fallocate -l "$(stat --printf '%s\n' isp.p.spapp.)" spapp.sqfs
$ stat --printf '%s\n' spapp.sqfs
14520320
Jetzt schreiben wir unser neues squashfs in die spapp. Partition der ISPBOOOT. Vergleichen wir die Ausgabe vom list Befehl auf der modifizierten und originalen ISPBOOOT sehen wir das sich außer dem md5 hash der partition nichts geändert hat.
Code:
$ ~/ispe/ispe ISPBOOOT.BIN part spapp. file spapp.sqfs
Schön wärs wir wären jetzt fertig. Leider machen uns die ISP scripte einen Strich durch die Rechnung.

Wenn man mit einer ISPBOOOT.BIN das Gerät startet, dann wird der uboot0 aus dieser Datei geladen und führt das ISP script aus. Dieses ISP script enthält Befehle für die uBoot-Umgebung die die relevanten Partitionen aus der ISPBOOOT.BIN auf den NAND bzw. eMMC des Geräts kopieren. Leider parsen diese Scripte gar nicht die ISPBOOOT Struktur die wir jetzt so schön angepasst haben. Die Scripte wurden automatisch generiert und alle Offsets, Größen und MD5 hashes sind hardcoded.

Wir haben zwar sichergestellt das Offsets und Größen alle gleich geblieben sind, aber da die Daten anders sind passt der MD5 hash nicht mehr. Würde man die ISPBOOOT.BIN jetzt booten bekäme man irgendwo in der Mitte des Firmware Updates einen MD5 Fehler.

Die ISP scripte zu modifizieren ist leider nochmal etwas Aufwand. An dieser Stelle hab ichs dann auch gelassen aber es müsste so gehen: Mit ispe ISPBOOOT.BIN head exts das Init ISP script auslesen. Darin sind die Byte-Offsets zu zwei weiteren ISP scripts die ans Ende der ISP Struktur angehängt sind ohne in der ISP Partitionstabelle zu stehen: Eins für Geräte mit eMMC, eins für NAND.

Die Scripte sind als uImage verpackt - daher diese mit dumpimage aus den u-boot-tools zum script zurückwandeln. Dann die entsprechende Stelle im Script finden (echo verifying spapp. ...). In mehreren Absätzen wird da jeweils der MD5 hash von 2MB großen Blöcken berechnet und verglichen. Also unsere neue spapp.sqfs in 2MB Häppchen hashen (split -b 2M --filter="md5sum" spapp.sqfs) und die neuen Hashes eintragen. Dann das script mit mkimage wieder in ein uImage verpacken und mit geeigneten Tools an das gleiche Byte-Offset in der ISPBOOOT.BIN schreiben.

Ich überlegte zuerst einfach mit sed die hashes über die ganze ISPBOOOT.BIN zu ersetzen (was auch geht da die uImages die Scripte im Klartext enthalten), aber die uImages sind selbst auch nochmal gehasht.

Wenn man das alles erledigt hat sollte die neue ISPBOOOT.BIN meiner Kenntnis nach vollkommen valide sein und auf die gewohnte Art geflasht werden können. Aber keine Garantie; gut möglich dass ich noch was übersehen habe und das Gerät beim flashen bricked. Sollte nur ausprobiert werden wenn der völlige Verlust des Geräts hinnehmbar ist.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: efcoyote, enigma2man und JumpingCat
@Marco01_809 danke dir nochmal für deine Mühe. Ich war eine Weile außer Gefecht gesetzt. In kürze lege ich mein Moped in den Winterschlaf. Da werde ich den Monitor vom Bike abnehmen und so lange basteln bis ich den gewünschten Erfolg habe.
Ich werde definitiv hier das Ergebnis posten. :D Und wenn das Ding bricked ist auch nicht tragisch. Ist bei AE nicht so teuer.
 
Zurück
Oben