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