BKJIA獨家譯文】作為開發人員,我們都很清楚,我們開發的跟網路相關的程式,一般都會通過使用HTTP協議,發出相關的請求資訊。當在應用運行之初時,這些網路上的資訊的傳遞是十分暢順的,我們獲得的資訊都是我們期望所獲得的。
然而,開發人員會發現經常都不會出現上面說的情況,尤其是在應用串連在網路中的時候,特別是當高並發流量時,如果出現了資料的丟失或錯誤,沒人準確知道當前已發送和接受的資料是什麼,這樣對我們的程式調試是很不利的。這就要求我們必須能夠抓取網路中的相關包資料,對資料進行解包分析驗證。
前言
對網路中的資料包進行抓取為稍後的分析是很有用的,但如果我們在抓取資料包的同時就能夠開展這種分析那將獲得更好的效果。這樣做的話,開發人員能很清晰瞭解到對每一個測試案例中的請求和應答的資料是哪些。在本文中,將展示如何即時地抓取Android應用連網程式中的資料包,並且將使用著名的網路資料分析利器Wireshark進行分析。
教程詳情
- 技術:Android+Wireshark
- 難度:中等
- 完成時間:30-45分鐘
步驟1安裝tcpdump軟體
首先必須在裝置上安裝tcpdump軟體。Tcpdump是一款命令列下的網路資料抓包工具,並能將抓取的資料存放到檔案系統中,可以在這個地址下載:http://www.tcpdump.org/
當下載完tcpdump檔案後,我們需要做的只需要使用adb命令去將其放到裝置中去。首先當然要將手機串連到電腦上,使用的命令如下:
這樣就會列出當前已串連到電腦上的裝置。再用如下命令將tcpdump檔案push到裝置中去,如下命令:
| adb push /home/tcpdump /data/local |
在接下來的幾個步驟中,必須要使用root的許可權進行操作,並且要使的tcpdump為可執行屬性,如下:
| adb shell cd data/local su chmod 777 tcpdump |
步驟2儲存抓包資料到檔案
我們可以在adbshell中啟動tcpdmup,命令如下:
完整的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 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 - |
但這個操作有點麻煩,要開啟兩個終端進行操作,因此在windows下,可以用本文的附件中的如下指令碼,實現一條語句運行:
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 - |
如,可以看到只開啟了一個終端視窗。
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>;
本文的附件在這裡可以下載:https://mobiletuts.s3.amazonaws.com/Android-SDK_Wireshark_Traffic-Analysis/tcpdump_scripts.zip
BKJIA譯稿,非經授權謝絕轉載,合作媒體轉載請註明原文出處、作者及BKJIA譯者!】