Extraction du firmware (méthodes expérimentales)

Un article de neufbox 4.

Sommaire

Module SquashFS

Voici la procédure à suivre sous Debian :

# aptitude install squashfs-source
# m-a prepare
# m-a build squashfs-source
# m-a install squashfs-source
# mkdir -p /mnt/neufbox4
# mount -t squashfs -o loop NB4-R1.2.10-MAIN /mnt/neufbox4

Ca ne marche pas, le SquashFS utilisé par Broadcom étant modifié.

Utilitaire LZSQFS

Un petit utilitaire nommé LZSQFS, et que l'on peut télécharger directement sur son site "officiel", ou alors dans la section téléchargement de neufbox4.org, permet justement d'extraire les images compressées en SquashFS LZMA.

$ wget http://lzsqfs.ggbg.net/download/lzsqfs_v1.0.tgz
$ tar xf lzsqfs_v1.0.tgz
$ cd lzsqfs_v1.0
$ make

Et là, c'est le drame ! Des erreurs de compilation (avec gcc4, apparemment avec gcc3 il n'y aurait pas d'erreurs)...

Pas de panique, j'ai fait un patch qui est disponible... dans la section téléchargement de neufbox4.org.

$ wget http://www.neufbox4.org/download/lzsqfs_v1.0.patch
$ patch -N -p1 < lzsqfs_v1.0.patch
$ make

Et là tout se passe bien (à part quelques warnings, mais ça compile).

Mais là, autre déception :

$ ./lzsqfs -o rootfs NB4-R1.2.10-ROOTFS
Reading a different endian SQUASHFS filesystem on nb4-extract/NB4-ROOTFS.bin
Reading a different endian SQUASHFS filesystem on nb4-extract/NB4-ROOTFS.bin
Major/Minor mismatch, filesystem on nb4-extract/NB4-ROOTFS.bin is (2:0), I support (1: <= 0)
Major/Minor mismatch, filesystem on nb4-extract/NB4-ROOTFS.bin is (2:0), I support (1: <= 0)
-------------------------------------------------------------------

En fait, Broadcom utilise bien du SquashFS LZMA, mais surout lzsqfs ne supporte quue la version 1.x du format sqsh

Utilitaire Unsquash en Python

Cet utilitaire est disponible sur le site de squashfs sur SourceForge : unsquash_lit.py.

D'après la description, c'est un script Python que permet de faire l'inverse de mksquashfs. Il gère les versions 1 et 2 de SquashFS.

$ ./unsquash_lit.py 
ERROR: Argument missing

unsquash: a Squashfs extractor
Copyright (C) 2004-2005 Martin Gadbois under GPL
Supports V1 & V2.

Syntax: ./unsquash_lit.py [-v] image outdir
Will extract the SquashFs 'image' into 'outdir'
'outdir' will get erased beforehand if it exists.

Options:
-v : Increase verbosity

Bon, testons sur une image :

$ ./unsquash_lit.py NB4-R1.2.10-MAIN rootfs
Bad Squashfs. Does not support little endian
Traceback (most recent call last):
  File "./unsquash_lit.py", line 786, in ?
    main()
  File "./unsquash_lit.py", line 775, in main
    sqfs.load_meta()
  File "./unsquash_lit.py", line 615, in load_meta
    raise "Not a Squashfs!"
Not a Squashfs!

Ca ne marche pas, et c'est normal, car ligne 32 :

import zlib

C'est pas grave, on va remplacer zlib par pylzma, ce qui devrait être relativement facile grâce à la librairie PyLZMA.

Il faut d'abord installer le paquetage python-dev. Sous Debian :

# aptitude install python-dev

Et ensuite la librairie pylzma. Sous Debian :

# easy_install pylzma

SGDA a produit une version unsquash.py qui est disponible dans le dépôt subversion et qui fonctionne correctement.

Et pour l'extraction:

$ chmod +x unsquash.py

$ ./unsquash.py
Syntax: unsquash.py [-v] image outdir
Will extract the SquashFs 'image' into 'outdir'
'outdir' will get erased beforehand if it exists.
Options:
-v : Increase verbosity four levels

$ ./unsquash.py NB4-R1.2.10-ROOTFS rootfs

Sous Windows

La première étape est de télécharger l'utilitaire d'installation de Python, puis de lancer l'installation.

Ensuite, télécharger ez_setup.py, puis le lancer dans une console :

C:\>ez_setup.py

Les scripts permettant de lancer la commande easy_install sont maintenant installés dans le sous-répertoire Scripts de votre répertoire Python.

