Android-netwerkverkeer analyseren

Analyse van netwerkverkeer kan een vitaal onderdeel zijn van het foutopsporings- en testproces van de software. In deze zelfstudie leert u hoe u al het inkomende en uitgaande verkeer op een Android-apparaat kunt controleren om uw toepassingen beter te debuggen!

Als ontwikkelaar moet men vaak software bouwen die HTTP-verzoeken uitvoert, berichten verzendt of informatie van inkomende of uitgaande aanvragen via het netwerk pakt. Wanneer deze netwerktransacties vanaf het begin werken, is alles goed; we ontvangen precies wat er wordt verwacht en wat we verzenden is correct geformatteerd en met de juiste waarden.

Dit gebeurt echter vaak niet en men moet precies begrijpen wat er over het netwerk wordt verzonden en ontvangen om te bepalen wat er mis is gegaan. Wie weet, misschien wordt het verzoek zelfs niet ingediend en we zijn ons er niet bewust van! Dit is een omstandigheid waarin het cruciaal wordt om te weten hoe het netwerkverkeer moet worden vastgelegd en geanalyseerd.

Het vastleggen van netwerkverkeer voor latere analyse is goed, maar het is nog beter als we in staat zijn om deze analyse uit te voeren op het moment dat de capture plaatsvindt. Door dit te doen, kan men weten welk verzoek of antwoord overeenkomt met elke use-case, waardoor de analyse veel eenvoudiger wordt. In de volgende stappen zal ik je laten zien hoe je real-time verkeer van een Android-apparaat kunt vastleggen en naar een netwerkanalysator zoals Wireshark kunt doorsturen.


Stap 1: Installeren tcpdump

De eerste stap is om te installeren tcpdump op het apparaat. tcpdump is een opdrachtregelprogramma dat het verkeer op een bepaald netwerkapparaat vangt en naar het bestandssysteem dumpt. tcpdump kan hier worden gedownload.

Zodra de tcpdump binair bestand is gedownload, alles wat we moeten doen is adb gebruiken om het bestand naar het apparaat te pushen. Om dit te kunnen doen, moet uw handset zijn aangesloten op en correct worden geïdentificeerd door uw computer.

Allereerst is het belangrijk dat u uw pad bijwerkt door de SDK-platform-tools-directory van Android toe te voegen als u dat nog niet hebt gedaan. In het geval dat je het nog nooit hebt gedaan, zijn er duidelijke instructies over hoe dit te doen op de Android-ontwikkelaarspagina. Klaar? Open een terminal en typ het volgende:

 adb-apparaten

Het verbonden apparaat zou in een lijst moeten verschijnen. Als dit niet het geval is, controleert u of deze correct is aangesloten en of u over alle stuurprogramma's voor die specifieke handset beschikt.

Zie het apparaat in de lijst? Super goed! We zijn nu klaar om de tcpdump bestand erin:

 adb push / home / tcpdump / data / local

Om de volgende paar stappen uit te voeren, moeten we root-rechten op het apparaat verkrijgen en ervoor zorgen dat dat gebeurt tcpdump is uitvoerbaar:

 adb shell cd data / local su chmod 777 tcpdump

Stap 2: De verkeersdump opslaan in Bestand

Tcpdump kan nu vanuit dezelfde adb-shell worden gestart en de uitvoer in een bestand worden opgeslagen:

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

De volledige lijst met tcpdump-opties is te vinden op de man-pagina van tcpdump.

Zodra de dump is voltooid, kunnen we stoppen met het vastleggen van de gegevens. Om dit te doen, hoeft u alleen maar op Ctrl + C te drukken. Het resulterende bestand kan uit het apparaat worden getrokken en lokaal worden opgeslagen, zodat het kan worden geanalyseerd met behulp van Wireshark.

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

Maar dit is niet precies wat we wilden, toch? Wat we willen is om het te kunnen pijpen Wireshark live! Relax, we komen er.


Stap 3: Piping Netwerkverkeer naar een poort

Het proces van het vastleggen van de netwerkpakketten is in principe hetzelfde. In plaats van de datagrammen naar een bestand te schrijven, willen we ze naar de standaarduitvoer schrijven, zodat we ze vervolgens kunnen omleiden netcat naar een specifieke poort op de handset.

Om dit te doen, moet de opdracht tcpdump enigszins veranderen:

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

Het verkeer wordt nu omgeleid naar de poort 12345 in de handset.


Stap 4: Netcat installeren

Voordat je verder gaat, laten we ervoor zorgen dat je dat hebt gedaan netcat geïnstalleerd, omdat we het nodig hebben. Typ nc in een nieuwe console, druk op enter en kijk wat er gebeurt. Krijgt u het standaardbericht met uitleg over het gebruik van het commando? Geweldig, je bent goed om te gaan. Sla de rest van dit gedeelte over en ga door!

