J'ai récemment acheté une Nexus 7 pour l'utiliser comme client de démonstration pour un système que je suis en train de développer. Pour l'instant, le système exige que le client ait une adresse MAC particulière pour pouvoir fonctionner. J'ai enraciné la Nexus (toujours avec la ROM stock d'Android 4.4), et j'utilise la fonction ip link
pour modifier l'adresse matérielle de wlan0
. Je suis conscient que cela sera réinitialisé au redémarrage, mais comme je ne préfère pas recompiler mon noyau Android en ce moment, c'est bon.
Le problème que je rencontre est que je ne parviens pas à obtenir une adresse IP de mon réseau WiFi (ouvert) avec une adresse MAC modifiée. Si je définis une IP statique, je peux me connecter avec succès avec l'adresse modifiée, mais aucun paquet ne passe.
J'espère que la transcription ci-dessous vous éclairera sur ce qui ne fonctionne pas exactement et sur ce que j'ai essayé.
D'abord, j'oublie ma connexion WiFi et je redémarre mon appareil pour repartir de zéro. Ensuite :
$ adb shell
shell@flo:/ $ su
root@flo:/ # ip link | grep -A1 wlan0
22: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT qlen 100
link/ether ac:22:0b:9f:37:f7 brd ff:ff:ff:ff:ff:ff
root@flo:/ # ip link set dev wlan0 addr ac:22:0b:9f:37:f0
Ici, je me connecte au réseau sans fil. Si DHCP est sélectionné, le message "Obtaining IP address" s'affiche simplement jusqu'à ce que la connexion échoue. Si je définis une IP statique, le réseau est affiché comme étant connecté, mais.. :
root@flo:/ # ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
From 192.168.1.113: icmp_seq=1 Destination Host Unreachable
From 192.168.1.113: icmp_seq=2 Destination Host Unreachable
^C
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1004ms
pipe 2
1|root@flo:/ # ip route
default via 192.168.1.1 dev wlan0
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.113
192.168.1.1 dev wlan0 scope link
1|root@flo:/ # ip n
192.168.1.1 dev wlan0 INCOMPLETE
255|root@flo:/ # ip n change 192.168.1.1 lladdr 10:0D:7F:4D:1C:D0 dev wlan0
root@flo:/ # ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
^C
--- 192.168.1.1 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 6006ms
Donc, toujours pas de connexion. Voyons ce qui se passe si je change mon adresse MAC pour la vraie sans même me déconnecter du réseau sans fil :
root@flo:/ # ip link set dev wlan0 addr ac:22:0b:9f:37:f7
root@flo:/ # ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=13.0 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=9.82 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=9.49 ms
^C
--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 9.491/10.793/13.061/1.609 ms
Quelqu'un a-t-il une idée de ce qui pourrait se passer ici ?
Pour ce que cela vaut, j'utilise DD-WRT sur mon routeur, aucun filtrage MAC n'est activé et aucune autre règle "bizarre" ne devrait être définie.
UPDATE : Après quelques recherches supplémentaires, j'ai remarqué qu'il semble que la Nexus 7 n'utilise pas du tout l'adresse usurpée lorsqu'elle communique avec mon AP. J'ai activé le filtrage MAC et autorisé uniquement l'adresse usurpée. adb logcat
montre un CTRL-EVENT-ASSOC-REJECT
message. Je me demande si cela n'a pas un lien quelconque avec ce wpa_supplicant, mais il n'y avait pas non plus de réponse à cette question...