Analiza traficului de rețea poate fi o parte vitală a procesului de depanare și testare a software-ului. Acest tutorial vă va învăța cum să monitorizați tot traficul de intrare și de ieșire de pe un dispozitiv Android pentru a depana mai bine aplicațiile!
În calitate de dezvoltator, trebuie să construiți software-ul care execută cereri HTTP, trimite mesaje sau preia informații din cererile de intrare sau de ieșire din rețea. Când aceste tranzacții de rețea funcționează de la bun început, totul este bun; primim exact ceea ce ne așteptăm și ceea ce trimitem este corect formatat și cu valorile corecte.
Cu toate acestea, acest lucru nu se întâmplă frecvent și trebuie să înțelegem exact ceea ce este trimis și recepționat prin rețea pentru a determina ce sa întâmplat. Cine știe, poate că cererea nu se face chiar și nu suntem conștienți de ea! Aceasta este o situație în care cunoașterea capturii și a analizei traficului din rețea devine crucială.
Captarea traficului de rețea pentru o analiză ulterioară este bună, dar este chiar mai bine dacă putem efectua această analiză în același timp în care are loc capturarea. Procedând astfel, se poate ști ce solicitare sau răspuns corespunde fiecărui caz de utilizare, făcând astfel analiza mult mai ușoară. În următorii pași, vă voi arăta cum să capturați traficul în timp real dintr-un dispozitiv Android și să îl conectați la un analizor de rețea precum Wireshark.
Primul pas este să instalați tcpdump pe dispozitiv. tcpdump este un utilitar pentru linia de comandă care captează traficul pe un anumit dispozitiv de rețea și îl depozitează în sistemul de fișiere. tcpdump pot fi descărcate de aici.
Odata ce tcpdump binar a fost descărcat, tot ce trebuie să faceți este să folosiți adb pentru a împinge fișierul pe dispozitiv. Pentru a putea face acest lucru, receptorul dvs. trebuie să fie conectat și să fie identificat corect de computerul dvs..
În primul rând, este important să vă actualizați calea adăugând directorul Android-SDK pentru platformă-instrumente, dacă nu ați făcut-o încă. În cazul în care nu ați făcut-o niciodată, există instrucțiuni clare cu privire la modul în care se face acest lucru pe pagina de dezvoltatori Android. Gata? Deschideți un terminal și tastați următoarele:
dispozitive adb
Dispozitivul conectat ar trebui să apară într-o listă. În caz contrar, asigurați-vă că este conectat corect și că aveți toate driverele necesare pentru acel telefon specific.
Vedeți dispozitivul din listă? Grozav! Suntem gata să împingem tcpdump fișier pe el:
adb împinge / home / tcpdump / data / local
Pentru a efectua următorii pași, trebuie să obțineți privilegii de root pe dispozitiv și asigurați-vă că acest lucru este posibil tcpdump este executabil:
adb shell date cd / local su chmod 777 tcpdump
Tcpdump poate fi pornit acum din aceeași shell adb și ieșirea salvată într-un fișier:
./ tcpdump -s 0 -v -w out.pcap
Lista completă a opțiunilor tcpdump poate fi găsită în pagina man din tcpdump.
Odată ce dumpul este finalizat, putem opri capturarea datelor. Pentru a face acest lucru, trebuie doar să apăsați pe Ctrl + C. Fișierul rezultat poate fi scos din dispozitiv și salvat local, astfel încât să poată fi analizat utilizând Wireshark.
adb trageți /data/local/out.pcap /home/out.pcap
Dar nu asta ne-am dorit, nu-i așa? Ceea ce vrem este să fim capabili să-l dăm Wireshark in timp real! Relaxează-te, ajungem acolo.
Procesul de captare a pachetelor de rețea este în principiu același în acest caz. Cu toate acestea, în loc să scriem datagramele unui fișier, vrem să le scriem la ieșirea standard, astfel încât să le putem redirecționa utilizând netcat la un anumit port de pe receptor.
Pentru a face acest lucru, comanda tcpdump trebuie să se schimbe ușor:
adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345"
Traficul este acum redirecționat către portul 12345 din receptor.
Înainte de a merge mai departe, vă permite să vă asigurați că aveți netcat instalat, așa cum o vom avea nevoie. Introduceți nc într-o nouă consolă, apăsați Enter și uita-te la ce se întâmplă. Primiți mesajul standard care explică modul de utilizare a comenzii? Minunat, ești bine să pleci. Treceți peste restul acestei secțiuni și continuați!
Încă citești? Păi, asta înseamnă că nu ai netcat instalat la urma urmei. Nu vă panicați, o puteți descărca de aici pentru Windows.
Amintiți-vă ce am menționat mai devreme cu privire la actualizarea căii, astfel încât aceasta adb ar fi disponibil? Vrei să faci asta cu netcat și Wireshark de asemenea.
Odată ce acest lucru se face, putem folosi adbcare va transmite pachetele de pe portul tcp 12345 din dispozitiv la portul 54321 tcp de pe PC. Vom folosi din nou netcat pentru a apuca acele pachete de intrare care intră prin portul 54321 și le vom conduce Wireshark.
Aceasta se face în următoarea comandă, introdusă într-o nouă consolă:
adb înainte tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -
Rețineți că numărul portului ales este irelevant. Singurul motiv pentru care au fost alese numere diferite este de a arăta cum se conectează diferitele comenzi între ele. Același număr de port ar fi putut fi folosit pentru ambele comenzi (sau numere diferite de la cele de mai sus, atâta timp cât porturile nu sunt utilizate!) Și apoi ar funcționa la fel.
Trebuie să vă asigurați asta Wireshark rulează cu permisiunile corecte. În caz contrar, chiar și atunci când Wireshark se deschide un pop-up care vă va informa despre o excepție.
Odată ce au fost configurate diferite utilitare, procesul de captare a traficului de rețea și introducerea acestuia în rețea Wireshark se face prin două comenzi, care rulează simultan în două terminale diferite:
adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345" adb înainte tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -
Acum, acest proces este încă destul de manual. Trebuie să deschideți manual două terminale și să introduceți toate aceste instrucțiuni, asigurându-vă că nu rămâne nimic în urmă pentru ca acest lucru să funcționeze. Aceasta este o pacoste. Ei bine, problema este rezolvată cu ușurință prin punerea acestor instrucțiuni într-un scenariu, astfel încât să facă toată munca pentru noi.
Utilizatorii de Windows pot automatiza procesul utilizând scriptul din fișierul de descărcare atașat la această postare.
începe adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345" adb înainte tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -
Dacă ați urmat acest tutorial pe un Mac, probabil că vă scarpinați capul, gândindu-vă de ce procesul de mai sus nu pare să funcționeze pentru dvs. Există câteva motive pentru care acest lucru ar putea fi cazul. Să încercăm să rezolvăm asta.
Mai întâi de toate, asigurați-vă că utilizați calea cea dreaptă Wireshark! Acest lucru ar putea părea trivial, dar nu este. Nu doriți să utilizați calea către aplicație, ci întreaga cale către realitate Wireshark executabil (de ex. "/Applications/Wireshark.app/Contents/Resources/bin/wireshark").
Fix? Bun! Doar câteva lucruri pentru a merge. Când se invocă Wireshark prin linia de comandă, folosim un semn minus la sfârșit. Aceasta reprezintă intrarea standard și în Windows va funcționa foarte bine. Cu toate acestea, acest lucru nu va funcționa pe un Mac. Din fericire, acest lucru poate fi înlocuit cu numele unei țevi. Doriți să specificați 2 (corespunzător lui lo0) ca conducta de utilizat. În plus, poate fi necesar să acordați permisiuni super-utilizator pentru a putea executa Wireshark. Aceasta este comanda rezultată pe care doriți să o utilizați:
adb înainte tcp: 12345 tcp: 54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S-i 2
Acesta este scriptul perl care va funcționa pentru utilizatorii Mac (este, de asemenea, atașat ca descărcare la acest post):
#! / usr / bin / perl # Efectuați comanda adb pe shell # pentru a verifica dacă dispozitivul este atașat $ netstat = 'adb shell' netstat '2> & 1'; dacă ($ netstat = ~ m / error: dispozitivul nu a fost găsit /) die ("Conectați-vă telefonul! \ n"); # Creste STDERR, STDOUT deschide STDERR, '& STDOUT'; # Efectuati tcpdump si nc in fundal deschis (COMMAND1, "(adb shell "\ data / local / tcpdump -n -s 0 -w - | nc -l -p 12345 \") "); # Efectuați conductele la 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 | "); # Asigurați-vă că mesajul de ieșire apare după ce wireshark a fost lansat (hacky) sleep (5) ; print ("Apăsați ctrl-c pentru a ieși ...");;