Check out the new blog at http://linuxehacking.ovh , this one will no longer be updated

giovedì 9 maggio 2013

Scrittura della eeprom nelle schede atheros 5k mini-pci

Qualche giorno fa su ebay ho ordinato un'interfaccia mini-pci atheros su cui è scritto che supporta anche l'802.11a ( 5 Ghz ), una volta ricevuta ho constatato che tale scheda mini-cpi pagata pochissimo ( 5 € ) , non è originale ed ha bisogno di drivers modificati che sono forniti solo per windows per funzionare in 802.11a, quindi è inutilizzabile su un qualsiasi router OpenWRT oppure su una board MikroTik.
Ovviamente da buon hacker ho scartato subito l'idea di comprarne una nuova e lasciare perdere quella, ed ho subito aperto lo schermo metallico che racchiude i componenti ad alta frequenza.
Possedendo una atheros a 5 Ghz autentica , aprendo anche quest'ultima, ho subito constato che l'hardware effettivamente è completamente identico, c'è un solo componente che potrebbe essere diverso ( nei contenuti ), la EEPROM.

Quindi ho iniziato a cercare su internet ed ho trovato che uno sviluppatore ha trovato modo di modificare il mac address nei casi in cui fosse presente FF:FF:FF:FF:FF:FF , questo richiede la scrittura della eeprom, proprio quello che serve in questo caso!

Una volta riordinato il codice( era in condizioni penose ), e aggiornato alle modifiche dei drivers nelle versioni recenti del kernel, ho aggiunto in cima ad eeprom.c nel tree del driver ath5k la seguente funzione:





/* * Write to eeprom */
static int ath5k_hw_eeprom_write(struct ath5k_hw *ah, u32 offset, u16 *data)
{ 
u32 status, timeout;
*data &= 0xffff; 
/* * Initialize EEPROM access */
if (ah->ah_version == AR5K_AR5210)
{ 
  printk("Fatal: AR5210\n");
// AR5210 not tested here but... 
//AR5K_REG_ENABLE_BITS(ah, AR5K_PCICFG, AR5K_PCICFG_EEAE);
//ath5k_hw_reg_write(ah, data, AR5K_EEPROM_BASE + (4 * offset));
} else {
ath5k_hw_reg_write(ah, 0, AR5K_EEPROM_CMD); 
udelay(30);
AR5K_REG_ENABLE_BITS(ah, AR5K_EEPROM_CMD, AR5K_EEPROM_CMD_RESET);
udelay(30);
ath5k_hw_reg_write(ah, offset, AR5K_EEPROM_BASE);
ath5k_hw_reg_write(ah, *data, AR5K_EEPROM_DATA);
AR5K_REG_ENABLE_BITS(ah, AR5K_EEPROM_CMD, AR5K_EEPROM_CMD_WRITE);
udelay(30);
}
for (timeout = AR5K_TUNE_REGISTER_TIMEOUT; timeout > 0; timeout--)
{
status = ath5k_hw_reg_read(ah, AR5K_EEPROM_STATUS);
if (status & AR5K_EEPROM_STAT_WRDONE) { 
 if (status & AR5K_EEPROM_STAT_WRERR) { 
   printk(KERN_ERR " TP: -EIO"); return -EIO; 
   } 
 AR5K_EEPROM_READ( offset, *data);
 printk(KERN_INFO " Check: %04x", *data);
 return 0; }
udelay(15); }
status = ath5k_hw_reg_read(ah, AR5K_EEPROM_STATUS);
printk(KERN_ERR " status: %x", status);
printk(KERN_ERR " TP: -ETIMEDOUT");
ath5k_hw_reg_write(ah, 0, AR5K_EEPROM_STATUS);
AR5K_EEPROM_READ( offset, *data);
printk(KERN_ERR " Check: %x", (u32) *data);
return -ETIMEDOUT;
}

Questa funzione non fa altro che scrivere la eeprom in blocci di 2 byte ( WORD ).


A questo punto l'idea più semplice è ottenere un dump della eeprom della scheda autentica, cambiarne il mac address e scriverla sulla eeprom della scheda cinese.

Per fare ciò senza creare un device a blocchi, date le dimensioni esigue della eeprom, è sufficiente implementare con printk un semplice dump che finirà sui log.


Ciò è possibile farlo inserendo in ath5k_eeprom_init il seguente blocco di codice:

int offset;
u16 val;

printk("Dumping eeprom:\n");
for ( offset = 0; offset <  0x3ff; offset += 1 )
{
 AR5K_EEPROM_READ(offset, val);
 printk("%04x: %04x\n",offset,(unsigned int)val);
}
printk("Dump done\n");


Questo codice provvederà ad eseguire il dump della eeprom nel formato indirizzo:word.


Una volta eseguito il dump, è necessario trovare in esso il mac address della propria scheda , il quale sarà riportato in ordine inverso ( nel caso fosse 01:02:03:04:05:06 , ci sarà 0506 , 0304, 0102 ), e modificarne l'ultima cifra ( 05:06 ) prefribilmente.


Una volta creato il dump, con un semplice script python ( che verrà pubblicato a breve ) è possibile generare il sorgente C per chiamare la funzione ath5k_hw_eeprom_write per ogni word da scrivere sulla eeprom.

Per scrivere la eeprom è necessario, una volta rimosso il coperchio dello schermo RF va collegato a massa tramite una resistenza 150-300 ohm il pin Write Protect della eeprom in modo da abilitarne la scrittura, e va tenuto collegato durante tutta la procedura di scrittura.

Nonostante sia presente una resistenza di pullup da 10kOhm , la resistenza da collegare a massa è più che sufficiente a portare il pin allo 0 logico.





Una volta completata la scrittura, se la scheda da dove è stato preso il dump della eeprom a aveva un pezzo di materiale termoconduttore fra il coperchio dello schermo ed il chip wireless, è necessario applicarne uno anche sulla scheda cinese.

A questo punto è possibile utilzzare la scheda con i drivers non modificati come se fosse autentica.