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.