Nog steeds aan het lezen? Welnu, ik denk dat dat betekent dat je dat niet hebt netcat toch geïnstalleerd. Geen paniek, u kunt het hier downloaden voor Windows.


Stap 5: Pipingverkeer naar Wireshark

Onthoud wat we eerder hebben gezegd over het bijwerken van het pad, zodat adb zou beschikbaar zijn? Daar wil je mee doen netcat en Wireshark ook.

Zodra dit is gebeurd, kunnen we gebruiken adb's forward-optie, die de pakketten van de tcp-poort 12345 in het apparaat doorstuurt naar de tcp-poort 54321 op de pc. We zullen weer netcat gebruiken om die inkomende pakketten die binnenkomen via poort 54321 te pakken te krijgen en naar te pipen Wireshark.

Dit gebeurt met de volgende opdracht, typ een nieuwe console in:

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

Merk op dat het nummer van de gekozen poort niet relevant is. De enige reden waarom verschillende nummers zijn gekozen, is om te laten zien hoe de verschillende commando's met elkaar verbonden zijn. Hetzelfde poortnummer kan voor beide opdrachten (of verschillende nummers van het bovenstaande zijn gebruikt, zolang de poorten niet worden gebruikt!) En dan zouden ze precies hetzelfde werken.

Je moet ervoor zorgen dat Wireshark wordt uitgevoerd met de juiste machtigingen. Anders, zelfs wanneer Wireshark wordt geopend, er verschijnt een pop-up die u informeert over een uitzondering.


Stap 6: Het leven gemakkelijker maken

Nadat de verschillende hulpprogramma's zijn ingesteld, wordt het netwerkverkeer vastgelegd en naar binnen geleid Wireshark wordt gedaan door twee commando's, tegelijkertijd in twee verschillende terminals:

 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 -

Dit proces is nu nog steeds behoorlijk handmatig. Men moet handmatig twee terminals openen en al die instructies typen, zodat er niets achterblijft om te werken. Dit is vervelend. Wel, dat probleem is gemakkelijk op te lossen door deze instructies op een script te zetten, zodat het al het werk voor ons doet.

Windows-gebruikers kunnen het proces automatiseren met behulp van het script in het downloadbestand dat bij dit bericht is gevoegd.

 start 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 -

Opmerkingen voor Mac-gebruikers

Als je deze tutorial op een Mac hebt gevolgd, krab je waarschijnlijk je hoofd en denk je waarom het bovenstaande proces niet echt voor jou lijkt te werken. Er zijn een aantal redenen waarom dit het geval zou kunnen zijn. Laten we proberen dat op te lossen.

Zorg er allereerst voor dat u het juiste pad gebruikt Wireshark! Dit lijkt misschien triviaal, maar is het niet. U wilt niet het pad naar de app gebruiken, maar het hele pad naar het werkelijke Wireshark uitvoerbaar bestand (bijvoorbeeld "/Applications/Wireshark.app/Contents/Resources/bin/wireshark").

Vaste? Goed! Nog een paar dingen om te gaan. Bij het aanroepen Wireshark via de opdrachtregel gebruiken we aan het einde een minteken. Dit vertegenwoordigt de standaard invoer en in Windows werkt het prima. Dit werkt echter niet op een Mac. Gelukkig kan dit worden vervangen door de naam van een pijp. U wilt 2 opgeven (overeenkomend met lo0) als de te gebruiken pijp. Bovendien moet u wellicht supergebruikersrechten verlenen om te kunnen uitvoeren Wireshark. Dit is de resulterende opdracht die u wilt gebruiken:

 adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2

Dit is het perl-script dat voor Mac-gebruikers werkt (het is ook als download aan dit bericht toegevoegd):

 #! / usr / bin / perl # Voer een adb-opdracht uit op shell # om te controleren of het apparaat is aangesloten $ netstat = 'adb shell' netstat '2> & 1'; if ($ netstat = ~ m / error: device not found /) die ("Plug in your phone! \ n");  # Krijg root-privileges open (SUDO, "| sudo echo" "); close (SUDO); # Redirect STDERR-uitvoer naar STDOUT open STDERR, '> & STDOUT'; # Voer tcpdump en nc uit op achtergrond open (COMMAND1," (adb shell \ "data / local / tcpdump -n -s 0 -w - | nc -l -p 12345 \") | "); # Voer piping naar wireshark open (COMMAND2," ((adb forward tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2) &) 2> & 1> / dev / null | "); # Zorg ervoor dat het exit-bericht verschijnt nadat wireshark is gestart (hacky) sleep (5) ; print ("Druk op ctrl-c om af te sluiten ..."); ;