天天看點

如何在 Android 手機上實作抓包?

如何在 Android 手機上實作抓包?

http://www.zhihu.com/question/20467503

我想知道某個應用究竟在資料送出到哪裡,送出了什麼。

網上的教程太複雜,不想麻煩。有沒有快速的方式實作在android網絡抓包?比如手機流量類監控軟體是否已經實作可否借鑒?

4 條評論 

分享

按投票排序按時間排序

48 個回答

190贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

Trinea,微信codek2,專注于源碼解析分享

萬象為賓客、殷xx、斷掌小饅頭 等人贊同

兩種方式,各有優劣且互補,一般第一種即可,對于不走代理的 App 選擇第二種方式

第一種 Fiddler:

利用 Fiddler 抓包,适合大多數走代理的應用,優點 (1) 無需 root (2) 對 Android 和 Iphone 同樣适用 (3) 操作更簡單友善(第一次安裝配置,第二次隻需設定代理即可) (4) 資料包的檢視更清晰易懂,Fiddler 的 UI 更簡單明了 。可見:http://www.trinea.cn/android/android-network-sniffer/

Mac 下可以使用 Charles。

第二種 Tcpdump:

對于不走代理的 App 可以利用 tcpdump 抓取 andorid 手機上網絡資料請求,利用 Wireshark 檢視,可見:如何利用Tcpdump抓取andorid網絡資料請求,Wireshark檢視

編輯于 2016-01-18 20 條評論 感謝 

 收藏 • 沒有幫助 • 

舉報

 • 作者保留權利

62贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

Caspar,移動端開發者,不折騰就會死星人

劉紙橫、劉培培、Alan Tanis 等人贊同

安裝 Packet Capture https://play.google.com/store/apps/details?id=app.greyshirts.sslcapture 這個 App 直接在手機上做抓包應該是比較簡單的:

  1. 不需要 root(用 VPNService 這個接口實作的本地代理)
  2. 有 MITM Proxy,可以檢視 https 流量(有這條還要什麼三輪車>_<)
  3. 适用于不走系統代理的 App

順帶一提,這個 App 也是我見到的第一個實際使用 Kotlin 來寫的 App

如何在 Android 手機上實作抓包?

如果還需要簡單改下 http request,可以考慮試試 HTTP Injectorhttps://play.google.com/store/apps/details?id=com.evozi.injector 這個 App

,同樣的它也不需要 root

如何在 Android 手機上實作抓包?

如果有更複雜的需求,當然還是 Fiddler / Charles 比較好

編輯于 2016-02-28 7 條評論 感謝 

61贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

高峰,個人技術部落格http://mrpeak.cn

Qi Shenwu、我的書包不見了、吳樂 等人贊同

tcpdump是最快捷友善的抓包方式,還可以加深對網絡協定的了解。android下可以通過如下方式抓包:

1 Android上啟動tcpdump

Android裝置可以把tcpdump的可執行檔案上傳到android裝置上,然後通過mac遠端登入android裝置運作tcpdump,前提是這台android裝置必須已經root過。步驟如下:

下載下傳android版本的tcpdump

從這個連結可以下載下傳到專門為android系統編譯的tcpdump版本。

通過adb将tcpdump上傳到android裝置

通過adb push将tcpdump檔案上傳到特定的目錄,這裡我們選擇/sdcard/data目錄。

如何在 Android 手機上實作抓包?

在android裝置上運作tcpdump

通過adb shell登陸裝置,并執行tcpdump,最後一步執行./tcpdump即可。

如何在 Android 手機上實作抓包?

2. 分析tcpdump輸出

經過上面的步驟成功運作tcpdump之後,接下來就可以分析輸出的網絡包内容了,iOS裝置和Android裝置的輸出是一緻的。我們先來解析下幾個基本的格式:

如何在 Android 手機上實作抓包?

圖中紅色方框内的部分是一個ip包的詳細記錄,類似的紀錄還有好幾條。這裡我們着重分析第一條的各部分字段含義。

14:37:41.615018 很簡單,是該包接收到的時間。

17.143.164.37.5223 是發送方的ip位址及端口号(5223是端口号)。

10.29.44.140.58036 是我android的ip位址及端口号。

Flags [P.] 是tcp包header部分的第14個位元組的P位。這個位元組所包含的幾個flag很重要,後面我會單獨詳細講解。這裡P位表示接受方需要馬上将包push到應用層。

seq 1:54 tcp包的seq号,1是起始值,54結束值。tcp之是以被認為是流,是因為tcp包所攜帶的每一個位元組都有标号(seq号)。1:54表明總共有54個位元組被接受,其中一個位元組是三次握手階段所使用,是以一共發送的長度是53位元組。

ack 101 tcp包的ack号,ack 101表明seq号為100的位元組已被确認收到,下一個期望接收的seq号從101開始。

win 255 win表示的是tcp包發送方,作為接受方還可以接受的位元組數。這裡win 255表明ip為17.143.164.37的主機還可以接受255個位元組。

options [nop,nop,…] options[…]表示的是該tcp包的options區域,nop是no opertion的縮寫,沒什麼實際用途,主要是用做padding,因為options區域按協定規定必須是4位元組的倍數。

options[… TS val 2381386761] ts val這個值是tcp包的時間戳,不過這個時間戳和裝置的系統時間沒啥關系,剛開始是随機值,後面随着系統時鐘自增長。這個時間戳主要用處是seq序列号越界從0重新開始後,可以确認包的順序。

options[… ecr 427050796] ts ecr這個值主要用來計算RTT。比如A發送一個tcp包給B,A會在包裡帶上TS val,B收到之後在ack包裡再把這個值原樣傳回,A收到B的ack包之後再根據本地時鐘就可以計算出RTT了。這個值隻在ack包裡有效,非ack包ecr的值就為0.

length 53 這個length是應用層傳過來的資料大小,不包括tcp的header。這個值和我們上面分析的seq 1:54是一緻的。

以上就是一個基本的tcp包結構,大家可以按照上面的分析再把其他幾個包了解下。我們在做應用的時候面對的更多是http協定,但對一個http請求是怎麼通過tcp/ip分解成一個個的packet,然後怎麼在網絡上穩定可靠的傳輸,要有個基本的印象。下面我們再看下tcpdump更多的功能,這些功能都是基于對tcp/ip協定的了解,遇到不了解的建議多google下相關的技術概念。

3. tcpdump知識拓展

再繼續深入tcpdump之前,先貼上一張tcp header格式圖,常看常新。

​[https://github.com/music4kid/music4kid.github.io/blob/master/images/tcpheader.png?raw=true](https://github.com/music4kid/music4kid.github.io/blob/master/images/tcpheader.png?raw=true)" width="1056">

3.1 TCP Flags(tcp header第十四個位元組)

我們再仔細看下上面提到的flags概念,flags位于tcp header的第十四個位元組,包含8個比特位,也就是上圖的CWR到FIN。這8個比特位都有特定的功能用途,分别是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。

CWR ,ECE 兩個flag是用來配合做congestion control的,一般情況下和應用層關系不大。發送方的包ECE(ECN-Echo)為0的時候表示出現了congestion,接收方回的包裡CWR(Congestion Window Reduced)為1表明收到congestion資訊并做了處理。我們重點看其他六個flag。

URG URG代表Urgent,表明包的優先級高,需要優先傳送對方并處理。像我們平時使用terminal的時候經常ctrl+c來結束某個任務,這種指令産生的網絡資料包就需要urgent。

ACK 也就是我們所熟悉的ack包,用來告訴對方上一個資料包已經成功收到。不過一般不會為了ack單獨發送一個包,都是在下一個要發送的packet裡設定ack位,這屬于tcp的優化機制,參見delayed ack。

PSH Push我們上面解釋過,接收方接收到P位的flag包需要馬上将包交給應用層處理,一般我們在http request的最後一個包裡都能看到P位被設定。

RST Reset位,表明packet的發送方馬上就要斷開目前連接配接了。在http請求結束的時候一般可以看到一個資料包設定了RST位。

SYN SYN位在發送建立連接配接請求的時候會設定,我們所熟悉的tcp三次握手就是syn和ack位的配合:syn->syn+ack->ack。

FIN Finish位設定了就表示發送方沒有更多的資料要發送了,之後就要單向關閉連接配接了,接收方一般會回一個ack包。接收方再同理發送一個FIN就可以雙向關閉連接配接了。

這8個flag首字母分别是:C E U A P R S F。初看難以記憶,我腦洞了下,把它們組合成 supr cafe,當然少了super少了個e,我可以将就下。我們在使用tcpdump的時候會經常看到這幾個flag,[S],[P],[R],[F],[.]。其他幾個都好了解,[.]特殊點,是個占位符,沒有其他flag被設定的時候就顯示這個占位符,一般表示ack。

3.2 tcpdump 更多使用參數

這部分我們來看下tcpdump常用的一些指令參數。文章最開始部分的tcpdump指令是這樣的:sudo tcpdump -i rvi0 -AAl。 -i rvi0 -AAl都是屬于參數部分。常見的有這些:

  • -i, 要監聽的網卡名稱,-i rvi0監聽虛拟網卡。不設定的時候預設監聽所有網卡流量。
  • -A, 用ASCII碼展示所截取的流量,一般用于網頁或者app裡http請求。-AA可以擷取更多的資訊。
  • -X,用ASCII碼和hex來展示包的内容,和上面的-A比較像。-XX可以展示更多的資訊(比如link layer的header)。
  • -n,不解析hostname,tcpdump會優先暫時主機的名字。-nn則不展示主機名和端口名(比如443端口會被展示成https)。
  • -s,截取的包位元組長度,預設情況下tcpdump會展示96位元組的長度,要擷取完整的長度可以用-s0或者-s1600。
  • -c,隻截取指定數目的包,然後退出。
  • -v,展示更多的有用資訊,還可以用-vv -vvv增加資訊的展示量。
  • src,指明ip包的發送方位址。
  • dst,指明ip包的接收方位址。
  • port,指明tcp包發送方或者接收方的端口号。
  • and,or,not,操作法,字面意思。

上面幾個是我個人比較常用的,更多的參數可以參考這個詳細文檔。有興趣的可以分析下面幾個例子練習下:

tcpdump ‘tcp[13] & 16!=0’

tcpdump src port 80 and tcp

tcpdump -vv src baidu and not dst port 23

tcpdump -nnvvS src 192.0.1.100 and dst port 443

4. 用tcpdump分析http完整請求

說了這麼多,我們再來實戰下,看一個完整的http請求流程。

下面截圖裡的流量是我監聽的 知乎App點贊之後發送的一個https請求。我之前先分析過server的ip位址了,tcpdump指令是:

sudo tcpdump -i rvi0 -AAl src 60.28.215.123 or dst 60.28.215.123

如何在 Android 手機上實作抓包?

圖中列出了6個前面的packet,10.29.44.240是我android的ip位址,60.28.215.123是知乎server的ip位址,紅色方框内是android發出的packet,白色方框内是server發出的packet。packet1是android三次握手的第一個syn包,packet2是server ack+syn的包,packet3是android ack的包。這3個packet之後tcp的三次握手就完成了。

packet4是android發出的http request。長度隻有240個位元組,是以一個packet就發過去了,當然還設定了flags的P位,request需要馬上被應用層處理。包裡面出現了spdy,點贊。

packet5是server ack剛收到的包,長度位0,是以這僅僅是一個ack包。

packet6是server傳回http的response了,1388個位元組。packet5和packet6都ack了seq為241的包,當然是為了增加ack的成功率。

中間還有好幾個packet就不仔細分析了,最後再看下請求完成的最後幾個包:

如何在 Android 手機上實作抓包?

最後兩個packet比較簡單,android發送個FIN+ACK的包就斷開連接配接了,server直接發送了一個RST包後也斷開連接配接了。

編輯于 2016-02-18 5 條評論 感謝 

14贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

multiple1902,請多指教。

沒有人、潘勇、知乎使用者 等人贊同

使用 tPacketCapture [0] ,無需 root,可以儲存下 pcap 格式的流量捕獲,然後在電腦上打開分析。

它的原理是建立一個虛拟的 VPN 連接配接,讓所有的流量都通過它。是以它捕獲不到二層的資訊,但這對于樓主的需求來說已經足夠了。

[0] Google Play 的頁面位址 https://play.google.com/store/apps/details?id=jp.co.taosoftware.android.packetcapture

編輯于 2014-07-13 1 條評論 感謝 

如何在 Android 手機上實作抓包?

陳明義

崔進、潘勇、容子浩 等人贊同

電腦上安裝個Charles,然後在Android手機上設定下代理,就可以在Charles上監聽到了。想看https的請求就稍微麻煩一些些,手機上得先安裝下證書,具體可以參考Using Charles Proxy to Optimize Mobile App Performance

釋出于 2013-08-08 2 條評論 感謝 

134贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

路人癸

孫海華、劉紙橫、swors swors 等人贊同

  • 有人提到Fiddler,但是Fiddler是針對HTTP
  • 有人提到設代理,但是Android并非所有App通訊都會像http請求乖乖的走代理,不是root不root的問題,ios同理
  • 有人提到tcpdump,但是tcpdump不能實時看通訊過程

建議

  1. 下載下傳 Wireshark ,支援800多種通訊協定
  2. 無線網卡建立虛拟AP
  3. 連接配接wifi,直接用wireshark抓包,一切通訊盡收眼底

釋出于 2014-09-13 22 條評論 感謝 

4贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

知乎使用者,此号被社 by:helen

劉紙橫、潘勇、劉博 等人贊同

Fiddler無疑是最好的抓包軟體,在windowsphone,安卓,IOS上完美抓包,無需安裝軟體和root,隻需要一個代理IP就能抓包(安裝證書後能抓取https資料),還能斷點和修改Request和Respons資料,對于一個程式員來說,Fiddler是在PC和手機端最好用的抓包軟體,也是功能最強大的抓包軟體。

telerik公司的産品,值得信賴

===========================

而且Fiddler提供了Fiddler SDK供程式員二次開發,目前我在WindowsPhone上,用Fiddler SDK配合加上一些黑科技,就實作了破解付費應用下載下傳和刷榜功能,So,Fiddler值得你擁有

編輯于 2014-07-14 6 條評論 感謝 

3贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

知乎使用者,聽我吹牛逼,賽過打飛機

傑迪杜、十三、知乎使用者 贊同

先下載下傳安裝wireshark和360Wi-Fi,用360Wi-Fi建立熱點,手機無線連接配接這個熱點,然後用wireshark抓取流量包。

釋出于 2014-09-19 2 條評論 感謝 

如何在 Android 手機上實作抓包?

colaghost,linux愛好者,民工,愛生活,愛技術,愛…

知乎使用者、知乎使用者、陳陽 贊同

tcpdump,不過要有root權限

釋出于 2013-08-08 添加評論 感謝 

10贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

李夢龍,android/TL/UI/PM

知乎使用者、uang yang G、蔔赫 等人贊同

我寫了一個軟體,你可以安裝一下,啟動抓包完成後通過郵件把碼流發給你,你用wireshark打開就可以看到了。下載下傳位址為 http://apk.gfan.com/Product/App328379.html

如何在 Android 手機上實作抓包?

釋出于 2012-09-11 10 條評論 感謝 

如何在 Android 手機上實作抓包?

風浪,擷取資訊,借鑒經驗,減少成長的代價!

沒有人、冬葉、很簡單的 等人贊同

看完答案我才發現難道隻有我一個人用Burpsuite嗎?

釋出于 2015-09-19 3 條評論 感謝 

2贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

知乎使用者,我說的都是錯的

知乎使用者、周劍 贊同

mac 上面使用charles

Windows上使用fiddler

伺服器上可以使用mitmproxy

以上三者都可以做到https的解析

編輯于 2016-02-25 添加評論 感謝 

如何在 Android 手機上實作抓包?

James Swineson,ADB 在手,天下我有

知乎使用者、泥水白佐 贊同

wifikill,能夠抓整個區域網路的包,不過完整版要收費。去XDA上面找作者釋出貼下載下傳即可。要求:Android4,root

編輯于 2013-08-08 2 條評論 感謝 

0贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

函子,被kernel panic艹翻中

android下可以用tcpdump

釋出于 2014-02-22 添加評論 感謝 

如何在 Android 手機上實作抓包?

alexsunmiu

Stetho ?

Stetho

https://www.youtube.com/watch?v=iyXpdkqBsG8

編輯于 2016-02-27 添加評論 感謝 

如何在 Android 手機上實作抓包?

王峰,文理均隻曉一點

知乎使用者、袁帥、羅征 贊同

google play 下載下傳shark for root,很友善

釋出于 2013-06-23 添加評論 感謝 

如何在 Android 手機上實作抓包?

知乎使用者,<img src =

就是一盤菜、文謙、qq anullops 等人贊同

1. Android手機需要先獲得root權限。一種是否獲得root權限的檢驗方法:安裝并打開終端模拟器(可通過安卓市場等管道獲得)。在終端模拟器界面輸入su并回車,若報錯則說明未root,若指令提示符從$變#則為rooted;

2. 如果Android手機尚未root,可通過superoneclick或其它方法進行root處理(需要先安裝Microsoft .NET Framework)。Superoneclick刷root權限教程:(http://soft.shouji.com.cn/news/501.shtml)

3. 需要先獲得 Android SDK

4. 需要獲得tcpdump軟體,擷取位址(http://www.strazzere.com/android/tcpdump)

抓包步驟

1. 将Android手機與電腦USB相連,打開windows指令提示符視窗

2. 将tcpdump程式copy至android手機(該指令前面那個目錄檔案為本地位址,後面那個目錄為目的手機端位址)

C:\android-sdk-windows\platform-tools>adb push c:/tcpdump /data/local/tcpdump

3. 修改tcpdump的權限

C:\android-sdk-windows\platform-tools>adb shell

#chmod 777 /data/local/tcpdump

4. 進入root權限

$ su

在運作su指令後,手機終端桌面會出現相應提示資訊以确認您對root操作的認可。

5. 運作tcpdump,輸入以下指令啟動抓包。

/data/local/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap

6. 在手機端執行相應需要進行抓包分析的操作,執行完成後在指令提示符視窗執行Ctrl+C中斷抓包程序

釋出于 2014-02-22 4 條評論 感謝 

如何在 Android 手機上實作抓包?

憂郁的頭皮屑,2016:有些事自己知道就行,不能說…

tcpdump for android…

釋出于 2015-04-08 添加評論 感謝 

如何在 Android 手機上實作抓包?

我都是電腦開熱點,手機連電腦,然後電腦開始抓包····畢竟我不用安卓·

釋出于 2016-02-23 添加評論 感謝 

1贊同反對,不會顯示你的姓名

如何在 Android 手機上實作抓包?

豬肉粉,zsf222

賈藝馳 贊同

用電腦搭建一個WiFi共享,然後手機連到上面,在電腦上抓包。