Android ne sera pas aussi facile qu'iOS. Il n'existe pas d'équivalent de Bonjour.
Android 4.0, Ice Cream Sandwich, présenté Wi-Fi Direct Le réseau Peer to Peer. Au début, j'espérais qu'il pourrait être analysé comme vous le pensez, mais il aide les appareils Android à communiquer sans point d'accès, ils ne sont donc pas vraiment "sur votre réseau". De plus, ICS ne fonctionne que sur une fraction des appareils Android.
Plutôt qu'une approche de netscan active, vous vous retrouvez avec une approche de surveillance passive. Si votre réseau est sécurisé, renifler le paquet crypté est possible, mais peu pratique. Vous devrez
- mettez votre interface réseau dans mode moniteur
- capturer le poignée de main à 4 voies
- le décrypter en utilisant la clé pré-partagée du réseau.
- cela vous donnera la clé dont vous avez besoin pour décrypter le trafic
Si vous voulez voir ça en action, Wireshark soutient Décryptage WPA .
Une fois que vous êtes en mesure de visualiser le trafic Wi-Fi, vous remarquerez que les appareils Android ont tendance à communiquer avec certains serveurs Google et leurs connexions HTTP ont Les chaînes de l'agent utilisateur qui peuvent être identifiées . C'est la base d'une solution passive viable.
Tenable Network Security proposent des produits qui semblent adopter ce type d'approche.
Une autre idée
@Michelle Cannon a mentionné Meshlium Xtreme de Libelium, dont l'approche ne vous permettra pas d'atteindre tous les objectifs (pas sans de bonnes tables d'adresses MAC à jour). Mais elle pourrait permettre d'atteindre un objectif moins important. Vous le pouvez :
- Détecter tous les dispositifs sans fil
- Éliminer les appareils Apple utilisant l'identifiant unique d'organisation (OUI) du MAC.
- Dites qu'il s'agit d'un appareil mobile en surveillant l'intensité du signal pour déterminer s'il est en mouvement (les appareils mobiles ont tendance à apparaître et à disparaître).
- Vous pouvez utiliser le MAC OUI comme indice, c'est Android.
- Vous pouvez peut-être utiliser le MAC OUI comme indice qu'il ne s'agit pas d'Android (mais d'un ordinateur portable ou d'une carte sans fil, etc.)
Cela peut fonctionner si vous voulez détecter les appareils qui sont probablement Android.
Empreinte digitale DHCP
@Michelle Cannon a suggéré le DHCP fingerprinting. Je n'étais pas sûr au début, mais je dois le remercier d'avoir suggéré ce qui semble être la meilleure solution pour une analyse passive simple. En guise d'avertissement, j'aimerais expliquer pourquoi je suis arrivé en retard à la fête.
Il y a des choses que nous savons, des choses que nous ne savons pas, et des choses que nous pensons savoir mais qui sont fausses.
À bien des égards, c'est une bonne chose qu'Android utilise le noyau Linux. Mais ce n'est pas une bonne chose si vous voulez découvrir les appareils Android sur votre réseau. La pile TCP/IP d'Android est celle de Linux et les appareils Android ressembleront donc à des appareils Linux, du moins c'est ce que je pensais au début. Mais ensuite j'ai réalisé que Linux a beaucoup de paramètres de configuration de la construction, de sorte qu'il pourrait y avoir quelque chose de distinctif sur Android lorsqu'il est vu sur un réseau, mais quoi ?
Le fingerprinting DHCP utilise les options DHCP exactes demandées par le dispositif, plus le timing. Pour que cela fonctionne, il faut généralement disposer d'une base de données d'empreintes digitales à jour. Au début, ça ressemblait à fingerbank était très fier d'obtenir ces données, mais j'ai ensuite remarqué que leurs fichiers n'avaient pas été mis à jour depuis presque un an. Avec tous les différents types d'appareils Android, je ne pense pas qu'il soit pratique de conserver des empreintes digitales mises à jour pour un seul projet.
Mais ensuite j'ai regardé les signatures DHCP pour Android et j'ai remarqué ceci :
Android 1.0: dhcpvendorcode=dhcpcd 4.0.0-beta9
Android 1.5-2.1: dhcpvendorcode=dhcpcd 4.0.1
Android 2.2: dhcpvendorcode=dhcpcd 4.0.15
Android 3.0: dhcpvendorcode=dhcpcd-5.2.10
Linux utilise normalement dhclient comme client DHCP, mais Android utilise dhcpcd. Android a une forte préférence pour l'utilisation de logiciels sous licence BSD lorsque cela est possible et dhcpcd utilise une licence BSD. Il semblerait que dhcpvendorcode puisse être utilisé comme un indicateur fort qu'un appareil mobile fonctionne sous Android.
Surveillance du DHCP
Un client utilise le DHCP pour obtenir une adresse IP lorsqu'il se joint à un réseau, il commence donc sans adresse IP. Il contourne ce problème en utilisant les diffusions UDP pour l'échange initial. Sur le Wi-Fi, même avec WPA, le trafic de diffusion n'est pas crypté. Il suffit donc d'écouter le port UDP 67 pour le trafic client-serveur et 68 pour l'inverse. Vous n'avez même pas besoin de mettre votre interface réseau en mode promiscuous. Vous pouvez facilement surveiller ce trafic en utilisant un analyseur de protocole comme Wireshark.
J'ai préféré écrire du code pour surveiller le trafic et j'ai décidé d'utiliser Python. J'ai choisi pydhcplib pour gérer les détails du DHCP. Mon expérience avec cette bibliothèque n'a pas été sans heurts. J'ai dû télécharger et placer manuellement les fichiers de support IN.py et TYPES.py. Et leur conversion de paquets en chaînes de caractères laissait le dhcpvendorcode vide. Il a analysé les paquets DHCP correctement, alors j'ai simplement écrit mon propre code d'impression.
Voici un code qui surveille le trafic DHCP du client au serveur :
#!/usr/bin/python
from pydhcplib.dhcp_packet import *
from pydhcplib.dhcp_network import *
from pydhcplib.dhcp_constants import *
netopt = {
'client_listen_port':"68",
'server_listen_port':"67",
'listen_address':"0.0.0.0"
}
class Server(DhcpServer):
def __init__(self, options):
DhcpServer.__init__(
self,options["listen_address"],
options["client_listen_port"],
options["server_listen_port"])
def PrintOptions(self, packet, options=['vendor_class', 'host_name', 'chaddr']):
# uncomment next line to print full details
# print packet.str()
for option in options:
# chaddr is not really and option, it's in the fixed header
if option == 'chaddr':
begin = DhcpFields[option][0]
end = begin+6
opdata = packet.packet_data[begin:end]
hex = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
print option+':', ':'.join([(hex[i/16]+hex[i%16]) for i in opdata])
else:
opdata = packet.options_data.get(option)
if opdata:
print option+':', ''.join([chr(i) for i in opdata if i != 0])
print
def HandleDhcpDiscover(self, packet):
print "DHCP DISCOVER"
self.PrintOptions(packet)
def HandleDhcpRequest(self, packet):
print "DHCP REQUEST"
self.PrintOptions(packet)
## def HandleDhcpDecline(self, packet):
## self.PrintOptions(packet)
## def HandleDhcpRelease(self, packet):
## self.PrintOptions(packet)
## def HandleDhcpInform(self, packet):
## self.PrintOptions(packet)
server = Server(netopt)
while True :
server.GetNextDhcpPacket()
Ce code est basé sur l'exemple du serveur de pydhcplib car il écoute les demandes des clients, comme un serveur.
Lorsque ma tablette Nexus 7 Android 4.2 se connecte, cette information intéressante est capturée (expurgée) :
DHCP REQUEST
vendor_class: dhcpcd-5.5.6
host_name: android-5c1b97cdffffffff
chaddr: 10:bf:48:ff:ff:ff
DHCP DISCOVER
vendor_class: dhcpcd-5.5.6
host_name: android-5c1b97cdffffffff
chaddr: 10:bf:48:ff:ff:ff
Le nom d'hôte semble avoir un format fixe et est facilement analysé. Si vous avez besoin de l'adresse IP, vous pouvez surveiller le trafic entre le serveur et le client. Remarque : seul l'échange initial, lorsqu'un nouveau client se présente sans adresse IP, est diffusé. Les futures extensions de bail, etc., ne sont pas diffusées.
@Luis a posté une excellente solution qui démontre que le plus simple est le mieux. Même après avoir vu que le client DHCP d'Android définissait le nom d'hôte à Android-5c1b97cdffffffff, je n'ai pas pensé à demander au routeur sa liste de noms en utilisant des recherches DNS inversées. Le routeur ajoute le nom d'hôte à son serveur DNS afin que vous puissiez toujours accéder à l'appareil si son adresse IP change.
Le nom d'hôte est censé rester listé dans le DNS pendant la durée du bail DHCP. Vous pouvez vérifier si le périphérique est toujours présent en pinging il.
L'inconvénient de dépendre du nom de l'hôte est qu'il est possible de le modifier. Il est facile pour le fabricant de l'appareil ou l'opérateur de changer le host_name (bien qu'après avoir cherché, je n'ai pas pu trouver de preuve qu'ils l'aient fait). Il existe Apps pour changer de nom d'hôte mais ils ont besoin de Root, donc c'est, tout au plus, un cas limite.
Enfin, il y a une ouverture Android Issue 6111 : Permettre la spécification d'un nom d'hôte qui compte actuellement 629 étoiles. Il ne serait pas surprenant de voir le nom d'hôte configurable dans les paramètres d'Android à un moment donné dans le futur, peut-être bientôt. Donc, si vous commencez à dépendre du nom d'hôte pour identifier les appareils Android, sachez qu'il pourrait vous être retiré.
Si vous effectuez un suivi en direct, un autre problème potentiel de la recherche inverse de DNS est que vous devez décider de la fréquence de l'analyse. (Bien sûr, ce n'est pas un problème si vous ne prenez qu'un seul instantané). Un balayage fréquent consomme des ressources réseau, un balayage peu fréquent vous laisse avec des données périmées. Voici comment l'ajout de la surveillance DHCP peut vous aider :
- Au démarrage, utiliser le Reverse DNS Lookup pour trouver les appareils.
- Ping des périphériques pour voir s'ils sont toujours actifs
- Surveillez le trafic DHCP pour détecter instantanément les nouveaux appareils.
- De temps en temps, relancez le DNS Lookup pour trouver des dispositifs que vous auriez pu manquer.
- Si vous avez besoin de remarquer le départ de périphériques, faites un ping aux périphériques à la résolution temporelle désirée.
Bien qu'il ne soit pas facile (ni précis à 100 %), il existe plusieurs techniques qui le permettent. possible pour découvrir les appareils Android sur votre réseau.
0 votes
Jetez un coup d'œil à ceci, cela pourrait vous aider [Stack Link][1] [1] : stackoverflow.com/questions/6792130/découverte des dispositifs réseau
0 votes
Merci, mais ce n'est pas tout à fait ce que je recherche ! Je cherche un moyen de découvrir les clients Android sans installer de service sur eux. Cela suggère d'installer un service Bonjour sur eux, puis d'utiliser mDNS. Je cherche quelque chose qui est déjà "ouvert" sur les appareils Android pour aider à les découvrir.
0 votes
Il serait utile que vous décriviez votre architecture réseau. La machine en cours d'exécution découvre-t-elle le point d'accès Wi-Fi, un autre client Wi-Fi sur le même réseau, ou autre chose ?
0 votes
Bonjour ou plus généralement dns-sd fonctionne au-dessus de dns sur le réseau, ce n'est pas de la magie, les appareils Apple exécutent un service dns-sd, les appareils Android n'ont aucune sorte de support bonjour intégré, mais vous pouvez exécuter un service dns-sd en arrière-plan comme jDMS. Une exception pourrait être si l'appareil supporte le bluetooth, si vous recherchez des appareils bluetooth, Android a un support et vous pouvez rechercher des appareils bluetooth et ensuite interroger les enregistrements SDDP pour obtenir des informations sur l'appareil. Sinon, vous demandez de la magie qui n'existe pas.
0 votes
Pas besoin de commentaires hargneux sur la "magie"... Je comprends la barrière technique et le fait que les appareils Apple exécutent certaines sortes de services (par exemple, Bonjour), préchargés. Ma question est de savoir s'il existe un service sur Android que j'ai manqué et qui fait quelque chose de similaire. J'ai mis la condition de ne pas ajouter un service, parce que sinon tout le monde répondrait : "ajoutez simplement un service bonjour !" Je comprends la différence et la réponse finale peut simplement être : "il n'y en a pas". C'est très bien, je demande de l'aide. Certaines choses dont j'ignorais l'existence ont tendance à apparaître quand on demande aux autres.
0 votes
Oui, voir ma réponse ci-dessous, j'ai aussi trouvé des alternatives et j'ai ensuite pensé à d'autres moyens, en utilisant une surveillance plus active plutôt que passive, l'article dont je donne l'url est assez intéressant, il explique comment vous pouvez mesurer la pénétration des appareils sur des hotspots wifi comme ceux des centres commerciaux. Je soupçonne que les services gps d'intérieur fonctionnent de manière similaire, des choses fascinantes.
0 votes
Vous ne pouvez pas compter sur un nom d'hôte comme celui-ci sur les appareils antérieurs à Android 2.2. Ce qui est un groupe assez important
0 votes
@MichelleCannon ... selon Google, ce n'est pas vrai : developer.Android.com/about/dashboards/index.html Seuls 3% sont encore sur une version antérieure à Android 2.2
0 votes
Quelque chose de similaire existe pour Android mais c'est plutôt nouveau developer.Android.com/training/connect-devices-wirelessly/ Découverte de services réseau. Et jusqu'à présent, il est derrière jmDNS parce qu'il ne peut pas récupérer correctement les enregistrements TXT.
0 votes
Excellente question @gnychis. Savez-vous comment mettre en œuvre la même chose dans iOS. Un exemple de code serait utile.
0 votes
@gnychis Juste une petite question, pour être clair pour moi.
192.168.1.104
est l'IP de votre appareil Android sur le réseau wifi et192.168.1.1
Est-ce l'IP de votre routeur wifi ? Ou bien il s'agit d'un autre serveur et je l'utilise mal ? Merci.0 votes
Notez que votre solution/mise à jour peut ne pas fonctionner pour les appareils Samsung qui permettent à l'utilisateur de nommer le nom d'hôte et n'ont pas souvent "Android" dans le nom d'hôte contrairement à d'autres marques.