手机抓包软件的原理区别

背景

最新常收到邮件询问 mitmproxy helperWireshark Helper 和普通抓包软件有什么区别.
这两款软件诞生的起因是, 从事网络工作的一个朋友觉得目前的手机抓包软件不够'彻底', 导致很多包抓不到, 于是一起花时间根据网络工作者常工作的场景做了两款软件.
于是在这里统一解释下.

基础知识

TCP/IP 四层模型

应用层 | 比如 HTTP协议
传输层 | 比如 TCP/UDP协议
网络层 | 比如 IPv4/IPv6包
链路层 | 比如 以太网

系统代理和虚拟网卡

咱们先搞清楚两个概念, 一个是系统代理, 一个是虚拟网卡.
咱们先从桌面系统举例.

系统代理

这个概念大家想必大家都比较熟悉, 比如 macOS, 在 系统偏好->网络->高级->代理 里就可以修改系统代理,
但是在这里设置代理后, 【应用软件会不会走这个代理完全取决于应用软件自己】, 比如 Chrome 浏览器会走这儿设置的代理, 而 Terminal 等很多应用就选择无视这个代理.
这里其实工作在应用层, 在这里拦截的话, 抓包工具只需要处理应用层的协议包即可.
这也是目前大部分抓包工具实现的方式.

虚拟网卡

虚拟网卡的原理和就和普通网卡一样, 在这里它工作在最底层的链路层.
如果我们将所有包都路由到这个虚拟网卡上, 这也就意味着应用软件都会经过它, 不再取决于应用软件想不想了.
在这里拦截, 实现起来就比较麻烦, 不是了解个 HTTP 协议就可以的, 需要关心整个 TCP/IP 栈, 首先要处理网络层的 IP 协议包, 再将 IP 包转换为网络层的 TCP/UDP 协议, 再将 TCP/UDP 协议对应到应用层协议处理.

mitmproxy helperWireshark Helper 目前就是使用了虚拟网卡的方式拦截.

手机端

我们前面说了系统代理虚拟网卡的区别, iOS 和 Android 也有相同的概念, 即抓包工具可能在系统代理拦截, 也可能在虚拟网卡级别拦截.

注意:【App 可以很容易地跳过系统代理】,比如:.connectionProxyDictionary = [AnyHashable : Any]()

mitmproxy helperWireshark Helper 目前就是使用了虚拟网卡的方式拦截.

iOS 端

iOS 端抓包需要使用 Network Extension 技术, 意味着手机顶部会出现 VPN 标识.

是不是出现了 VPN 标识就意味着[一定]是在[虚拟网卡]层拦截?

答案: 不是.

因为 iOS 端用程序设置系统代理也需要使用 Network Extension 技术,
所以出现了 VPN 标识, 抓包工具仍可能是在[系统代理]层进行拦截的,
有些抓包工具作者会在简介里说明在哪一层进行拦截的, 没写的就需要询问下作者了.

为什么以及如何关闭系统和浏览器安全 DNS

目前 Android 系统内置 Private DNS(DoT), 以及桌面和手机版 Chrome 提供内置安全 DNS(DoH).

而当开启 DoT 或 DoH 时,无法拦截查询内容以进行针对不同域名使用不同的 DNS 解析的效果.

所以我们要关闭它:

TLS 解密

先拦截到包再解密, TLS 解密的原理(很多协议的加密都是使用的 TLS 加密技术, 比如 HTTPS 等)就是中间人, 即会需要安装一个根证书到手机系统里.

如果你之前没操作过安装信任根证书, 这里有两个视频 Wireshark Helper Videomitmproxy helper video.
一定要仔细观看视频, iOS 需要在两个地方进行操作后才生效, 视频是演示的是 iOS 14, 不同版本的系统可能操作还略有不同.
Android 系统还造出了用户证书和系统证书的概念, 要安装到系统证书里需要 Root.

是不是安装信任了根证书就[一定]可以解密任何的加密?

如果你了解了加密的原理, 就可以得出不一定结论. 举个例子, 假设客户端和服务端约定一个密码和一个加密算法,
然后客户端将这个密码写到客户端代码里, 需要加密的时候用这个密码加密后发给服务端,
服务端再用相同的密码解密收到的客户端数据, 这个时候只有知道密码和加密算法的人才能解密.
也就是说安装信任了根证书的方式, 中间人可以解密主流的 TLS 加密, 对于定制的或魔改的加密是无能为力的.

我们为什么选择 Wireshark 和 mitmproxy 作为 View 层

虽然他们的 UI 不是最好看的,但是作为 View 层没有比他们更强的,Wireshark 更是几乎伴随着早期互联网一同发展起来的工具。
有很多 UI 华丽的主流抓包工具对我们来说是不能用的,因为相对于这俩 View 层,无论是协议查看颗粒度还是操作都太简陋了,华不如实。

感谢对我的工作的支持

mitmproxy helper

Wireshark Helper