天天看點

使用網絡流量分析工具更好調試Android應用

作為開發者,我們都很清楚,我們開發的跟網絡相關的程式,一般都會通過使用HTTP協定,發出相關的請求資訊。當在應用運作之初時,這些網絡上的資訊的傳遞是十分暢順的,我們獲得的資訊都是我們期望所獲得的。

然而,開發者會發現經常都不會出現上面說的情況,尤其是在應用連接配接在網絡中的時候,特别是當高并發流量時,如果出現了資料的丢失或錯誤,沒人準确知道目前已發送和接受的資料是什麼,這樣對我們的程式調試是很不利的。這就要求我們必須能夠抓取網絡中的相關包資料,對資料進行解包分析驗證。

前言

對網絡中的資料包進行抓取為稍後的分析是很有用的,但如果我們在抓取資料包的同時就能夠開展這種分析那将獲得更好的效果。這樣做的話,開發者能很清晰了解到對每一個測試用例中的請求和應答的資料是哪些。在本文中,将展示如何實時地抓取Android應用聯網程式中的資料包,并且将使用著名的網絡資料分析利器Wireshark進行分析。

教程詳情

技術:Android+Wireshark

難度:中等

完成時間:30-45分鐘

步驟1安裝tcpdump軟體

首先必須在裝置上安裝tcpdump軟體。Tcpdump是一款指令行下的網絡資料抓包工具,并能将抓取的資料存放到檔案系統中,可以在這個位址下載下傳:http://www.tcpdump.org/

當下載下傳完tcpdump檔案後,我們需要做的隻需要使用adb指令去将其放到裝置中去。首先當然要将手機連接配接到電腦上,使用的指令如下:

adbdevices

這樣就會列出目前已連接配接到電腦上的裝置。再用如下指令将tcpdump檔案push到裝置中去,如下指令:

adb push /home/tcpdump   /data/local

在接下來的幾個步驟中,必須要使用root的權限進行操作,并且要使的tcpdump為可執行屬性,如下:

adb shell

cd data/local

su

chmod 777 tcpdump

步驟2儲存抓包資料到檔案

我們可以在adbshell中啟動tcpdmup,指令如下:

/tcpdump-s0-v-wout.pcap

完整的tcpdump的指令參數請參考這個位址:http://www.tcpdump.org/tcpdump_man.html

運作後如下圖所示:

可以看到,tcpdump會監控目前網卡的資料包情況,當使用者想停止監控時,隻需要CTRL+C即可停止監控了,并使用pull将其儲存到檔案系統中去,以友善使用Wireshark去進行分析,指令如下:

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

儲存在本地檔案系統中的資料将稍後使用Wireshark進行分析。

步驟3捕捉指定端口的資料

接下來,我們更改下tcpdump的輸出格式,将其輸出不輸出到檔案,而輸出到指定的輸出端口中,以友善使用netcat這個工具去過濾資料,這個工具等下會講解到。指令如下:

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

這樣的話,所有的網絡流量資料包将會經過12345端口。

步驟4安裝netcat

首先在http://www.securityfocus.com/tools/139這個位址下載下傳windows版本的netcat進行安裝,這個工具的原理是:,從網絡的一端讀入資料,然後輸出到網絡的另一端,它可以使用tcp和udp協定.

步驟5使用Wireshark分析網絡資料包

下面我們開始使用Wireshark分析網絡資料包。首先使用adb的forward指令,将資料包從手機裝置的12345端口重定向到PC電腦的54321端口,然後再通過netstat工具捕獲進入54321端口的資料,最後再通過管道操作交給wireshark進行分析,指令如下:

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

要注意的是,例子中端口的選擇是随機的。之是以選擇不同的端口,其原因為了展示不同的指令之間的互相調用,相同的指令可以調用同一個端口,隻要這些端口是未被占用的即可。

運作後入下圖所示,可以看到wireshark的運作情況:

綜合的操作

現在,在不同的工具搭建完畢後,我們可以通過在兩個不同的終端,分别使用兩條不同的指令,來完成從捕捉資料包到整個資料包分析的過程,指令如下:

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

但這個操作有點麻煩,要打開兩個終端進行操作,是以在windows下,可以用本文的附件中的如下腳本,實作一條語句運作:

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

如下圖,可以看到隻打開了一個終端視窗。

Mac使用者請注意

如果你是MAC機使用者,則請需要注意如下幾點:

使用完整的路徑調用,比如“/Applications/Wireshark.app/Contents/Resources/bin/wireshark”去調用

2)此外,在指令行下調用時,要按入下格式調用:

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

其中,要使用sudo授予wireshark管理者權限,并且注意最後的參數為2,最後給出一段perl的script,在本文附件中可以下載下傳,用來完成整個在MAC機器上捕獲資料包并交給wireshark分析的過程:

#!/usr/bin/perl

# Perform adb command on shell

# to check if the device is attached

$netstat = `adb shell 'netstat' 2>&1`;

if($netstat =~ m/error: device not found/)

{

die("Plug in your phone!\n");

}

# Gain root priviledges

open(SUDO, "|sudo echo ''");

close(SUDO);

# Redirect STDERR output to STDOUT

open STDERR, '>&STDOUT';

# Perform tcpdump and nc in background

open(COMMAND1, "(adb shell \"data/local/tcpdump -n -s 0 -w - | nc -l -p 12345\") |");

# Perform piping to 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 |");

# Make sure the exit message appears after wireshark has been launched (hacky)

sleep(5);

print("Press ctrl-c to exit...");

<STDIN>;

不知道為什麼,最後一直沒有測試成功,雖然tcpdump完全可以使用,生成的pcap也能夠讓wireshark正确解析,但是之間使用nc産生的動态橋梁卻一直沒有打通,用nc的時候發現wireshark

擷取不了資料,這個事情讓我感覺很郁悶,等有時間換個思路再看看...

繼續閱讀