转自:http://blog.zengrong.net/post/2646.html
做移动开发,抓包是基本功。现在的开发者当真是非常幸福,因为抓包工具已经非常成熟了。
在移动设备上抓包,需要下面几个方面的配合:
初级工具
先说个抓 HTTP(HTTPS) 包的例子算是入门啦。
移动设备支持
操作系统 | 越狱或root | 移动设备支持 |
---|---|---|
Android | 否 | 操作系统自带代理 |
iOS | 否 | 操作系统自带代理 |
代理服务器+分析工具
操作系统 | 软件 |
---|---|
Windows | Fiddler |
macOS | Charles |
Fiddler 是 freeware, 它的 macOS 版本已经在进行 beta 测试了,由于采用了 .NET Framework,它的 macOS 版本可以基于 mono 运行。
Charles 是商业软件,它也有 Windows 版本,由于使用 JAVA 编写,它的 Windows 版很容易实现。
既然它们都已经是全平台支持,怎么选就看你了。我目前主要在 macOS 下工作。就介绍 Charles 好了。
Charles 的配置很简单,只需要 在 Proxy->Proxy Settings
对话框中启动 HTTP Proxy,然后在移动设备上设置代理为 macOS 的 IP 地址即可。
设置 Charles
设置 iOS 的 HTTP 代理
设置 Android(小米手机) 的 HTTP 代理
有些安卓系统的 HTTP 代理设置需要长按 WIFI 名称,单击“修改网络”
接着要做的就是拿起手机访问访问网络。下图是我在 iOS 设备上使用 Safari 访问百度的包信息。是的,HTTPS 也是可以解密的,参见 Charles 的官方文档 SSL Proxying 即可。
Fiddler 的操作也类似,网上大把教程,这里就略过了。
进阶工具
有些应用比较调皮,不走操作系统的 HTTP 代理。还有些应用(例如游戏)直接走 TCP 协议,无法使用 HTTP 代理抓包。虽然 Charles 支持 SOCKS 代理,但无法分析 TCP 包。
这就需要祭出大杀器 tcpdump 和 Wireshark 啦。还有一些 App 可以直接运行在 Android 上进行抓包,这也是很方便的啊。
还可以使用透明代理来处理这些不走系统代理的应用,我在 [mitmproxy 应用(一)基础代理][2652] 一文中作了介绍。
移动设备支持
操作系统 | 越狱或root | 移动设备支持 |
---|---|---|
Android | 否 | PacketCapture |
Android | 否 | tPacketCapture |
Android | 是 | tcpdump |
iOS | 否 | rvictl |
代理服务器+分析工具
操作系统 | 软件 |
---|---|
Windows | Wireshark |
macOS | Wireshark |
Android - 支持抓包的 App(不需要 Root 权限)
PacketCapture 和 tPacketCapture 可以直接安装在 Android 设备上,他们会在设备上启动一个 VPN,让所有的网络流量都从 VPN 经过,从而实现抓包。这两个 App 在安装的时候都不需要 Root 权限。
包内容可以保存成 PCAP 格式,将其传到桌面环境中使用 Wireshark 打开分析。Charles 也可以打开 PCAP 格式,但是仅能分析其中的 HTTP 协议内容。
Packet Capture 抓包界面
tPacketCapture 抓包界面
Packet Capture 目前只能保存单个包,这略显不便。tPacketCapture 则可以将包内容直接保存到文件中。
Android - 使用 tcpdump 抓包(需要 Root 权限)
在 Android 上安装专用于安卓的 tcpdump ,然后启动它对 Android 的网卡抓包。这个方法很简单粗暴,但需要拥有 Root 权限。
用数据线将 Root 过的 Android 设备连上电脑,并开启 USB 调试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 检查设备是否连接 adb devices # 登入移动设备 adb shell # 切换到 Root 用户 su # 修改文件夹权限 chmod 777 /data/local/ # 退出移动设备 exit # 上传前面下载的 tcpdump 文件到移动设备 adb push ~/Downloads/tcpdump /data/local/ # 登入移动设备 adb shell # 切换到 Root 用户 su # 赋予 tcpdump 执行权限 chmod 777 /data/local/tcpdump # 改回文件夹权限 chmod 775 /data/local/ # 开始抓包,结果存到 SD 卡的 tcpdump.pcap 文件 /data/local/tcpdump -p -vv -s 0 -w /sdcard/tcpdump.pcap |
此时可以在手机上进行正常操作了。抓包结束的时候使用 Ctrl+C
结束 tcpdump 的执行,将 /sdcard/tcpdump.pcap
复制到桌面环境,使用 Wireshark 打开进行分析就 OK 啦。
iOS - 使用 rvictl 抓包(不需要越狱)
RVI 代表的意思是 Remote Virtual Interface 。这是 XCode 自带的一个工具,它可以将连接到 macOS 的 iOS 设备的网卡虚拟成 macOS 的网络设备。
若碰到提示 rvictl: command not found
,那么可能你需要访问 App Store ,安装 XCode 并运行一次。
先使用数据线连接 iOS 设备,打开 iTunes 获取 UDID,在保持数据线连接的情况下,执行下面的命令创建虚拟设备 rvi0 (xxxx代表设备的 UDID):
1 2 | rvictl -s xxxxxxxxxxxxxxx Starting device xxxxxxxxxxxxxxx [SUCCEEDED] with interface rvi0 |
开启 Wireshark 或者 tcpdump (macOS 自带) ,选择设备 rvi0 抓包即可。
抓包完毕后,要用 rvictl -x 取消使用。
更简单的办法
桌面系统上的 Wireshark 和 tcpdump 可以对该系统的网络设备抓包。因此我们只需保证移动设备的所有流量经过某个网络设备,就能得到它传输的所有信息。
把桌面设备变成一个热点,让移动设备通过该热点上网就能做到这点了。无论桌面设备使用有线网络还是无线网络,只需要购买一个无线网卡就能实现热点功能。不用做任何配置,就能抓包了。
其他工具
mitmproxy = Man In The Middle Proxy,这个名字相当的拉风啊。它是使用 Python + C 实现的开源软件。
mitmprxoy 是基于命令行界面的,但同时它可以在命令行界面进行交互。 另外,它也提供了一个类似于 tcpdump 的 mitmdump 工具。为了方便查看,它还提供了 mitmweb 这个可视化分析工具。
我写了两篇文章来介绍 mitmproxy 的应用。
另一个稍微小众一点的工具 burp 虽然是商业软件,但免费版提供的功能已经够用了。
苹果提供了一个相当详细的如何抓包的文档,其中提到了许多抓包软件和方法,值得一看:Getting a Packet Trace 。