如何在 Android 手机上实现抓包?

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

我想知道某个应用究竟在数据提交到哪里,提交了什么。
网上的教程太复杂,不想麻烦。有没有快速的方式实现在android网络抓包?比如手机流量类监控软件是否已经实现可否借鉴?
4 条评论

分享

按投票排序按时间排序

48 个回答

190赞同反对,不会显示你的姓名
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赞同反对,不会显示你的姓名
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

如果还需要简单改下 http request,可以考虑试试 HTTP Injectorhttps://play.google.com/store/apps/details?id=com.evozi.injector 这个 App
,同样的它也不需要 root

如果有更复杂的需求,当然还是 Fiddler / Charles 比较好

编辑于 2016-02-28 7 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

61赞同反对,不会显示你的姓名
高峰,个人技术博客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设备上运行tcpdump

通过adb shell登陆设备,并执行tcpdump,最后一步执行./tcpdump即可。


2. 分析tcpdump输出

经过上面的步骤成功运行tcpdump之后,接下来就可以分析输出的网络包内容了,iOS设备和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

图中列出了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就不仔细分析了,最后再看下请求完成的最后几个包:

最后两个packet比较简单,android发送个FIN+ACK的包就断开连接了,server直接发送了一个RST包后也断开连接了。

编辑于 2016-02-18 5 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

14赞同反对,不会显示你的姓名
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 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

14赞同反对,不会显示你的姓名
陈明义
崔进、潘勇、容子浩 等人赞同

电脑上安装个Charles,然后在Android手机上设置下代理,就可以在Charles上监听到了。想看https的请求就稍微麻烦一些些,手机上得先安装下证书,具体可以参考Using Charles Proxy to Optimize Mobile App Performance
发布于 2013-08-08 2 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

134赞同反对,不会显示你的姓名
路人癸
孙海华、刘纸横、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赞同反对,不会显示你的姓名
知乎用户,此号被社 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赞同反对,不会显示你的姓名
知乎用户,听我吹牛逼,赛过打飞机
杰迪杜、十三、知乎用户 赞同

先下载安装wireshark和360Wi-Fi,用360Wi-Fi建立热点,手机无线连接这个热点,然后用wireshark抓取流量包。
发布于 2014-09-19 2 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

3赞同反对,不会显示你的姓名
colaghost,linux爱好者,民工,爱生活,爱技术,爱…
知乎用户、知乎用户、陈阳 赞同

tcpdump,不过要有root权限
发布于 2013-08-08 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

10赞同反对,不会显示你的姓名
李梦龙,android/TL/UI/PM
知乎用户、uang yang G、卜赫 等人赞同

我写了一个软件,你可以安装一下,启动抓包完成后通过邮件把码流发给你,你用wireshark打开就可以看到了。下载地址为 http://apk.gfan.com/Product/App328379.html
发布于 2012-09-11 10 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

4赞同反对,不会显示你的姓名
风浪,获取信息,借鉴经验,减少成长的代价!
没有人、冬叶、很简单的 等人赞同

看完答案我才发现难道只有我一个人用Burpsuite吗?
发布于 2015-09-19 3 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

2赞同反对,不会显示你的姓名
知乎用户,我说的都是错的
知乎用户、周剑 赞同

mac 上面使用charles
Windows上使用fiddler
服务器上可以使用mitmproxy
以上三者都可以做到https的解析
编辑于 2016-02-25 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

2赞同反对,不会显示你的姓名
James Swineson,ADB 在手,天下我有
知乎用户、泥水白佐 赞同

wifikill,能够抓整个局域网的包,不过完整版要收费。去XDA上面找作者发布贴下载即可。要求:Android4,root
编辑于 2013-08-08 2 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

0赞同反对,不会显示你的姓名
函子,被kernel panic艹翻中
android下可以用tcpdump
发布于 2014-02-22 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

0赞同反对,不会显示你的姓名
alexsunmiu
Stetho ?
Stetho
https://www.youtube.com/watch?v=iyXpdkqBsG8
编辑于 2016-02-27 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

3赞同反对,不会显示你的姓名
王峰,文理均只晓一点
知乎用户、袁帅、罗征 赞同

google play 下载shark for root,很方便
发布于 2013-06-23 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

14赞同反对,不会显示你的姓名
知乎用户,<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权限

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

在运行su指令后,手机终端桌面会出现相应提示信息以确认您对root操作的认可。

5. 运行tcpdump,输入以下命令启动抓包。

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

6. 在手机端执行相应需要进行抓包分析的操作,执行完成后在命令提示符窗口执行Ctrl+C中断抓包进程

7. 将抓包结果复制至本地(前面那个目录为手机端地址,后面那个目录为本地地址)

C:\android-sdk-windows\platform-tools>adb pull /sdcard/capture.pcap c:/

8. 使用Wireshark等工具查看抓包文件capture.pcap

发布于 2014-02-22 4 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

