Le but de ce tutoriel est de montrer le principe pour extraire les fichiers d'un firmware, les modifier ou en ajouter.
Cela permet d'ajouter des fonctionnalités à son routeur 4G :)
Attention : Il est réservé à des utilisateurs qui maîtrisent parfaitement les techniques employées.
Ne vous lancez pas dans ce genre de manipulations si ce n'est pas le cas.
1- Objectifs
Nous allons partir du firmware original d'un routeur B715s-23c pour le modifier de la manière suivante :
- allongement de la durée de session de l'interface Web (5 minutes, c'est vraiment trop court !)
- modification du logo de l'interface Web
- ajout d'un serveur telnet
Ces modifications sont assez simples, mais elles donnent les bases pour allez plus loin ;)
Le firmware de départ est le B715-23c_UPDATE_11.197.01.00.965.bin (d'origine) mais le principe serait le même pour un autre modèle et/ou une autre version.
2- Outils utilisés
- balong_usbdload, pour installer un loader dans le routeur qui va permettre de flasher un firmware par USB;
- balongflash, pour extraire les sections du firmware (cela peut également être fait avec qhuaweiflash, mais je trouve cela moins pratique); Egalement utilisé pour flasher le firmware final;
- qhuaweiflash, pour remplacer les sections du firmware et générer le fichier .BIN final.
En théorie, qhuaweiflash permet d'ajouter, modifier et supprimer des fichiers dans le firmware, mais je n'ai pas réussi à faire fonctionner correctement la fonction d'ajout (les fichiers sont uniquement ajoutés dans la racine). D'autre part, il est plus facile d'avoir l'arborescence complète sur son disque : on peut facilement faire des recherches, décompresser des fichiers, ...
Ces outils ont été développés par Forth32 (merci à lui !) et je les ai traduits à partir du Russe. La version originale en Russe se trouve ici. La version traduite ici.
Note importante : qhuaweiflash ne fonctionne que sur Linux.
Pour compiler balong_usbdload :
git clone https://github.com/Oga83/balong-usbdload
cd <code>balong-usbdload
make</code>
Pour compiler balongflash :
git clone https://github.com/Oga83/balongflash
cd <code>balongflash
make</code>
Pour compiler qhuaweiflash
https://github.com/Oga83/qhuaweiflash
cd <code>qhuaweiflash
qmake
make</code>
3- Extraction des sections
Une fois que nous avons le firmware original et les outils, on met le tout dans le répertoire de son choix (/tmp/huawei pour la suite de ce tuto) :

Pour extraire les sections du firmware, on utilise la commande suivante :
balong_flash -e B715-23c_UPDATE_11.197.01.00.965.bin

Et on obtient un fichier par section :

Les 2 sections qui nous intéressent sont System et WEBUI. Il s'agit d'archives 'cpio'.
On peut extraire le système de fichiers qu'elles contiennent dans un répertoire avec la commande 'cpio' :
mkdir System
cd System
cpio -ivm -F ../10-00590000-System.bin
hm103.jpg
et on obtient le contenu de cette section :

On procède de la même manière avec la section WEBUI :
cd ..
mkdir WEBUI
cd WEBUI
cpio -ivm -F ../12-005b0000-WEBUI.bin


4- Modifications4a- Modification de la durée de session
Le timeout de session est défini dans le fichier WEBUI/WebApp/common/config/webserver/timeout.xml
Il suffit modifier la valeur. Je la passe à 1440 minutes (1 jour), en remplacement des 5 minutes d'origine :
nano WEBUI/WebApp/common/config/webserver/timeout.xml

4b- Modification du logo
Il suffit de modifier le fichier WEBUI/WebApp/common/res/euap-icon2.png
pinta WEBUI/WebApp/common/res/euap-icon2.png



4c- Ajout du serveur telnet
Le routeur est basé sur une distribution Linux qui utilise une vieille version de Busybox qui, de plus, est limitée (pas de serveur telnet).
Busybox est un programme qui regroupe tout un ensemble d'utilitaires linux. On l'appelle le couteau Suisse du Linux embarqué.
Nous allons ajouter au routeur une version plus récente de Busybox.
Les binaires, compilés (avec librairies statiques), peuvent être téléchargés ici.
Pour le B715, la version ARMv7-1.21 fera l'affaire. On va la télécharger dans System/bin :
cd System/bin
wget <code>https://busybox.net/downloads/binaries/1.21.1/busybox-armv7l
</code>

Pour que le serveur telnet fonctionne, il faut créer au moins 1 utilisateur.
On va donc créer le fichier System/etc/passwd (qui n'existe pas dans le firmware d'origine) avec la ligne suivante :
root::0:0:root:/tmp:/bin/sh
Soit vous le faites avec votre éditeur préféré, soit avec la commande suivante :
printf "root::0:0:root:/tmp:/bin/sh\n" > System/etc/passwd
Et pour terminer, il faut lancer le serveur telnet au démarrage (en utilisant le Busybox qu'on vient de télécharger).
Pour cela, on va ajouter une ligne à la fin du fichier System/etc/autorun.sh :
busybox-armv7l telnetd -l /bin/sh
Encore une fois, soit vous le faites avec votre éditeur préféré, soit avec la commande suivante :
printf "\nbusybox-armv7l telnetd -l /bin/sh\n" >>System/etc/autorun.sh
(notez bien qu'on utilise ">>" pour ajouter la ligne à la fin du fichier)

Voilà, nos modifications sont terminées !
Il faut maintenant les injecter dans le firmware.
5- Génération du firmware modifié
On procède à l'envers de l'extraction de fichiers.
Générer les archives cpio :
cd System
find . -print | cpio -ov -H newc -F ../10-00590000-System-mod.bin
cd ../WEBUI
find . -print | cpio -ov -H newc -F ../12-005b0000-WEBUI-mod.bin

Pour réinjecter ces sections modifiées dans le firmware, on lance qhuaweiflash, et on ouvre le firmware d'origine :

Et pour chacune des 2 sections System et WEBUI, on utilise le menu "Section/Remplacer", en sélectionnant les fichiers crées juste avant (10-00590000-System-mod.bin et 12-005b0000-WEBUI-mod.bin) :

Une fois que c'est fait, il suffit d'enregistrer (menu "Fichier/Enregistrer sous"), et vous obtenez un .BIN qui contient vos modifications
Il ne reste plus qu'à le flasher !
Pour cela, on utilise balong_usbdload et balong_flash, mais c'est pour un autre tuto !
Une fois que c'est fait, on peut accéder au routeur avec telnet :)
telnet 192.168.0.1
