Débriquer un routeur TP-Link TL-WR841ND v8.4

Récemment j’ai fait l’acquisition d’un routeur TP-Link TL-WR841ND sur lequel j’ai tenté de faire tourner DD-WRT en lieu et place du firmware d’origine. Après avoir flashé avec succès DD-WRT via l’interface web du routeur, je reboot, et là, c’est le drame : seul la LED « Power » s’allume, et plus moyen d’accéder au routeur, que ce soit par l’interface web ou telnet. Après avoir essayé tous les gestes de premier secours (reset, 30/30/30, etc.), j’ai dû me faire une raison : j’avais réussi à briquer mon routeur… Zut, pas de bol.

Heureusement, tout n’est pas perdu : la plupart du temps, les fabricants laissent des vestiges des interfaces séries qui servaient au débogage durant la phase de conception du matériel. J’ai donc entrepris de démonter mon TL-WR841ND, et j’ai effectivement trouvé ce que je cherchais. Je vais donc décrire dans la suite de cet article la procédure à suivre pour restaurer le firmware d’origine du routeur en utilisant cette connexion série.

Port série du WR841ND v8.4

Port série du WR841ND v8.4

Obtenir un accès au routeur via son port série

Il faut, pour commencer, ouvrir le routeur. Rien de bien compliqué : il suffit de dévisser les deux vis planquées sous les patins du fond, puis de tirer un peu sur le boîtier pour que la bête s’ouvre.

Ensuite il va falloir connecter le port série du routeur à notre PC, pour cela il faut un adaptateur convertisseur TTL/USB. On peut trouver ça pour quelques euros sur eBay. Personnellement j’ai acheté celui-ci chez Amazon car il pouvait m’être livré très rapidement (ah l’impatience…).

Côté branchements, c’est relativement simple :

  • on ne connecte pas VCC
  • GND routeur → GND adaptateur
  • RX routeur → TX adaptateur
  • TX routeur → RX adaptateur
Schéma de connexion du câble TTL/USB

Schéma de connexion du câble TTL/USB

Une fois les branchements terminés, nous allons enfin pouvoir parler avec le routeur. Nous aurons cette fois besoin d’un logiciel nous permettant de communiquer via la liaison série. Si vous êtes sous Windows, vous pouvez utiliser PuTTY (section "Connection → Serial"), si vous êtes sous Linux, vous pouvez utiliser PuTTY, minicom ou GtkTerm. J’ai personnellement choisi cette dernière solution.

Une fois le logiciel de votre choix installé, branchez l’adaptateur convertisseur TTL/USB au port USB de votre PC, lancez le logiciel que vous venez d’installer et sélectionnez le bon port ("/dev/ttyUSB0" dans mon cas), définissez le débit à 115200 Baud puis lancez la connexion. Enfin, démarrez le routeur.

Si vous voyez plein de lignes défiler à l’écran, bravo, vous avez réussi ! Dans le cas contraire, essayez d’intervertir TX et RX, ils sont peut-être branchés à l’envers…

La dernière étape pour pouvoir enfin communiquer avec notre routeur est d’obtenir un invite de commande (prompt). Pour se faire, lorsque la ligne suivante apparaît à l’écran :

Autobooting in 1 seconds

tapez très rapidement les trois lettres suivantes :

tpl

Si vous avez été assez rapide, vous devriez avoir obtenu l’invite de commande suivante :

wasp>

Si ce n’est pas le cas, pas de panique : il suffit de redémarrer le routeur pour retenter votre chance.

GtkTerminal connecté au routeur

GtkTerminal connecté au routeur

Préparer le firmware

Maintenant que nous sommes capables de communiquer avec le routeur, nous allons préparer le firmware afin que celui-ci puisse être flashé sur le TL-WR841ND.

Pour commencer, téléchargez la dernière version du firmware sur le site du fabricant (au moment où j’écris ces lignes, la dernière version est la "TL-WR841ND_V8_130506") :

Le firmware, tel qu’il est fourni par le fabricant est composé de deux parties :

  • la première contient le code de démarrage du routeur,
  • la seconde contient le système d’exploitation du routeur.

Dans notre cas, nous avons besoin uniquement de la seconde partie, nous allons donc devoir amputer le firmware de sa première partie avant de le flasher. Pour se faire, j’ai codé rapidement un petit script Python qui va s’occuper de l’opération :

#!/usr/bin/python

BOOT_BLOCK_SIZE = 0x20200

import os
import sys

file_in = open(sys.argv[1], "rb")
file_out = open("%s.bootremoved" % sys.argv[1], "wb")
file_in.seek(BOOT_BLOCK_SIZE)
file_out.write(file_in.read())
file_in.close()
file_out.close()

Vous pouvez le télécharger ici : wr841nv8-rmboot.py

Pour l’utiliser c’est très facile :

python  wr841nv8-rmboot.py  chemin/vers/votre/firmware.bin

Si tout s’est bien déroulé, vous devriez avoir obtenu un fichier se terminant par ".bootremoved" à côté de votre firmware original, c’est celui-ci que nous allons utiliser dans la suite de cet article.

Configurer son PC pour permettre le transfert du firmware

Pour être en mesure de transférer le firwmare, nous avons besoins d’installer et configurer un serveur tftp sur notre PC.

Une fois votre serveur tftp fonctionnel, copiez le firmware que vous avez obtenu à l’étape précédente dans le dossier racine du serveur tftp (dans mon cas, le dossier est "/var/lib/tftpboot/"). Vous pouvez également renommer le fichier du firmware pour simplifier les commandes de la section suivante (je l’ai personnellement renommé, sans aucune originalité, en "firmware.bin").

Dernière étape de configuration du PC : le réseau. Connectez directement votre machine à l’un des port LAN (jaune) du routeur à l’aide d’un câble ethernet, puis configurez une IP statique sur votre interface ethernet. Je vous recommande la configuration suivante :

          Addresse IP : 192.168.0.2
Masque de sous-réseau : 255.255.255.0

Voilà, nous sommes enfin prêts à flasher le firmware sur le routeur !

Flasher le firmware via la liaison série

Pour cette ultime étape, reprenez le terminal série que vous aviez installé durant la première étape, et entrez y les commandes qui suivent.

Pour commencer, on définit l’adresse IP du routeur :

wasp> setenv ipaddr 192.168.0.1

Puis celle de la machine qui fait tourner le serveur tftp :

wasp> setenv serverip 192.168.0.2

On télécharge le firmware (que nous avions renommé en "firmware.bin") dans la RAM du routeur (à l’adresse 0x80000000) :

wasp> tftpboot 0x80000000 firmware.bin

On efface la partie de la mémoire flash que l’on va réécrire (0x3c0000 octets à partir de l’adresse 0x9f020000) :

wasp> erase 0x9f020000 +0x3c0000

Enfin, on copie le firmware dans la mémoire flash :

wasp> cp.b 0x80000000 0x9f020000 0x3c0000

Pour finir, on boot le routeur :

wasp> bootm 0x9f020000

À présent, rendez-vous à l’adresse http://192.168.0.1/ à l’aide de votre navigateur web favori. Si vous atterrissez sur une interface d’administration vert-moche, félicitation, vous avez débriqué votre routeur !

La fin, enfin !

Débranchez la liaison série et refermez le boîtier. Le routeur est maintenant prêt à être briqué à nouveau reprendre du service.