专栏文章 研发神器:一键网络抓包

UC研发效能 · 2020年07月14日 · 最后由 花开 回复于 2020年07月25日 · 8811 次阅读

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 开启网络安全配置,详见

https://developer.android.com/training/articles/security-config.html

9、免费试用

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

共收到 3 条回复 时间 点赞

比较好奇 安卓系统API进行网络切换和代理设置, 之前也有这个想法,但是好像安卓没有这样的 api 可以直接操作,然后目前看到的方案都是通过反射做的。但是每个版本接口好像也不一致。这块可以再分享多一点么?

花开 回复

切换 wifi 开源项目还是有不少的,可以参考类似:
https://github.com/steinwurf/adb-join-wifi

YueChen 回复

切换比较好实现,主要是切换好以后的代理设置,难道提前设置好?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册