前言

最近工作上遇到需要抓封包分析才能釐清的問題

以前在開發 iOS 非常簡單,可以用 rvictl -s [iOS UUID] 在 Mac 上創建一個虛擬網卡介面,就可以開 Wireshark 抓 iOS 上的封包了

最近開發 Android 也遇到需要抓封包的情況,上網學習了一下,在這邊紀錄,希望可以幫到其他人🙂

事前準備

  1. 一台 root 過的 Android Device
  2. tcpdump tool
  3. Wireshark

補充說明: 如果沒有 root 的 Android Device,可以嘗試用 tPacketCapture 來抓包,它的原理類似開一個類似 VPN 的 app,發送的封包此 app 會抓取,但我個人實測,有時候有些封包會好像沒發出去,影響實際情況,在此不推薦!

將 tcpdump 放入 Android 裝置

adb push tcpdump /data/local/tcpdump

如果出現 can't execute: Permission denied,請以 root 身份執行 push,結束後再退出 root 身份

adb root
adb push tcpdump /data/local/tcpdump
adb unroot

執行 tcpdump

先到 /data/local 目錄下

adb shell
su
cd /data/local

修改 tcpdump 權限為可執行

chmod a+x tcpdump

執行 tcpdump 開始抓封包

./tcpdump -i any -p -s 0 -w /sdcard/capture.pcap

抓完封包後 control + c 結束抓包程序

導出 Android 封包檔案到電腦上

adb pull /sdcard/capture.pcap

在用 Wireshark 開啟即可 wireshark_test_1

總結

抓封包是很重要的 debug 工具,很多時候使用第三方的 frameworks/libraries 較難查出是 server or client 的問題.

也有可能是 framework/library 本身沒寫好,需要修改第三方的程式碼

之前在做 iOS FFMpeg 在串 RTSP 時原始碼沒送GET_PARAMETER 的 keepalive 封包,導致 1 分鐘後就斷線,之後也是透過 Wireshark 抓包,改 FFMpeg 原始碼才解決

透過觀察封包能夠快速釐清問題,不需要花大量時間去猜測問題,是網路開發中很重要的技巧之一!

Note: 如果有任何建議、問題或不同想法,歡迎留言或寄信給我,可以一起討論進步成長🙂

Leave a comment