Android 抓包並通過 Wireshark 分析


  • 分析 Android 中 app 的網絡數據交互,需要在 Android 上抓包,常用工具為 tcpdump ,用 tcpdump 生成 Wireshark 識別的 pcap 文件,把 pcap 文件從手機上拷貝到電腦上,Wireshark 加載 pcap 文件,通過 Wireshark 分析 tcpdump 抓取的數據

tcpdump 安裝

  1. 手機需要 root
  2. 下載 Android tcpdump
  3. 使用 adb 命令把 tcpdump 放入到手機中
    adb push tcpdump /sdcard/
    adb shell su cat /sdcard/tcpdump > /system/bin/tcpdump
  4. 當提示沒有權限時,輸入
    monut
  5. 在結果中找到包含 /system 的一行,類似:
    /dev/block/bootdevice/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0
  6. 執行如下命令
    mount -o remount /dev/block/bootdevice/by-name/system
  7. 這時 /system 擁有寫權限,繼續執行
    cat /system/tcpdump > /system/bin/tcpdump
    chmod 777 /system/bin/tcpdump
  8. 這樣 tcpdump 就成功安裝到了 /system/bin 目錄下

使用 tcpdump 抓包

  1. 使用 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

  2. 通過 adb pull 命令拿到 pcap 文件,

     adb pull /sdcard/capture.pcap .
    
  3. 使用 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 ]
  1. 類型的關鍵字

    host(缺省類型): 指明一台主機,如:host 210.27.48.2

    net: 指明一個網絡地址,如:net 202.0.0.0

    port: 指明端口號,如:port 23

  2. 確定方向的關鍵字

    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

  3. 協議的關鍵字:缺省值是監聽所有協議的信息包

    fddi

    ip

    arp

    rarp

    tcp

    udp

  4. 其他關鍵字

    gateway

    broadcast

    less

    greater

  5. 常用表達式:多條件時可以用括號,但是要用\轉義

    非 : ! or "not" (去掉雙引號)

    且 : && or "and"

    或 : || or "or"

  6. 選項

     -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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM