做移动端开发或者接口联调的时候,经常需要知道App到底发了什么请求、返回了什么数据。浏览器里有开发者工具可以直接看,但原生App没有这么方便的入口,这时候就得靠抓包工具来解决。移动端抓包的核心思路是让手机的网络流量经过一台电脑上的代理程序,由代理程序转发请求并记录内容,如果请求是HTTPS加密的,还需要在手机上安装对应的CA证书才能看到明文。本文把原理、工具、各平台配置方法和常见问题一次讲清楚。

一、抓包的基本原理:代理转发与证书解密
抓包工具的本质是一个HTTP(S)代理服务器。手机连上同一个Wi-Fi后,把代理地址指向电脑的IP和端口,所有HTTP请求就会先经过这台代理,工具把请求记录下来再转发给真实服务器,响应也原路返回。对于HTTP明文请求,代理可以直接看到全部内容,这一步没有任何难度。
麻烦的是HTTPS。HTTPS通信使用非对称加密协商出对称密钥,中间人理论上无法解密内容。抓包工具的做法是中间人攻击的合法版本:当手机发起HTTPS请求时,工具会动态生成一张伪造证书,伪装成目标网站的证书发给手机,同时在另一边以客户端身份与真实服务器握手。前提是手机必须信任抓包工具的CA根证书,否则系统会判定证书不可信直接断开连接,这也是抓HTTPS包之前必须先装证书的原因。
理解了这个原理,很多问题就好解释了。比如某些金融类App内置了证书校验(SSL Pinning),只信任自己的证书,代理生成的伪造证书过不了校验,请求就会失败;再比如高版本系统对用户证书的权限收紧,导致装了证书依然抓不到包,这些后面会具体说解决方案。
二、常用抓包工具对比与选择
桌面端抓包工具很多,最常用的有三款。Charles功能全面,界面直观,请求按域名分组展示,支持断点篡改请求、Map Local映射本地文件、弱网模拟(Throttling)等高级功能,macOS和Windows都能跑,是移动端调试的主流选择。Fiddler在Windows平台使用广泛,自带强大的请求过滤和自定义脚本(JScript),可以写规则自动化处理请求,缺点是macOS支持一般。mitmproxy是命令行工具,适合喜欢脚本化的开发者,支持用Python编写 addon 对请求响应做任意处理,也提供 mitmweb 网页界面,做自动化测试或者批量接口分析时非常顺手。
| 工具 | 平台 | 特色功能 | 适用人群 |
|---|---|---|---|
| Charles | Win/Mac/Linux | 断点、Map Local、弱网模拟 | 日常App调试 |
| Fiddler | Windows为主 | 过滤规则、自定义脚本 | Windows用户 |
| mitmproxy | 跨平台(命令行) | Python脚本扩展、自动化 | 测试开发 |
如果是简单的HTTP抓包或者只想看TCP层面的原始数据,还可以用Wireshark配合tcpdump,但它对HTTPS内容无能为力,定位移动端接口问题时不如上述工具直接。选择上不必纠结,先装一个Charles把流程跑通,等遇到自动化需求再换mitmproxy也不迟。
三、Android平台抓包配置详解
以Charles为例,先在电脑上打开菜单里的Proxy Settings,确认HTTP Proxy端口(默认8888),然后在Charles的Help菜单查看本地IP地址。手机端进入当前Wi-Fi的详情页,修改网络设置,代理选择手动,服务器填电脑IP,端口填8888。保存后访问任意网页,Charles会弹窗询问是否允许该设备接入,点Allow即可看到请求列表。
接下来处理HTTPS。在手机浏览器访问 chls.pro/ssl 下载证书(不同工具地址不同,Fiddler是 http://ipv4.fiddler:8888/FiddlerRoot.cer),下载后在系统设置里安装。Android 7.0之后有个关键变化:App默认只信任系统证书,不再信任用户安装的证书,导致很多App的HTTPS请求抓不到。解决办法有三种:一是修改App的manifest,添加networkSecurityConfig配置信任用户证书,适合自己公司的App;二是把证书装到系统目录(需要root,将证书放到/system/etc/security/cacerts);三是用Magisk模块移动用户证书到系统区,相对省事。如果是调试自家应用,第一种最规范,配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</domain-config>
</network-security-config>同时在manifest的application节点加上 android:networkSecurityConfig="@xml/network_security_config" 引用该文件。另外提醒一点,手机和电脑必须在同一局域网,且电脑防火墙要放行代理端口,否则连不上代理是最常见的初级问题。
四、iOS平台抓包配置详解
iOS的代理设置路径是:设置中进入当前Wi-Fi,点右侧的感叹号进入详情,拉到最下面配置HTTP代理,选手动,填入服务器和端口,保存即可。证书安装方面,用Safari访问 chls.pro/ssl 下载描述文件后,还要去设置、通用、关于本机、证书信任设置里手动开启对该根证书的完全信任,这一步很多人会漏掉,导致装了证书依然报SSL错误。
用模拟器抓包会更省事,模拟器共享Mac的网络环境,代理设置和真机一样,证书装一次就行。需要注意iOS 10.3之后证书信任入口挪到了关于本机层级下面,找的时候别慌。如果抓的是自己开发的App,还可以直接在Xcode工程里设置ALLOW arbitrary loads或者ATS例外,减少不必要的限制。
iOS上还有一类特殊情况:App使用了证书绑定(Certificate Pinning),典型表现是其他App都能抓,唯独某个App请求全部失败。这种情况普通配置无解,要么联系开发在Debug版本里关掉校验,要么借助越狱环境配合插件绕过,但后者涉及安全边界,建议只在测试自己公司的App时使用。
五、常见问题与进阶技巧
抓包过程中最常遇到的坑可以归纳几类。第一类是抓不到任何请求,先检查代理是否连通、防火墙是否放行;第二类是HTTP能抓HTTPS抓不到,基本是证书没装或者没开启完全信任;第三类是只有个别App抓不到,多半是系统证书限制或SSL Pinning,按前面说的方案处理。还有一种是请求内容显示乱码或gzip字样,开启工具里的SSL Proxying并对具体域名启用即可。
进阶用法方面,Charles的Map Local可以把接口响应替换成本地JSON文件,非常适合前端联调后端接口没 ready 的场景;Breakpoints功能可以在请求发出前或响应返回前暂停,手动修改参数或数据,测试各种边界条件;Throttling可以模拟弱网和断网,验证App的加载态和错误提示。配合Rewrite规则还能批量替换响应字段,比手动改数据高效得多。
最后强调合规问题。抓包能力只应用在自己有权限测试的App和自己的开发环境上,对他人App的通信内容进行拦截分析可能违反法律法规和用户协议。团队内部使用时,建议统一搭建测试环境并使用专用测试证书,把抓包作为正常的调试手段而不是规避安全机制的工具,这样才能让这项技术发挥正面价值。