阅读 1901

研发神器:一键网络抓包

1、简介

网络抓包(Packet Capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作。

在移动开发中,需要对手机的网络行为进行监控测试,排查网络、安全相关的问题。岩鼠平台上线了抓包功能,方便用户快速的进行网络监测,其中Android支持一键抓包,而iOS需要用户自行手动设置代理来实现抓包。

本文主要介绍岩鼠平台在移动端的真机抓包方案。具有以下特点:

  • 一键开启,无须任何配置(动态切换WIFI,设置代理,安装证书)

  • 不需要依赖任何分析工具,支持在线实时查看瀑布流

  • 支持多种协议:HTTP/ HTTP2/HTTPS/WebSocket/TCP等

2、效果演示

image.png

3、抓包原理

要实现对App的网络数据抓包,需要监控App与服务器交互之间的网络节点,监控其中任意一个网络节点(网卡),获取所有经过网卡中的数据,对这些数据按照网络协议进行解析,这就是抓包的基本原理。但是中间网络节点,不受我们控制,所以基本无法实现抓包的,只能在客户端和服务端进行抓包。通常我们监控本地网卡数据,如下图:

image.png

手机、本地网络属于客户端侧的抓包,接入设备、服务器属于后台侧的抓包,两者本质上类似。本地网络指的是WIFI的路由,如果直接抓路由器的包还是比较麻烦的,因此我们会在手机和本地路由之间加一层代理服务,这样只要抓代理服务的网络数据即可,如下图:

image.png

4、方案选型

Android出于安全性的考虑,并不支持抓包。所以现在Android上的抓包方式五花八门,但是不外乎两种,一种是通过android Linux的特点使用Tcpdump抓取信息,Tcpdump在Linux上需要su用户,在android上就需要root手机才能实现,而且Tcpdump是命令行工具,不便于分析结果。另一种方式是通过设置网络通道的方法抓包,如网络代理、AP等,这一类方法的优点是不需要手机Root,但是需要PC支持无线网络。但由于Tcpdump方式不支持HTTPS,因此我们选型以第二种为主。

4.1、Fiddler

Fiddler原本是一个网页调试工具,能够监听的HTTP协议,包括HTTPS。他的强大功能是允许你设置断点,修改输出数据,并且用户界面友好,使用简单,有对各种数据格式进行解析,方便查看。Fiddler另外一个好处是通过设置代理,可以过滤其他程序的信息。Fiddler基于微软的.net平台编写,所以目前只支持Windos系统

4.2、Wireshark

Wireshark是目前最流行的抓包工具,支持的协议多达850种,从最基础的IP协议和DHCP协议到高级的专用协议,如AppleTalk和BitTorrent等都能支持,是目前支持协议最多的抓包工具。由于Wireshark是开源软件,每次更新都会增加一些新的协议支持。同时它是一个跨平台的软件,可以在unix系列、linux、mac os、windows等多个平台上面进行网络协议抓包工作,但是还没有支持Android。Wireshark的前身叫Ethereal,2006年因为其创始人Gerald Combs的跳槽而改名为wireshark

4.3、Mitmproxy

Mitmproxy是一个基于Python的中间人代理的开源框架。同时 MitmProxy 还有两个关联组件,一个是 MitmDump,它是 MitmProxy 的命令行接口,利用它我们可以对接 Python 脚本,用 Python 实现监听后的处理。另一个是 MitmWeb,它是一个 Web 程序,通过它我们可以清楚地观察到 MitmProxy 捕获的请求。

4.4、Anyproxy

Anyproxy是阿里巴巴开源的一个基于nodejs开发的中间人代理框架,支持HTTP/HTPS的解析,提供WEB界面

5、方案对比

image.png

最终我们是选择了mitmproxy作为代理服务

6、方案演进(踩坑之旅)

从大体确定方案,到最终的方案落地,过程中踩了不少坑,方案也做了多次调整

方案1、PC + USB无线网卡开热点 + 手机设置代理 + Mitmproxy

方案可行,存在问题:linux驱动无线网卡困难;无线网卡开热点非常不稳定,经常会自己关闭

方案2、PC + USB无线网卡开热点 + iptables NAT + Mitmproxy

方案可行,存在问题:linux驱动无线网卡困难;无线网卡开热点非常不稳定,经常会自己关闭;NAT只配置过来透传TCP,UDP配置非常麻烦

方案3、PC + 双有线网卡 + 无线路由+ iptables NAT + Mitmproxy

方案可行,存在问题:无线路由需要使用电脑的有线网络作为出口上网,路由器下方开启的无线网络接入的手机,在Mitmproxy只能获取到无线路由器的IP,无法获取到具体的手机IP,需要扩展Mitmproxy

方案4、服务器 + 有线网卡 + 公共热点(连接该热点的设备和服务器之间网络互通) + 手机设置代理 + Mitmproxy

最终,方案4在岩鼠平台落地

7、数据链路

image.png

流程说明:

1、用户在真机使用界面点击【开启】按钮开启抓包功能

2、UI层通过websocket方式将启动抓包指令发送给WEB层

3、WEB层接受到开启抓包指令后,获取websocket中的消息内容,安装云真机后端约定的协议,将消息推送到消息队列中

4、云真机后端订阅了消息队列中的指定消息,当收到消息后,会调用手机上预先安装好的APP的接口进行切换网络和设置代理的操作(云真机后端服务器和手机之间通过USB连接,手机预先安装的APP会启动一个端口供云真机后端调用)

5、手机上面的APP接收请求后,调用安卓系统API进行网络切换和代理设置

6、手机网络设置成功后,手机上面的APP能接收到消息,通过原来链接将切换成功的消息逐个模块返回,最终返回到UI

7、UI收到消息后,会调用抓包服务接口,启动抓包服务

8、抓包服务收到消息,会为每台手机动态分配一个端口,并将在线查看瀑布流的URL返回给UI

9、UI接收到响应结果后,通过iframe方式嵌入在线查看瀑布流页面,用户可以查看到实时的请求数据

8、特别说明

Android 7.0+由于系统的限制,默认无法抓取APP https网络包。如果需要抓取指定APP的https网络包,需要APP开启网络安全配置,详见

developer.android.com/training/ar…

9、免费试用 免费试用岩鼠云真机,体验下一键网络抓包的吧! 点击访问岩鼠云设备平台