Analyserer Android Network Traffic

Nettverkstrafikkanalyse kan være en viktig del av programvarefeilsøkings- og testprosessen. Denne opplæringen vil lære deg hvordan du overvåker all innkommende og utgående trafikk på en Android-enhet for å bedre feilsøke applikasjonene dine!

Som utvikler må man ofte bygge programvare som utfører HTTP-forespørsler, sender meldinger eller tar tak i informasjon fra innkommende eller utgående forespørsler over nettverket. Når disse nettverkstransaksjonene fungerer fra begynnelsen, er alt bra; Vi mottar nøyaktig hva som forventes og det vi sender er riktig formatert og med de riktige verdiene.

Dette skjer imidlertid ikke ofte, og man må forstå nøyaktig hva som blir sendt og mottatt over nettverket for å avgjøre hva som har gått galt. Hvem vet, kanskje forespørselen ikke engang blir gjort, og vi er ikke klar over det! Dette er en situasjon der det å være avgjørende å vite hvordan å fange og analysere nettverkstrafikken.

Det er bra å fange nettverkstrafikk for senere analyse, men det er enda bedre hvis vi klarer å utføre denne analysen samtidig som opptaket finner sted. Ved å gjøre det kan man vite hvilken forespørsel eller svar som tilsvarer hver brukstilstand, og dermed gjøre analysen mye lettere. I de følgende trinnene vil jeg vise deg hvordan du tar opp trafikk i sanntid fra en Android-enhet og rør den til et nettverksanalysator som Wireshark.


Trinn 1: Installere tcpdump

Det første trinnet er å installere tcpdump på enheten. tcpdump er et kommandolinjeverktøy som fanger trafikken på en bestemt nettverksenhet og dumper den til filsystemet. tcpdump kan lastes ned herfra.

Først når tcpdump binær er lastet ned, alt vi trenger å gjøre er å bruke adb for å skyve filen på enheten. For å kunne gjøre dette må håndsettet være koblet til og riktig identifisert av datamaskinen.

Først og fremst er det viktig at du oppdaterer banen din, og legger til Androids SDK-plattformverktøy, hvis du ikke har det ennå. Hvis du aldri har gjort det, er det klare instruksjoner om hvordan du gjør det på android-utvikler siden. Klar? Åpne en terminal og skriv inn følgende:

 adb-enheter

Den tilkoblede enheten skal dukke opp i en liste. Hvis dette ikke er tilfelle, kontroller at det er riktig tilkoblet og at du har alle driverne som trengs for det bestemte håndsettet.

Se enheten på listen? Flott! Vi er nå klar til å presse tcpdump filen på den:

 adb push / home / tcpdump / data / local

For å utføre de neste trinnene må vi få root-privilegier på enheten og sørge for at tcpdump er kjørbar:

 adb shell cd data / lokal su chmod 777 tcpdump

Trinn 2: Lagre trafikkdumpen til filen

Tcpdump kan nå startes fra samme ADB-skjerm og utgangen som er lagret i en fil:

 ./ tcpdump -s 0 -v -w out.pcap

Den komplette listen over tcpdump-alternativer finnes på mannsiden til tcpdump.

Når dumpen er fullført, kan vi slutte å fange dataene. For å gjøre det, må du bare trykke Ctrl + C. Den resulterende filen kan trekkes ut av enheten og lagres lokalt, slik at den kan analyseres ved hjelp av Wireshark.

 adb pull /data/local/out.pcap /home/out.pcap

Men dette er ikke akkurat det vi ønsket, er det? Det vi ønsker er å kunne røre det til Wireshark i virkeligheten! Slapp av, vi kommer dit.


Trinn 3: Piping nettverkstrafikk til en port

Prosessen med å fange nettverkspakker er i utgangspunktet den samme i dette tilfellet. I stedet for å skrive datagrammer til en fil, vil vi imidlertid skrive dem til standardutgangen, slik at vi kan omdirigere dem ved hjelp av netcat til en bestemt port på håndsettet.

For å gjøre det, må tcpdump-kommandoen endres litt:

 adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345"

Trafikken blir nå omdirigert til porten 12345 i håndsettet.


Trinn 4: Installere Netcat

Før du går videre, må vi sørge for at du har netcat installert, da vi kommer til å trenge det. Skriv nc i en ny konsoll, trykk enter og se på hva som skjer. Får du standardmeldingen som forklarer hvordan du bruker kommandoen? Fantastisk, du er god å gå. Hopp over resten av denne delen og fortsett!

