L'analisi del traffico di rete può essere una parte vitale del processo di debug e test del software. Questo tutorial ti insegnerà come monitorare tutto il traffico in entrata e in uscita su un dispositivo Android per poter eseguire il debug delle tue applicazioni!
Come sviluppatore, è spesso necessario creare software che esegua richieste HTTP, manda messaggi o acquisisca le informazioni dalle richieste in entrata o in uscita sulla rete. Quando queste transazioni di rete funzionano fin dall'inizio, tutto va bene; stiamo ricevendo esattamente ciò che ci si aspetta e ciò che stiamo inviando è formattato correttamente e con i valori corretti.
Tuttavia, questo spesso non accade, e bisogna capire esattamente cosa viene inviato e ricevuto sulla rete per determinare cosa è andato storto. Chissà, forse la richiesta non è nemmeno stata fatta e non ne siamo consapevoli! Questa è una circostanza in cui la conoscenza di come acquisire e analizzare il traffico di rete diventa cruciale.
Catturare il traffico di rete per analisi successive è buono, ma è ancora meglio se siamo in grado di eseguire questa analisi nello stesso momento in cui avviene la cattura. In tal modo, si può sapere quale richiesta o risposta corrisponde a ciascun caso d'uso, rendendo così l'analisi molto più semplice. Nei seguenti passaggi, ti mostrerò come acquisire il traffico in tempo reale da un dispositivo Android e collegarlo a un analizzatore di rete come Wireshark.
Il primo passo è installare tcpdump sul dispositivo. tcpdump è un'utilità della riga di comando che cattura il traffico su un particolare dispositivo di rete e lo scarica nel filesystem. tcpdump può essere scaricato da qui.
Una volta il tcpdump binario è stato scaricato, tutto ciò che dobbiamo fare è usare adb per spingere il file sul dispositivo. Per essere in grado di farlo, il tuo telefono deve essere collegato e correttamente identificato dal tuo computer.
Per prima cosa, è importante aggiornare il percorso aggiungendo la directory degli strumenti della piattaforma SDK di Android, se non l'hai ancora fatto. Nel caso non l'avessi mai fatto, ci sono istruzioni chiare su come farlo sulla pagina degli sviluppatori Android. Pronto? Aprire un terminale e digitare quanto segue:
dispositivi adb
Il dispositivo connesso dovrebbe apparire in un elenco. In caso contrario, assicurarsi che sia collegato correttamente e di disporre di tutti i driver necessari per quel portatile specifico.
Vedi il dispositivo sulla lista? Grande! Ora siamo pronti a spingere il tcpdump file su di esso:
adb push / home / tcpdump / data / local
Per eseguire i prossimi passi, dobbiamo ottenere i privilegi di root sul dispositivo e assicurarci che tcpdump è eseguibile:
adb shell cd data / local su chmod 777 tcpdump
È ora possibile avviare Tcpdump dalla stessa shell adb e l'output salvato in un file:
./ tcpdump -s 0 -v -w out.pcap
L'elenco completo delle opzioni di tcpdump è disponibile nella pagina man di tcpdump.
Una volta completato il dump, possiamo interrompere l'acquisizione dei dati. Per fare ciò, è sufficiente premere Ctrl + C. Il file risultante può essere estratto dal dispositivo e salvato localmente, in modo che possa essere analizzato usando Wireshark.
adb pull /data/local/out.pcap /home/out.pcap
Ma questo non è esattamente quello che volevamo, vero? Quello che vogliamo è essere in grado di condurlo Wireshark in tempo reale! Rilassati, ci stiamo arrivando.
Il processo di acquisizione dei pacchetti di rete è fondamentalmente lo stesso in questo caso. Tuttavia, invece di scrivere i datagrammi su un file, vogliamo scriverli sullo standard output, in modo che possiamo poi reindirizzare usando netcat a una porta specifica sul portatile.
Per fare ciò, il comando tcpdump deve cambiare leggermente:
shell adb "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345"
Il traffico viene ora reindirizzato alla porta 12345 nel telefono.
Prima di andare avanti, assicurati di averlo netcat installato, come avremo bisogno di esso. Digita nc in una nuova console, premi invio e guarda cosa succede. Ricevi il messaggio standard che spiega come usare il comando? Fantastico, sei a posto. Salta il resto di questa sezione e continua!
Stai ancora leggendo? Beh, immagino che questo significhi che tu non abbia netcat installato dopo tutto. Non farti prendere dal panico, puoi scaricarlo da qui per Windows.
Ricorda ciò che abbiamo menzionato in precedenza per quanto riguarda l'aggiornamento del percorso in modo che adb sarebbe disponibile? Vuoi farlo con netcat e Wireshark anche.
Una volta fatto, possiamo usare adbL'opzione forward, che inoltrerà i pacchetti dalla porta tcp 12345 nel dispositivo alla porta TCP 54321 sul PC. Useremo nuovamente netcat per afferrare quei pacchetti in arrivo che arrivano attraverso la porta 54321 e li colleghiamo a Wireshark.
Questo viene fatto nel seguente comando, digitato in una nuova console:
adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -
Si noti che il numero della porta scelta è irrilevante. L'unica ragione per cui sono stati scelti numeri diversi è mostrare come i diversi comandi si connettono tra loro. Lo stesso numero di porta avrebbe potuto essere usato per entrambi i comandi (o numeri diversi da quelli precedenti, a patto che le porte non vengano usate!) E quindi funzionerebbero allo stesso modo.
Devi assicurartelo Wireshark funziona con le autorizzazioni corrette Altrimenti, anche quando Wireshark viene aperto, apparirà un popup che ti informa di un'eccezione.
Una volta impostate le diverse utilità, il processo di acquisizione del traffico di rete e convogliamento Wireshark viene fatto attraverso due comandi, contemporaneamente in esecuzione in due diversi terminali:
shell adb "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345" adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -
Ora, questo processo è ancora piuttosto manuale. Uno deve aprire manualmente due terminali e digitare tutte quelle istruzioni, assicurandosi che nulla sia lasciato indietro affinché funzioni. Questo è un fastidio. Bene, questo problema si risolve facilmente inserendo queste istruzioni in uno script, in modo che faccia tutto il lavoro per noi.
Gli utenti Windows possono automatizzare il processo utilizzando lo script nel file di download allegato a questo post.
avvia adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345" adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -
Se hai seguito questo tutorial su un Mac, probabilmente stai grattando la testa, pensando perché il processo di cui sopra non sembra funzionare per te. Ci sono un paio di motivi per cui questo potrebbe essere il caso. Proviamo a risolvere il problema.
Prima di tutto, assicurati di utilizzare il percorso corretto di Wireshark! Questo potrebbe sembrare banale, ma non lo è. Non vuoi utilizzare il percorso per l'app, ma l'intero percorso verso il reale Wireshark eseguibile (ad esempio "/Applications/Wireshark.app/Contents/Resources/bin/wireshark").
Fisso? Buono! Ancora un paio di cose da fare. Quando invocando Wireshark attraverso la riga di comando, stiamo usando un segno meno alla fine. Questo rappresenta lo standard input e in Windows funzionerà bene. Tuttavia, questo non funzionerà su un Mac. Fortunatamente, questo può essere sostituito con il nome di un tubo. Si desidera specificare 2 (corrispondente a lo0) come la pipa da utilizzare. Inoltre, potrebbe essere necessario concedere permessi super-utente per essere in grado di eseguire Wireshark. Questo è il comando risultante che si desidera utilizzare:
adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2
Questo è lo script perl che funzionerà per gli utenti Mac (è anche allegato come download a questo post):
#! / usr / bin / perl # Esegue il comando adb sulla shell # per verificare se il dispositivo è collegato $ netstat = 'adb shell' netstat '2> & 1'; if ($ netstat = ~ m / error: device not found /) die ("Collega il tuo telefono! \ n"); # Ottieni i privilegi di root aperti (SUDO, "| sudo echo" "); close (SUDO); # Reindirizza l'output STDERR a STDOUT apre STDERR, '> & STDOUT'; # Esegue tcpdump e nc in background aperto (COMMAND1," (adb shell \ "data / local / tcpdump -n -s 0 -w - | nc -l -p 12345 \") | "); # Esegue piping a wireshark aperto (COMMAND2," ((adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2) &) 2> & 1> / dev / null | "); # Accertarsi che il messaggio di uscita venga visualizzato dopo che wireshark è stato avviato (hacky) sleep (5) ; print ("Premere ctrl-c per uscire ...");;