Nachdem ich im ersten Teil meiner Serie zum (OSD) Modding des WD TV Live bereits darauf eingegangen bin, wie ich per SMB-Share von einer WDTVLX-gemoddeten Box die Daten des OSDs auf mein Windows-System bekomme, möchte ich heute kurz erklären, wie ich diese Daten aus dem Firmwareimage oder aus dem Image eines OSD-Mods erhalte. Dieses How-To beschreibt das Vorgehen unter Linux (in meinem Fall Ubuntu 10.4 Beta 1).

Auf das grundsätzliche Vorgehen bin ich in Teil 1 schon eingegangen: mein Ziel muss es sein, die Daten zu entpacken, zu ändern und abschließend neu zu verpacken. Grds. hängt es von der Art des zugrundeliegenden Images ab, wie die Daten entpackt werden müssen:

  • Firmware-Images (CramFS): die ersten 32 Bytes (= MD5-Checksumme des eigentlichen CramFS-Images) müssen entfernt werden, dann kann der Rest (= das eigentliche CramFS-Image) entpackt werden
  • OSD-Images (CramFS): können entpackt werden, ohne vorher manipuliert zu werden
  • OSD-Images (Ext2/3): brauchen noch nicht mal entpackt werden, denn sie sind nach dem Mounten direkt beschreib-, also auch veränderbar

Da Ext2/3-Filesysteme direkt beschreibbar gemountet werden können, brauchen wir darauf nicht weiter einzugehen. CramFS-Filesysteme jedoch erfordern den Einsatz der CramFS Tools zum (Ent)Packen. Diese sind grds. Open Source, stehen aufgrund der Abhängigkeiten ohne große Anpassungen aber nur für Linux zur Verfügung. Kleine Anpassungen muss ich dennoch an den Quelldateien machen, um die WD TV Live Firmware fehlerfrei bearbeiten können. Um euch diesen Spaß zu ersparen findet ihr hier das Paket mit den geänderten Sourcen sowie den für Linux x86 kompilierten Binaries fix und fertig zur Nutzung: Download (Hinweis dazu: die Dateien cramfsck und mkcramfs müssen unter Linux noch einmal explizit per ‘chmod +x {Datei}’ ausführbar gemacht werden, da die Dateiberechtigungen im .zip-File nicht gespeichert sind)

Zur Vereinfachung der Erklärung habe ich alle benötigten Dateien (cramfsck zum Entpacken, mkcramfs zum Packen, lilibabe.osd.bin = OSD Mod von Lilibabe, wdtvlive.bin = Firmware-Image) in ein Verzeichnis gepackt:

user@ubuntu-fusionvm:/shared/howto2$ ls -al
total 18621
drwxr-xr-x 1 501 dialout      272 2010-04-03 02:30 .
drwx------ 1 501 dialout      306 2010-04-03 02:24 ..
-rwxr-xr-x 1 501 dialout    63054 2010-02-27 22:48 cramfsck
-rwxrwxrwx 1 501 dialout  7569408 2010-03-28 21:16 lilibabe.osd.bin
-rwxr-xr-x 1 501 dialout    71929 2010-02-27 17:26 mkcramfs
-rwxrwxrwx 1 501 dialout 30425136 2010-03-22 12:33 wdtvlive.bin

Grundsätzliches zum Entpacken: cramfsck (das Tool, das wir gleich nutzen werden) erstellt das Verzeichnis, in das entpackt wird, selbstständig. D.h. wir müssen vorher keine Verzeichnisse zum Entpacken anlegen.


Entpacken des OSD Mods von Lilibabe

Das Entpacken eines CramFS-Images ist ganz simpel. Der Aufruf von

user@ubuntu-fusionvm:/shared/howto2$ ./cramfsck -x lilibabe lilibabe.osd.bin

entpackt das lilibabe.osd.bin in ein Verzeichnis lilibabe. Anschließend kann ich in dem Verzeichnis alle OSD-Dateien finden.

 

Enpacken der WD TV Live Firmware

Beim Firmware-Image muss, wie bereits gesagt, vor dem eigentlichen Entpacken noch die MD5-Checksumme entfernt werden, denn ein simpler Entpack-Versuch scheitert mit der Meldung:

user@ubuntu-fusionvm:/shared/howto2$ ./cramfsck -x wdtvlive wdtvlive.bin
./cramfsck: superblock magic not found

Also schneiden wir die MD5-Checksumme (32 Bytes) vom Anfang ab:

user@ubuntu-fusionvm:/shared/howto2$ dd if=wdtvlive.bin of=wdtvlive_cramfs.bin ibs=32 skip=1
950784+1 records in
59424+1 records out
30425104 bytes (30 MB) copied, 4.60694 s, 6.6 MB/s

Was passiert hier? Das Kommando ‘dd’ verarbeitet Datenströme. In diesem Fall leitet es einen Eingabedatenstrom (if) in einen Ausgabedatenstrom (of) um und überspringt (skip) dabei einen Datenblock von 32 Bytes Größe (ibs). Die Kontrolle

user@ubuntu-fusionvm:/shared/howto2$ ls -al
total 33484
...
-rwxrwxrwx 1 501 dialout 30425136 2010-03-22 12:33 wdtvlive.bin
-rw-r--r-- 1 501 dialout 30425104 2010-04-03 02:38 wdtvlive_cramfs.bin

ergibt genau eine Größendifferenz von 32 Bytes zwischen Originaldatei (wdtvlive.bin) und dem korrigierten CramFS-Image daraus (wdtvlive_cramfs.bin). Dieses entpacken wir jetzt nach wdtvlive mittels

user@ubuntu-fusionvm:/shared/howto2$ ./cramfsck -x wdtvlive wdtvlive_cramfs.bin

und schon können wir uns im Verzeichnis wdtvlive umschauen, was in der Firmware enthalten ist und Dinge manipulieren.


Packen des Mods von Lilibabe

Sobald alle gewünschten Änderungen am Mod gemacht sind, müssen wir diesen wieder Packen. Der Aufruf dafür ist unspektakulär:

user@ubuntu-fusionvm:/shared/howto2$ ./mkcramfs lilibabe lilibabe.osd.neu.bin
Directory data: 73716 bytes
Everything: 7360 kilobytes
Super block: 76 bytes
CRC: 3a69b8af

Die Datei lilibabe.osd.neu.bin könnt ihr jetzt auf den USB-Stick kopieren und an den WD TV Live mit b-rad-Firmware hängen und schon sollte euer modifiziertes OSD erscheinen.


Heute habe ich kurz demonstriert, wie man die Firmware des WD TV Live sowie generell CramFS-Images unter Linux entpackt und wieder zusammenpackt. Viel Freude beim Ausprobieren!