Il modem ADSL2+ Wi-Fi N Technicolor, detto anche AGTWI, è fornito da Telecom Italia per i contratti residenziali; il provider non prevede il suo uso come router. Questa è evidentemente una limitazione artificiale del software fornito dal provider, dato che l'hardware è pienamente capace di funzionare come router ADSL. L'hardware è basato su quello del router Technicolor TG582n, la variante usata da Telecom viene chiamata TG582Tn.
La procedura di sblocco del modem ADSL AGTWI per permetterne l'uso come router è interessante: invece di sfruttare una vulnerabilità (o una backdoor) del software per ottenere privilegi e modificare la configurazione predefinita, si aggira completamente il problema sostituendo il bootloader con quello di un dispositivo abbastanza simile; dopo aver fatto ciò diventa possibile installare software di altri provider che permettono l'uso del dispositivo come router.
È possibile trovare il TG582n in due revisioni hardware, con relativa variante software: DANT-T con flash da 8MiB e DANT-1 con flash da 16MiB in configurazione dual-bank (cioè con la possibilità di contenere due immagini software da 8MiB, una alternativa all'altra). Il TG582Tn di Telecom Italia invece usa la variante software DANT-V.
La procedura per sostituire il bootloader DANT-V con quello DANT-T è stata proposta da roleo (necessaria la registrazione al forum) sul forum Il Punto Tecnico e ADSL, ed è stata ripresa fra gli altri da Rix94 e Bestemmie Digitali.
I documenti attualmente presenti in rete spiegano come saldare una interfaccia SPI parallela alla memoria flash per modificarne il contenuto, e dicono di modificare il bootloader a mano copiando e incollando regioni di memoria da un file all'altro.
La procedura può essere semplificata e resa più robusta se mettiamo meglio a fuoco gli obiettivi:
- Leggere da una memoria flash che usa il protocollo SPI.
- Modificare un file binario sostituendo alcune sue regioni con quelle di un altro file binario.
- Scrivere su una memoria flash che usa il protocollo SPI.
Interfaccia seriale
Per lo sblocco del modem nessuna saldatura è strettamente necessaria, tuttavia, per avere maggiore controllo su cosa sta succedendo, si può saldare opzionalmente una striscia di pin sulla piazzola J3
e cortocircuitare le piazzole R62
e R63
per avere accesso all'interfaccia seriale:
Per il collegamento si può usare un adattatore USB-seriale basato su chip Prolific PL-2303HX o un adattatore multi protocollo basato su chip FTDI FT2232H o simili.
Leggere la memoria flash SPI
La memoria flash nel mio caso è una Spansion S25FL129P; per accedere al suo contenuto può essere usato un qualsiasi programmatore SPI, non necessariamente uno parallelo auto-costruito.
Come programmatore SPI si può usare per esempio un TIAO USB Multi-Protocol Adapter seguendo questo schema:
Per il collegamento si può usare un morsetto di test per chip SOIC-16 come il Pomona 5252, in questo modo nessuna saldatura è strettamente necessaria:
Per leggere la memoria usando il TUMPA si può usare flashrom:
sudo flashrom -p ft2232_spi:type=tumpa,port=A -Vr dump.bin
È utile conservare una copia di backup del contenuto della flash; potrà essere usata per riportare il dispositivo al suo stato originale.
Modificare il bootloader
A questo punto basterebbe scrivere il file bootloader_pn.bin fornito da roleo per avere un dispositivo DANT-T ed essere in grado di installare un firmware generico per DANT-T, ma così facendo si avrebbero gli stessi dati (chiavi, certificati, MAC address, serial number, product version) del modem da cui è stato preso quel file.
Per mantenere i dati del nostro dispositivo, si dovrà applicare una “patch” al file bootloader_pn.bin
.
Il file bootloader_pn.bin
è composto da due regioni:
- da
0x00000000
a0x0001ffff
c'è il bootloader; più precisamente c'è una routine di unpacking ed il binario vero e proprio del bootloader compresso con LZMA. - da
0x00020000
a0x0003ffff
c'è la “configurazione di fabbrica”; la regione viene anche chiamatamtdss
e contiene i dati identificativi del singolo dispositivo.
Invece di copiare e incollare regioni di file binari a mano, è possibile usare dd in uno script di shell per automatizzare la procedura:
#!/bin/sh # # patch_dant-v_dump.sh - patch DANT-V flash dump with DANT-T bootloader # # Copyright (C) 2014 Antonio Ospite <ao2@ao2.it> # # This program is free software. It comes without any warranty, to # the extent permitted by applicable law. You can redistribute it # and/or modify it under the terms of the Do What The Fuck You Want # To Public License, Version 2, as published by Sam Hocevar. See # http://sam.zoy.org/wtfpl/COPYING for more details. set -e copy_region() { local INPUT_FILE="$1" local OUTPUT_FILE="$2" local START_ADDRESS=$3 local END_ADDRESS=$4 local SIZE=$(($END_ADDRESS - $START_ADDRESS + 1)) dd if="$INPUT_FILE" of="$OUTPUT_FILE" \ skip=$(($START_ADDRESS)) count=$SIZE seek=$(($START_ADDRESS)) \ conv=notrunc iflag=skip_bytes,count_bytes oflag=seek_bytes } erase_region() { local OUTPUT_FILE="$1" local START_ADDRESS=$2 local END_ADDRESS=$3 local SIZE=$(($END_ADDRESS - $START_ADDRESS + 1)) # Write all 0xff to $OUTPUT_FILE dd if=/dev/zero count=$SIZE iflag=count_bytes | \ tr '\0''\377' | \ dd of="$OUTPUT_FILE" seek=$(($START_ADDRESS)) conv=notrunc oflag=seek_bytes } DANT_V_DUMP_FILE=dump.bin DANT_T_BOOTLOADER=bootloader_pn.bin PATCHED_DANT_V_DUMP_FILE=dump_patched.bin # Take the DANT-T bootloader copy_region "$DANT_T_BOOTLOADER""$PATCHED_DANT_V_DUMP_FILE" 0x00000000 0x0001ffff # Take the DANT-V mtdss region (the board specific data: serial number, # certificates, mac addresses, etc.) copy_region "$DANT_V_DUMP_FILE""$PATCHED_DANT_V_DUMP_FILE" 0x00020000 0x0003ffff # Patch the product code and the firmware variant code, e.g.: # DANT-V -> WL # DANT-T -> WJ # This does not appear to be strictly necessary, DANT-T firmwares will install # even if we keep the DANT-V data here. copy_region "$DANT_T_BOOTLOADER""$PATCHED_DANT_V_DUMP_FILE" 0x000216fc 0x00021713 # Patch the mtdss region in order to make the device look like a DANT-T, # otherwise the client will still ask a DANT-V file (output of bootpd): # # bootpd: info(6): requested path="" file="DANT-V" # # It is not enough to patch only the board name (0x00021727 0x00021728), some # more data needs to be copied in order to prevent a failure with # BLFLAG_INV_RI copy_region "$DANT_T_BOOTLOADER""$PATCHED_DANT_V_DUMP_FILE" 0x00021727 0x00021730 # Erase all the rest of the flash, this will prevent a failure with: # # Version BL: 1.0.5 # Unhandled TLB # # Unhandled exception # EPC=0x8130ff30, BadVAddr=0xc0830000, RA=8130fef8 # ... # # The bootloader will still output the message BLFLAG_FLASH_FAIL (bad FVP) but # that is OK, it will be fixed whith the firmware installation via tftp. erase_region "$PATCHED_DANT_V_DUMP_FILE" 0x00040000 0x0ffffff
Scrivere la memoria flash SPI
Il file dump_patched.bin
creato dallo script precedente può essere scritto con flashrom:
sudo flashrom -p ft2232_spi:type=tumpa,port=A -Vw patched_dump.bin
Installare un nuovo firmware
Per installare un nuovo firmware si può evitare di usare il Technicolor Home Install Wizard se si configura un server tftp.