0赞同反对,不会显示你的姓名
忧郁的头皮屑,2016:有些事自己知道就行,不能说…
tcpdump for android…
发布于 2015-04-08 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

0赞同反对,不会显示你的姓名
知乎用户,创业狗/求投资/业余影迷/游戏渣/二次元/…
我都是电脑开热点,手机连电脑,然后电脑开始抓包····毕竟我不用安卓·
发布于 2016-02-23 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

1赞同反对,不会显示你的姓名
猪肉粉,zsf222
贾艺驰 赞同

用电脑搭建一个WiFi共享,然后手机连到上面,在电脑上抓包。

如何在 Android 手机上实现抓包?相关推荐

  1. 如何在Android手机上进行Google Map的开发。

    1.题记 提起谷歌Map相信大家都不会陌生,那进入我们今天的话题,如何在Android手机上进行Google Map的开发. 2.Map应用程序的开发 2.1 准备工作 2.1.1 申请Android ...

  2. 小程序影藏溢出的gif_如何在Android手机上快速实现视频转GIF动图呢?

    毫无疑问,Android是目前使用最广泛的手机系统.GIF很有趣,并且比视频占用更少的存储容量.本文将向您介绍如何在Android手机上快速转GIF动图的多种方法. [官网]万兴优转 - 顶尖音视频格 ...

  3. android h 游戏下载地址,Android h游戏_如何在Android手机上玩游戏

    最近人们喜欢在手机上玩游戏. 除了一些手机游戏(Android H游戏)之外安卓才可以玩的h,越来越多的朋友开始寻找Android手机游戏. 但是,有些人已经搜索了很长时间,还没有找到合适的游戏来玩. ...

  4. android程序如何加密软件,如何在Android手机上隐藏(加密)文件夹(软件)

    今天,我将向您展示如何在Android手机上隐藏(加密)文件夹(软件)以及如何在Android手机上隐藏(加密)文件夹(软件),以便您轻松解决问题. 在使用Android手机的过程中,出于各种原因,我 ...

  5. android手机进行android开发,如何在Android手机上进行自动化测试(上)

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本节教程,你将了解到以下内容: 如何在脚本代码中.运行脚本时指定手机 如何填写--device Android:/// ...

  6. csv短信回复到android,如何在Android手机上恢复已删除的短信?

    原标题:如何在Android手机上恢复已删除的短信? 文本消息在我们的交流中变得越来越重要.如果您丢失或意外删除了Android手机中的短信,该如何恢复呢?许多Android用户认为无法检索已删除的消 ...

  7. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

  8. 使用tcpdump在iphone手机上的抓包流程和原理概述

    在ios应用开发过程中,为了进行端到端的分析,很多时候我们需要对手机的抓包进行分析. 对手机的抓包我们要在手机上安装抓包工具:tcpdump 前提:手机越狱:安装tcpdump    这样一部ipho ...

  9. 如何在Android手机上安装两个相同的应用

    想在android手机上安装两个相同的应用,本以为可以安装不同版本的,试了几次,均相互覆盖了,于是,只能设法修改apk所对应的包名(package name). 目的声明:本文只是为了满足DIY的需要 ...

最新文章

  1. LeetCode Remove Element
  2. Python 内编写类的各种技巧和方法
  3. [云炬创业学笔记]第一章创业是什么测试11
  4. python保存至对应目录_python相对目录的基本用法(一)
  5. 你根本不懂rebase-使用rebase打造可读的git graph
  6. LeetCode - 7 - Reverse Integer
  7. 为什么我们使用volatile关键字? [重复]
  8. linux 用vi命令的使用以及vi编辑后的后续保存退出等相关命令的使用
  9. 身体出现十个信号当心短命
  10. RTX——第13章 事件标志组
  11. ZZULIOJ 1065 统计数字字符的个数
  12. 请相信一个绝地反击的故事
  13. 程序质量:代码静态检查
  14. springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解
  15. Linux ASPM 问题一个适合的解决方案
  16. C++ getline()函数的用法
  17. [转载] 真正可用的使用T5577卡复制4100卡_ID卡复制操作流程
  18. 小程序 const moment = require('moment')_有C语言程序员说,使用移位操作代替乘除运算效率更高,真的吗?...
  19. 全球与中国钻探胶管市场深度研究分析报告
  20. 基于区块链的防护物资捐赠监管系统(三):功能设计

热门文章

  1. prompt和instruct的区别究竟是什么
  2. 创业不知道做什么的看过来了——干货分享,禁止转载。
  3. 支付宝PC端二维码支付(沙箱环境)
  4. ios android 同服 游戏,安卓IOS刚兴起时,那些装机必备的休闲游戏,到今天也是同类TOP...
  5. 【认证系统】win7主题下载
  6. 易语言大漠多线程模板脚本主线程
  7. 【转】京东云缓存JIMDB建设之路
  8. SWUST OJ 1184 神偷喵星人
  9. Sudoku(16*16)
  10. Covid-19新冠肺炎疫情相关数据集