L'analyse du trafic réseau peut constituer un élément essentiel du processus de débogage et de test du logiciel. Ce tutoriel va vous apprendre à surveiller tout le trafic entrant et sortant sur un appareil Android afin de mieux déboguer vos applications.!
En tant que développeur, il est souvent nécessaire de créer un logiciel qui exécute des requêtes HTTP, envoie des messages ou récupère des informations à partir de requêtes entrantes ou sortantes sur le réseau. Lorsque ces transactions réseau fonctionnent dès le début, tout va bien; nous recevons exactement ce qui est attendu et ce que nous envoyons est correctement formaté et avec les valeurs correctes.
Cependant, cela n'arrive pas souvent et il est nécessaire de comprendre exactement ce qui est envoyé et reçu sur le réseau afin de déterminer ce qui ne va pas. Qui sait, peut-être que la demande n'est même pas faite et que nous n'en sommes pas conscients! C’est une situation dans laquelle il est crucial de savoir comment capturer et analyser le trafic réseau..
Capturer le trafic réseau pour une analyse ultérieure est une bonne chose, mais c'est encore mieux si nous pouvons effectuer cette analyse en même temps que la capture a lieu. Ce faisant, on peut savoir quelle requête ou quelle réponse correspond à chaque cas d'utilisation, ce qui facilite grandement l'analyse. Dans les étapes suivantes, je vais vous montrer comment capturer le trafic en temps réel depuis un appareil Android et le transmettre à un analyseur de réseau tel que Wireshark..
La première étape consiste à installer tcpdump sur l'appareil. tcpdump est un utilitaire de ligne de commande qui capture le trafic sur un périphérique réseau particulier et le renvoie au système de fichiers. tcpdump peut être téléchargé à partir d'ici.
Une fois la tcpdump binaire a été téléchargé, tout ce que nous avons à faire est d’utiliser adb pour envoyer le fichier sur le périphérique. Pour pouvoir le faire, votre ordinateur doit être connecté et correctement identifié par votre ordinateur..
Tout d’abord, il est important de mettre à jour votre chemin en y ajoutant le répertoire des outils de la plate-forme SDK d’Android si vous ne l’avez pas encore fait. Au cas où vous ne l'auriez jamais fait, la page des développeurs Android contient des instructions claires. Prêt? Ouvrez un terminal et tapez ce qui suit:
périphériques adb
L'appareil connecté devrait apparaître dans une liste. Si ce n'est pas le cas, assurez-vous qu'il est correctement connecté et que vous avez tous les pilotes nécessaires pour ce combiné spécifique..
Voir l'appareil sur la liste? Génial! Nous sommes maintenant prêts à pousser le tcpdump déposer dessus:
adb push / home / tcpdump / data / local
Pour effectuer les prochaines étapes, nous devons obtenir les privilèges root sur le périphérique et nous assurer que tcpdump est exécutable:
shell cd données / local su chmod 777 tcpdump
Tcpdump peut maintenant être lancé à partir du même shell adb et la sortie sauvegardée dans un fichier:
./ tcpdump -s 0 -v -w out.pcap
La liste complète des options de tcpdump est disponible dans la page de manuel de tcpdump.
Une fois le vidage terminé, nous pouvons arrêter de capturer les données. Pour ce faire, vous devez simplement appuyer sur Ctrl + C. Le fichier résultant peut être extrait de l'appareil et enregistré localement, de sorte qu'il puisse être analysé à l'aide de Wireshark.
adb pull /data/local/out.pcap /home/out.pcap
Mais ce n'est pas exactement ce que nous voulions, n'est-ce pas? Ce que nous voulons, c'est pouvoir le diriger vers Wireshark en temps réel! Détendez-vous, nous y arrivons.
Le processus de capture des paquets réseau est fondamentalement le même dans ce cas. Cependant, au lieu d’écrire les datagrammes dans un fichier, nous voulons les écrire sur la sortie standard afin de pouvoir les rediriger à l’aide de netcat vers un port spécifique du combiné.
Pour ce faire, la commande tcpdump doit être légèrement modifiée:
shell adb "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345"
Le trafic est maintenant redirigé vers le port 12345 du combiné..
Avant d’aller plus loin, s’assurons que vous avez bien netcat installé, comme nous allons en avoir besoin. Tapez nc dans une nouvelle console, appuyez sur Entrée et regardez ce qui se passe. Recevez-vous le message standard expliquant comment utiliser la commande? Génial, vous êtes prêt à partir. Passer le reste de cette section et continuer!
Toujours en train de lire? Eh bien, je suppose que cela signifie que vous n'avez pas netcat installé après tout. Ne paniquez pas, vous pouvez le télécharger ici pour Windows.
Rappelez-vous ce que nous avons mentionné précédemment concernant la mise à jour du chemin afin que adb serait disponible? Tu veux faire ça avec netcat et Wireshark ainsi que.
Une fois que cela est fait, nous pouvons utiliser adbL'option de transmission, qui transfère les paquets du port TCP 12345 du périphérique vers le port TCP 54321 du PC. Nous utiliserons à nouveau netcat pour récupérer les paquets entrants entrant par le port 54321 et les acheminer vers Wireshark.
Ceci est fait dans la commande suivante, tapée dans une nouvelle console:
adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | filshark -k -S -i -
Notez que le numéro du port choisi est sans importance. La seule raison pour laquelle différents numéros ont été choisis est de montrer comment les différentes commandes se connectent. Le même numéro de port aurait pu être utilisé pour les deux commandes (ou des numéros différents de ceux indiqués ci-dessus, tant que les ports ne sont pas utilisés!), Puis ils fonctionneraient exactement de la même manière..
Vous devez vous assurer que Wireshark fonctionne avec les autorisations appropriées. Sinon, même quand Wireshark s'ouvre, une fenêtre apparaîtra pour vous informer d'une exception.
Une fois les différents utilitaires configurés, le processus de capture du trafic réseau et de son acheminement vers Wireshark se fait par deux commandes, s'exécutant simultanément dans deux terminaux différents:
adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345" adb retransmission tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | filshark -k -S -i -
Maintenant, ce processus est encore assez manuel. Il faut ouvrir manuellement deux terminaux et taper toutes ces instructions, en s’assurant que rien n’est laissé pour que cela fonctionne. Ceci est une nuisance. Eh bien, ce problème est facilement résolu en mettant ces instructions dans un script, de sorte qu'il effectue tout le travail à notre place..
Les utilisateurs Windows peuvent automatiser le processus à l'aide du script figurant dans le fichier de téléchargement joint à cet article..
start adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345" adb transférer tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | filshark -k -S -i -
Si vous avez suivi ce didacticiel sur un Mac, vous vous demandez probablement pourquoi le processus ci-dessus ne semble pas vraiment fonctionner pour vous. Cela peut être le cas pour plusieurs raisons. Essayons de résoudre ce problème.
Tout d’abord, assurez-vous d’utiliser le bon chemin de Wireshark! Cela peut sembler trivial, mais ce n’est pas. Vous ne voulez pas utiliser le chemin d'accès à l'application, mais le chemin d'accès complet à la Wireshark exécutable (par exemple, "/Applications/Wireshark.app/Contents/Resources/bin/wireshark").
Fixé? Bien! Encore quelques choses à faire. En invoquant Wireshark via la ligne de commande, nous utilisons un signe moins à la fin. Cela représente l’entrée standard et sous Windows cela fonctionnera très bien. Cependant, cela ne fonctionnera pas sur un Mac. Heureusement, cela peut être remplacé par le nom d'un tuyau. Vous souhaitez spécifier 2 (correspondant à lo0) comme canal à utiliser. En outre, vous devrez peut-être accorder des autorisations de super utilisateur pour pouvoir exécuter Wireshark. Voici la commande résultante que vous souhaitez utiliser:
adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2
C’est le script Perl qui fonctionnera pour les utilisateurs de Mac (il est également disponible en téléchargement dans ce message):
#! / usr / bin / perl # Exécutez la commande adb sur le shell # pour vérifier si le périphérique est connecté $ netstat = 'shell adb' netstat '2> & 1'; if ($ netstat = ~ m / error: périphérique non trouvé /) die ("Branchez votre téléphone! \ n"); # Acquérir les privilèges root ouverts (SUDO, "| sudo echo" "); fermer (SUDO); # Rediriger la sortie STDERR vers STDOUT open STDERR, '> & STDOUT'; # Effectuer tcpdump et nc en tâche de fond ouverte shell \ "data / local / tcpdump -n -s 0 -w - | nc -l -p-12345 \") | "); # Effectue la tuyauterie vers la pile de fils ouverte (COMMAND2," (tbp suivant: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2) &) 2> & 1> / dev / null | "); # Assurez-vous que le message de sortie apparaît après le lancement deowshark (hacky) sleep (5) ; print ("Appuyez sur ctrl-c pour quitter ...");;