Ajoutez ce répertoire à la variable d'environnement Path (dans Panneau de configuration > Système > Avancé > Variables d'environnement), puis fermez la console et relancez-la (pour que la variable d'environnement Path soit relue).

Pour installer la librairie pylzma, il suffit maintenant de faire :

C:\>easy_install pylzma
C:\>unsquash.py NB4-R1.2.10-MAIN rootfs
C:\unsquash.py:703: DeprecationWarning: raising a string exception is deprecated
  raise "Not a Squashfs!"
Bad Squashfs. Does not support little endian
C:\unsquash.py:919: DeprecationWarning: raising a string exception is deprecated
  raise
Traceback (most recent call last):
  File "C:\unsquash.py", line 927, in <module>
    main()
  File "C:\unsquash.py", line 916, in main
    sqfs.load_meta()
  File "C:\unsquash.py", line 703, in load_meta
    raise "Not a Squashfs!"
Not a Squashfs!

Je (SGDA) doute que cela puisse fonctionner sous windows, hormis le problème de big et little endian, mais surtout à cause des liens symboliques et des autorisations....donc ne pas compter sur la procédure unsquash.py sous windows

Modules bcm_squashfs

Un site italien (traduction en anglais) fournit les patchs pour pouvoir supporter le SquashFS LZMA de Broadcom.

$ wget -O bcm_squashfs-2.6.19.diff "http://www.piccato.it/openwgate/_media/bin:2.6.19:bcm_squashfs-2.6.19.diff?id=modulo_squashfs&cache=cache"

C'est un patch pour le kernel 2.6.19. Il faut donc télécharger les sources pour son kernel. Sous Debian :

# export KERNEL_VERSION=`uname -r | cut -d '-' -f 1`
# aptitude install linux-source-$KERNEL_VERSION
# cd /usr/src/
# tar xf linux-source-$KERNEL_VERSION.tar.bz2
# ln -s linux-source-$KERNEL_VERSION linux
# ln -s /usr/src/linux /lib/modules/`uname -r`/build

Firmware Modification Kit

Le Firmware Modification Kit permet d'extraire un firmware pour y rajouter des binaires, puis le réassembler plus tard.

$ wget http://download.berlios.de/firmwaremodkit/firmware_mod_tools_prebuilt.tar.gz
$ mkdir firmware_mod_tools
$ tar -x -C firmware_mod_tools -f firmware_mod_tools_prebuilt.tar.gz

$ ./firmware_mod_tools/src/squashfs-2.1-r2/unsquashfs-lzma
SYNTAX: ./firmware_mod_tools/src/squashfs-2.1-r2/unsquashfs-lzma [-ls | -dest] filesystem
        -version                print version, licence and copyright information
        -info                   print files as they are unsquashed
        -ls                     list filesystem only
        -dest <pathname>        unsquash to <pathname>, default "squashfs-root"

$ ./firmware_mod_tools/src/squashfs-2.1-r2/unsquashfs-lzma -dest rootfs NB4-R1.2.10-ROOTFS

Et là, même problème, unsquashfs-lzma, comme son nom ne l'indique pas, utilise apparemment zlib et nous affiche donc des erreurs comme :

zlib::uncompress failed, unknown error -3
write_file: failed to read data block 0x2aff5b

nb4-unsquash

$ wget ftp://ftp.slax.org/source/slax/sqlzma/old-versions-unsupported/sqlzma443/squashfs3.2-r2.tar.gz
$ wget ftp://ftp.slax.org/source/slax/sqlzma/old-versions-unsupported/sqlzma443/sqlzma3.2-r2b.tar.bz2
$ wget ftp://ftp.slax.org/source/slax/sqlzma/old-versions-unsupported/sqlzma443/lzma443.tar.bz2

$ mkdir nb4-unsquash

$ tar -C nb4-unsquash -xf squashfs3.2-r2.tar.gz squashfs3.2-r2/squashfs-tools --strip=2
$ tar -C nb4-unsquash -xf lzma443.tar.bz2 C --strip=1
$ tar -C nb4-unsquash -xf sqlzma3.2-r2b.tar.bz2 sqlzma.h sqmagic.h

$ tar -C . -xf sqlzma3.2-r2b.tar.bz2 sqlzma2u-3.2-r2.patch
$ patch -d nb4-unsquash -N -p2 < sqlzma2u-3.2-r2.patch

$ tar -C . -xf sqlzma3.2-r2b.tar.bz2 sqlzma1-443.patch
$ patch -d nb4-unsquash -N -p2 < sqlzma1-443.patch