- 分析 Android 中 app 的網絡數據交互,需要在 Android 上抓包,常用工具為 tcpdump ,用 tcpdump 生成 Wireshark 識別的 pcap 文件,把 pcap 文件從手機上拷貝到電腦上,Wireshark 加載 pcap 文件,通過 Wireshark 分析 tcpdump 抓取的數據
tcpdump 安裝
- 手機需要 root
- 下載 Android tcpdump
- 使用 adb 命令把 tcpdump 放入到手機中
adb push tcpdump /sdcard/
adb shell su cat /sdcard/tcpdump > /system/bin/tcpdump - 當提示沒有權限時,輸入
monut - 在結果中找到包含 /system 的一行,類似:
/dev/block/bootdevice/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0 - 執行如下命令
mount -o remount /dev/block/bootdevice/by-name/system - 這時 /system 擁有寫權限,繼續執行
cat /system/tcpdump > /system/bin/tcpdump
chmod 777 /system/bin/tcpdump - 這樣 tcpdump 就成功安裝到了 /system/bin 目錄下
使用 tcpdump 抓包
-
使用 tcpdump 抓包。
tcpdump -i any -p -s 0 -w /sdcard/capture.pcap命令參數:
# "-i any": listen on any network interface # "-p": disable promiscuous mode (doesn't work anyway) # "-s 0": capture the entire packet # "-w": write packets to a file (rather than printing to stdout)可以結束時使用 Ctrl+C 讓 tcpdump 結束抓包,抓到的數據會保存到 /sdcard/capture.pcap
-
通過 adb pull 命令拿到 pcap 文件,
adb pull /sdcard/capture.pcap . -
使用 Wireshark 打開 pcap 文件,分析 log
tcpdump 語法
tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
[ expression ]
-
類型的關鍵字
host(缺省類型): 指明一台主機,如:host 210.27.48.2
net: 指明一個網絡地址,如:net 202.0.0.0
port: 指明端口號,如:port 23
-
確定方向的關鍵字
src: src 210.27.48.2, IP包源地址是210.27.48.2
dst: dst net 202.0.0.0, 目標網絡地址是202.0.0.0
dst or src(缺省值)
dst and src
-
協議的關鍵字:缺省值是監聽所有協議的信息包
fddi
ip
arp
rarp
tcp
udp
-
其他關鍵字
gateway
broadcast
less
greater
-
常用表達式:多條件時可以用括號,但是要用\轉義
非 : ! or "not" (去掉雙引號)
且 : && or "and"
或 : || or "or"
-
選項
-A:以ASCII編碼打印每個報文(不包括鏈路層的頭),這對分析網頁來說很方便; -a:將網絡地址和廣播地址轉變成名字; -c<數據包數目>:在收到指定的包的數目后,tcpdump就會停止; -C:用於判斷用 -w 選項將報文寫入的文件的大小是否超過這個值,如果超過了就新建文件(文件名后綴是1、2、3依次增加); -d:將匹配信息包的代碼以人們能夠理解的匯編格式給出; -dd:將匹配信息包的代碼以c語言程序段的格式給出; -ddd:將匹配信息包的代碼以十進制的形式給出; -D:列出當前主機的所有網卡編號和名稱,可以用於選項 -i; -e:在輸出行打印出數據鏈路層的頭部信息; -f:將外部的Internet地址以數字的形式打印出來; -F<表達文件>:從指定的文件中讀取表達式,忽略其它的表達式; -i<網絡界面>:監聽主機的該網卡上的數據流,如果沒有指定,就會使用最小網卡編號的網卡(在選項-D可知道,但是不包括環路接口),linux 2.2 內核及之后的版本支持 any 網卡,用於指代任意網卡; -l:如果沒有使用 -w 選項,就可以將報文打印到 標准輸出終端(此時這是默認); -n:顯示ip,而不是主機名; -N:不列出域名; -O:不將數據包編碼最佳化; -p:不讓網絡界面進入混雜模式; -q:快速輸出,僅列出少數的傳輸協議信息; -r<數據包文件>:從指定的文件中讀取包(這些包一般通過-w選項產生); -s<數據包大小>:指定抓包顯示一行的寬度,-s0表示可按包長顯示完整的包,經常和-A一起用,默認截取長度為60個字節,但一般ethernet MTU都是1500字節。所以,要抓取大於60字節的包時,使用默認參數就會導致包數據丟失; -S:用絕對而非相對數值列出TCP關聯數; -t:在輸出的每一行不打印時間戳; -tt:在輸出的每一行顯示未經格式化的時間戳記; -T<數據包類型>:將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議); -v:輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息; -vv:輸出詳細的報文信息; -x/-xx/-X/-XX:以十六進制顯示包內容,幾個選項只有細微的差別,詳見man手冊; -w<數據包文件>:直接將包寫入文件中,並不分析和打印出來; expression:用於篩選的邏輯表達式;
Wireshark 分析數據
Android利用tcpdump和wireshark抓取網絡數據包: http://www.trinea.cn/android/tcpdump_wireshark/
iOS,Android網絡抓包教程之tcpdump: http://mrpeak.cn/blog/tutorial-tcpdump/
聊聊tcpdump與Wireshark抓包分析: http://www.jianshu.com/p/a62ed1bb5b20
Filder 抓包: http://www.jianshu.com/p/f173ed2aed13
Wireshark 學習:https://community.emc.com/message/818739
tcpdump 命令詳解:http://www.jianshu.com/p/15471420422c
Android通過tcpdump抓包: http://www.jianshu.com/p/23abbd62781e
