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:
1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<b>/* * Write to eeprom */</b> <b>static</b> <b>int</b> ath5k_hw_eeprom_write<b>(</b><b>struct</b> ath5k_hw <b>*</b>ah<b>,</b> u32 offset<b>,</b> u16 <b>*</b>data<b>)</b> <b>{</b> u32 status<b>,</b> timeout<b>;</b> <b>*</b>data <b>&=</b> <b>0xffff</b><b>;</b> <b>/* * Initialize EEPROM access */</b> <b>if</b> <b>(</b>ah<b>-></b>ah_version <b>==</b> AR5K_AR5210<b>)</b> <b>{</b> printk<b>(</b><b>"Fatal: AR5210</b><b>n</b><b>"</b><b>);</b> <b>// AR5210 not tested here but... </b> <b>//AR5K_REG_ENABLE_BITS(ah, AR5K_PCICFG, AR5K_PCICFG_EEAE);</b> <b>//ath5k_hw_reg_write(ah, data, AR5K_EEPROM_BASE + (4 * offset));</b> <b>}</b> <b>else</b> <b>{</b> ath5k_hw_reg_write<b>(</b>ah<b>,</b> <b>0</b><b>,</b> AR5K_EEPROM_CMD<b>);</b> udelay<b>(</b><b>30</b><b>);</b> AR5K_REG_ENABLE_BITS<b>(</b>ah<b>,</b> AR5K_EEPROM_CMD<b>,</b> AR5K_EEPROM_CMD_RESET<b>);</b> udelay<b>(</b><b>30</b><b>);</b> ath5k_hw_reg_write<b>(</b>ah<b>,</b> offset<b>,</b> AR5K_EEPROM_BASE<b>);</b> ath5k_hw_reg_write<b>(</b>ah<b>,</b> <b>*</b>data<b>,</b> AR5K_EEPROM_DATA<b>);</b> AR5K_REG_ENABLE_BITS<b>(</b>ah<b>,</b> AR5K_EEPROM_CMD<b>,</b> AR5K_EEPROM_CMD_WRITE<b>);</b> udelay<b>(</b><b>30</b><b>);</b> <b>}</b> <b>for</b> <b>(</b>timeout <b>=</b> AR5K_TUNE_REGISTER_TIMEOUT<b>;</b> timeout <b>></b> <b>0</b><b>;</b> timeout<b>--)</b> <b>{</b> status <b>=</b> ath5k_hw_reg_read<b>(</b>ah<b>,</b> AR5K_EEPROM_STATUS<b>);</b> <b>if</b> <b>(</b>status <b>&</b> AR5K_EEPROM_STAT_WRDONE<b>)</b> <b>{</b> <b>if</b> <b>(</b>status <b>&</b> AR5K_EEPROM_STAT_WRERR<b>)</b> <b>{</b> printk<b>(</b>KERN_ERR <b>" TP: -EIO"</b><b>);</b> <b>return</b> <b>-</b>EIO<b>;</b> <b>}</b> AR5K_EEPROM_READ<b>(</b> offset<b>,</b> <b>*</b>data<b>);</b> printk<b>(</b>KERN_INFO <b>" Check: %04x"</b><b>,</b> <b>*</b>data<b>);</b> <b>return</b> <b>0</b><b>;</b> <b>}</b> udelay<b>(</b><b>15</b><b>);</b> <b>}</b> status <b>=</b> ath5k_hw_reg_read<b>(</b>ah<b>,</b> AR5K_EEPROM_STATUS<b>);</b> printk<b>(</b>KERN_ERR <b>" status: %x"</b><b>,</b> status<b>);</b> printk<b>(</b>KERN_ERR <b>" TP: -ETIMEDOUT"</b><b>);</b> ath5k_hw_reg_write<b>(</b>ah<b>,</b> <b>0</b><b>,</b> AR5K_EEPROM_STATUS<b>);</b> AR5K_EEPROM_READ<b>(</b> offset<b>,</b> <b>*</b>data<b>);</b> printk<b>(</b>KERN_ERR <b>" Check: %x"</b><b>,</b> <b>(</b>u32<b>)</b> <b>*</b>data<b>);</b> <b>return</b> <b>-</b>ETIMEDOUT<b>;</b> <b>}</b> |
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:
1 2 3 4 5 6 7 8 9 10 |
<pre style="background-color: black; color: #b2b2b2; font-weight: bold;"><b>int</b> offset<b>;</b> u16 val<b>;</b> printk<b>(</b><b>"Dumping eeprom:</b><b>n</b><b>"</b><b>);</b> <b>for</b> <b>(</b> offset <b>=</b> <b>0</b><b>;</b> offset <b><</b> <b>0x3ff</b><b>;</b> offset <b>+=</b> <b>1</b> <b>)</b> <b>{</b> AR5K_EEPROM_READ<b>(</b>offset<b>,</b> val<b>);</b> printk<b>(</b><b>"%04x: %04x</b><b>n</b><b>"</b><b>,</b>offset<b>,(</b><b>unsigned</b> <b>int</b><b>)</b>val<b>);</b> <b>}</b> printk<b>(</b><b>"Dump done</b><b>n</b><b>"</b><b>);</b> |
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.