Reflasher un firmware : méthode flashimage.py

De neufbox 4

Attention : Cette méthode ne fonctionne que sous Linux

Par contre, cette méthode fonctionne très bien avec un Linux installé dans une machine virtuelle (type VirtualBox) sous Windows ou Mac Os X. Il faut cependant, configurer correctement l'adaptateur réseau dans les propriétés de la machine virtuelle (généralement mettre Bridge à la place de NAT).

Une autre solution est d'utiliser un outil tel que WUBI (http://wubi-installer.org/ ) pour une installation plus permanente, mais non-intrusive.

Fonctionnement

Toutes les neufbox4 ont un mode "download" qui s'active à la mise sou tension si on appuie sur :

  • le bouton de service pour les neufbox4 ayant un CFE récent (c'est-à-dire neufbox SER-r2 ou FXC-r2). Le bouton de service se met à clignoter en bleu une fois le mode download activé,
  • le bouton reset pour les neufbox4 ayant un CFE ancien (c'est-à-dire les box SER-r0 ou FXC-r1). Le bouton de service reste alors au rouge fixe une fois le mode download activé,

Au début du processus, la flash est effacée en mettant des 1 par blocs de 64k (car pour écrire des bits individuel, il n'est possible que de les passer de 1 à 0). Ensuite, le mode download s'attend à recevoir une image complète de 8Mo (taille qui correspond à la capacité maximale de la flash).

Pour utiliser cette méthode, il faut donc reconstituer une image de 8Mo correctement d'après la description de la structure mémoire de la flash.

Nous avons constaté que, bien que l'image attendue doit faire une taille de 8Mo, le CFE n'est pas réécrit.

Prérequis

Il est nécessaire d'avoir sous la main, un ROOT-FS ou MAIN, le RESCUE, le KERNET et le driver ADSL. Voir page Récupération_du_firmware pour leur obtention.

Si dessous est appelé :

  • NB4-ROOTFS : Le rootfs
  • NB4-KERNEL : Le kernel
  • NB4-MAIN : Une image taguée contenant le header, le rootfs et le kernel
  • NB4-A2pB024k2 : Le driver ADSL
  • NB4-RESCUE : Un firmware de sauvegarde.


Mise oeuvre

Construction d'une image 8Mo

Il y a deux possibilité pour construire l'image de 8Mo. Soit avec l'outil nb4-concat soit par script.

Avec outil nb4-concat

Cet outil, qui initialement était prévu pour taguer une image (création du MAIN), permet maintenant de construire également une image complète de 8Mo. Il est donc nécessaire d'avoir sous la main le ROOTFS, le KERNEL, le RESCUE et le driver ADSL.

L'outil nb4-concat est disponible sur le dépôt subversion GNA dans la section destinée au firmware_2x. Il faut récupérer et le compiler :

$ mkdir tools
$ cd openbox4
$ svn co svn://svn.gna.org/openbox4/trunk/ .
...
$
$ cd firmware_2.x/tools/nb4-concat
$ make

utilisation :

$ nb4-concat --help
Usage: nb4-concat [options] NB4-Rx.x.x

    Si aucune option n'est précisée, lit les fichiers NB4-Rx.x.x-ROOTFS et
    NB4-Rx.x.x-KERNEL et génère le fichier NB4-Rx.x.x-MAIN

    Un entête est entièrement généré où le champ Reserved est renseigné avec
    NB4-Rx.x.x-MAIN

Options : 
 -r, --rootfs=nom de fichier       : permet de spécifier un nom différent pour
                                     le fichier contenant le ROOTFS
 -k, --kernel=nom de fichier       : permet de spécifier un nom différent pour
                                     le fichier contenant le KERNEL
 -a, --adsldriver=nom de fichier   : premet de spécifier un nom différent pour
                                     le fichier contenant le driver ADSL
 -s, --rescue=nom de fichier       : premet de spécifier un nom différent pour
                                     le fichier contenant l'image RESCUE
 -o, --output=nom de fichier       : permet de spécifier le nom du fichier de
                                     sortie
 -v, --version=version du firmware : permet de spécifier le texte qui sera placé
                                     dans la zone version de l'entête
 -e, --align_size=val alignement   : permet de spécifier la valeur du modulo pour
                                     aligner la taille du rootfs et/ou kernel. A
                                     valuer sous la forme 0xYY. (par défaut = 0x100)
 -i, --imageorder=kr|rk            : ordre placement KERNEL et ROOTFS dans
                                     l'image, tel que :
                                            kr = kernel + rootf, ordre à partir
                                                 de 2.1.x (option par défaut)
                                            rk = rootfs + kernel
 -m --magic=numéro magic adsl      : numéro magic ADSL (par défaut = 0xE0). A 
                                     valuer sous la forme 0xYY
 -h, --help                        : affiche cette aide
$ 
$ nb4-concat -r NB4-ROOTFS-OPEN -k NB4-KERNEL -a NB4-A2pB024k2 -s NB4-RESCUE -v NB4-MAIN-OPEN -o NB4-MAIN -e 0x01
Adresse du ROOTFS : 0Xbfd14969
Adresse du KERNEL : 0Xbfc10100
Création avec succès du MAIN : 'NB4-MAIN-OPEN'
Création avec succès du FULL 'NB4-MAIN-OPEN-FULL'
$

C'est le fichier FULL qui correspond à l'image de 8Mo et destiné à être utilisé avec l'outil nb4-flashimage.py

Par script

Il est possible par script schell de créer une image de 8Mo. script à finaliser !

Exemple pour créer une image de 8Mo ayant un mapping 2.x.x :

# on met des 1 partout
cat /dev/zero | tr '\000' '\377' | dd bs=64k of=NB4-MAIN-OPEN-FULL count=128 seek=0
# on zappe le bootloader
echo "rien !"
# on copie la MAIN
dd bs=64k of=NB4-MAIN-OPEN-FULL if=NB4-MAIN seek=1
# on zappe la config
echo "rien !"
# on copie la RESCUE
dd bs=64k of=NB4-MAIN-OPEN-FULL if=NB4-RESCUE seek=96
# PHY ADSL
dd bs=64k of=NB4-MAIN-OPEN-FULL if=NB4-A2pB024k2 seek=120
# on met le bootcounter à 0
dd bs=64k of=NB4-MAIN-OPEN-FULL if=/dev/zero count=1 seek=127


Téléchargement script nb4-flashimage.py

Le script flashimage.py est disponible sur le dépôt subversion GNA. Il suffit de le récupérer. Pour fonctionner, cet outil qui est écrit en python nécessite d'avoir l'interpréteur python d'installé sur votre système Linux. Si ce n'est pas le cas, il faut l'installer. Exemple pour l'installer sous Debian et/ou dérivé :

# aptitude install python

Flashage de la neufbox4

Il faut connecter le port TV ou PC1 de votre neufbox4 sur l'interface réseau de votre ordinateur (il n'est pas nécessaire de configurer une adresse IP sur l'interface réseau de votre ordinateur).

Mettez en place le câble réseau entre le port tv de la box et l'interface réseau configurée précédemment. description configuration ?

La fonction de flashage du CFE (download mode) s'active en appuyant sur un bouton tout en branchant éléctriquement la neufbox. En fonction du type de la neufbox 4, le bouton à utiliser est :

  • NB4-SER-r0 : Reset + led rouge fixe
  • NB4-SER-r1 : ?
  • NB4-SER-r2 : Service + led bleu clignotante
  • NB4-FXC-r1 : Reset + led rouge fixe
  • NB4-FXC-r2 : Service + led bleu clignotante

L'aspect du bouton de service va indiquer le mode download du CFE. L'aspect diffère en fonction du type de la neufbox :

  • NB4-SER-r0 : rouge fixe
  • NB4-SER-r1 : ?
  • NB4-SER-r2 : bleu clignotante
  • NB4-FXC-r1 : rouge fixe
  • NB4-FXC-r2 : bleu clignotante

Lancer le script flashimage.py

La commande suivante est à adapter en fonction :

  • des emplacements du script et de MON_IMAGE</li>
  • du port ethernet utilisé pour connecter la box</li>
sudo python flashimage.py eth0 MON_IMAGE

Une activité devrait apparaitre dans la console vous informant de l'avancement de la procédure de flashage.

Si ce n'est pas le cas :

  • de mauvais paramètres ont été choisis pour le lancement du script</li>
  • le câble réseau n'est pas branché sur le port TV de la box</li>
  • le câble réseau n'est pas branché sur le bon port ethernet</li>
  • la communication entre votre ordinateur et la box ne fonctionne pas</li>
  • votre box ne passe pas en download mode</li>
  • essayer de lancer le script une fois la box en download mode</li>
sudo ./flashimage.py eth3 2.1.2-Vincent/NB4-MAIN-R2.1.2-VGO
+++++++++++++++++++++++++++++++++++++++++++++++
 Image: 2.1.2-Vincent/NB4-MAIN-R2.1.2-VGO
 > Size: 8388608 bytes
+++++++++++++++++++++++++++++++++++++++++++++++
eth3 ethernet address: 00:40:05:08:5F:A1
 > Info request on broadcast
 < Receive response from 00:17:33:5C:61:1C - BCM6358
Continue ? (y|N) y
 > Flash request to 00:17:33:5C:61:1C
 < Ok, box wait flashing
 > send 2.1.2-Vincent/NB4-MAIN-R2.1.2-VGO (size=8388608)
 (please wait while the box erasing the flash from 0x00010000 to 0x007fffff before flashing ...)

Une fois le flashage terminé il vous est demandé d'appuyer sur la touche "entrée" pour redémarrer la box et quitter le script.

Press Enter to reboot the box

Votre Neufbox est maintenant prête a fonctionner.

Mettez en place le câble réseau entre le port PC1 de la box et l'interface réseau configurée précédemment.

Pourquoi ça ne marche pas sous Windows nativement

Depuis le service pack 2 de Windows XP, Microsoft a restreint l'envoi de trames ethernet "pures",via le mécanisme communément appelé "socket RAW". La limitation la plus importante est que l'envoi d'un tel paquet est bloqué si l'adresse IP source n'est pas celle de la machine locale.

Or le protocole utilisé ici n'utilise carrément pas IP. Dans cette situation, Windows considère que ce paquet est frauduleux, refuse l'envoi & retourne une erreur de type "Winsock 10077".

C'est pour la même raison qu'on ne trouve pas facilement sous windows de cracker de clé WEP.

L'une des solutions possibles serait de re-écrire totalement l'application en utilisant "WinPCAP". Ce programme installe un Driver NDIS qui contourne cette restriction.