Fortsetter å lese? Vel, det antar at du ikke har det netcat installert tross alt. Ikke ta panikk, du kan laste den ned herfra til Windows.


Trinn 5: Piping Trafikk til Wireshark

Husk hva vi tidligere nevnte om å oppdatere banen slik at ADB ville være tilgjengelig? Du vil gjøre det med netcat og Wireshark også.

Når dette er gjort, kan vi bruke ADB's fremover alternativ, som vil videresende pakker fra tcp port 12345 i enheten til tcp port 54321 på PCen. Vi vil igjen bruke Netcat til å hente de innkommende pakkene som kommer inn gjennom port 54321, og rør dem til Wireshark.

Dette gjøres i følgende kommando, skrevet inn i en ny konsoll:

 adb fremover tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -

Merk at nummeret på porten som er valgt, er irrelevant. Den eneste grunnen til at forskjellige numre er valgt, er å vise hvordan de forskjellige kommandoene kobler seg til hverandre. Det samme portnummeret kunne ha blitt brukt til begge kommandoene (eller forskjellige tall fra ovenstående, så lenge portene ikke blir brukt!) Og da ville de fungere akkurat det samme.

Du må sørge for at Wireshark kjører med de riktige tillatelsene. Ellers, selv når Wireshark blir åpnet, vil en popup dukke opp med å informere deg om et unntak.


Trinn 6: Gjør livet enklere

Når de forskjellige verktøyene er satt opp, prosessen med å fange nettverkstrafikken og røre den inn i Wireshark gjøres gjennom to kommandoer, samtidig som de går i to forskjellige terminaler:

 adb shell "./data/local/tcpdump -n -s 0 -w- | nc -l -p 12345" adb fremover tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -

Nå er denne prosessen fortsatt ganske manuell. Man må manuelt åpne to terminaler og skrive alle disse instruksjonene, sørg for at ingenting blir etterlatt for at dette skal fungere. Dette er en plage. Vel, det problemet løses lett ved å sette disse instruksjonene på et skript, slik at det gjør alt arbeidet for oss.

Windows-brukere kan automatisere prosessen ved hjelp av skriptet i nedlastingsfilen som er vedlagt dette innlegget.

 start adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345" adb fremover tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -

Notater for Mac-brukere

Hvis du har fulgt denne opplæringen på en Mac, klipper du sannsynligvis på hodet og tenker på hvorfor prosessen ovenfor ikke ser ut til å fungere for deg. Det er et par grunner til at dette kan være tilfelle. La oss prøve å fikse det.

Først av alt, sørg for at du bruker riktig vei til Wireshark! Dette kan virke trivielt, men det er ikke det. Du vil ikke bruke banen til appen, men hele banen til selve Wireshark kjørbar (for eksempel "/Applications/Wireshark.app/Contents/Resources/bin/wireshark").

Fikset? Flink! Bare et par flere ting å gå. Når påkalling Wireshark Via kommandolinjen bruker vi et minustegn på slutten. Dette representerer standardinngangen, og i Windows fungerer det bra. Dette vil imidlertid ikke fungere på en Mac. Heldigvis kan dette erstattes med navnet på et rør. Du vil spesifisere 2 (tilsvarende lo0) som røret skal bruke. Dessuten må du kanskje gi superbrukerrettigheter for å kunne utføre Wireshark. Dette er den resulterende kommandoen du vil bruke:

 adb fremover tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -Si 2

Dette er Perl-skriptet som vil fungere for Mac-brukere (det er også vedlagt som nedlasting til dette innlegget):

 #! / usr / bin / perl # Utfør adb kommandoen på shell # for å sjekke om enheten er koblet til $ netstat = 'adb shell' netstat '2> & 1'; hvis ($ netstat = ~ m / feil: enhet ikke funnet /) die ("Plugg inn telefonen! \ n");  # Gain root privilegier åpne (SUDO, "| sudo echo" "), lukk (SUDO); # Omdirigere STDERR utdata til STDOUT åpne STDERR, '> & STDOUT'; # Utfør tcpdump og nc i bakgrunnen åpen (COMMAND1," shell \ "data / lokal / tcpdump -n -s 0 -w - | nc -l -p 12345 \") |); # Utfør rør til wireshark åpen (COMMAND2, "((adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2) &) 2> & 1> / dev / null | "); # Kontroller at avslutningsmeldingen vises etter at wireshark har blitt lansert (hacky) ; skriv ut ("Trykk ctrl-c for å avslutte ..."); ;