1. 项目概述:为什么小程序抓包越来越难?
最近在分析一个微信小程序的数据交互逻辑时,我又一次被卡在了抓包这个环节。和几年前不同,现在无论是安卓真机还是模拟器,想用 Burp Suite 这类工具抓到微信小程序的 HTTPS 数据包,难度直线上升。这背后主要就是系统对证书信任机制的收紧。特别是从 Android 7.0(API Level 24)开始,系统引入了一项名为“网络安全配置”的机制,默认只信任系统预装的CA证书,而不再信任用户手动安装的证书。这意味着,即使你把 Burp Suite 的 CA 证书装到了手机的“用户凭据”里,对于目标 API Level >= 24 的应用(包括很多新版的微信及其小程序),这些请求依然会因证书不被信任而失败。
所以,传统的抓包方法——在模拟器里装个 Burp 证书就完事——已经行不通了。我们必须把 Burp Suite 的 CA 证书安装到系统的受信任根证书存储区,也就是进行“系统级”安装。但模拟器的系统分区默认是只读的,这就需要一些特殊的操作。经过多次实践,我找到了一套在逍遥模拟器(Android 7.1内核)上稳定可行的组合方案。这个方案的核心思路是:利用一个已 Root 的模拟器环境,将 Burp 的 CA 证书直接推送到系统证书目录,从而绕过应用级别的证书校验。接下来,我就把这套从环境准备、证书安装到最终抓包的完整流程,以及我踩过的坑和解决方案,详细分享给你。
2. 核心工具选型与环境准备
工欲善其事,必先利其器。这套方案的成功,依赖于几个关键工具的特定版本和正确配置。盲目使用最新版可能会遇到各种兼容性问题,下面是我实测可用的组合。
2.1 为什么选择逍遥模拟器 7.1 版本?
市面上的安卓模拟器很多,如夜神、雷电、MuMu等。我选择逍遥模拟器(版本号对应 Android 7.1)主要基于以下几点考量:
- Root 权限易于获取且稳定:逍遥模拟器在设置中直接提供了 Root 开关,一键开启,无需额外刷机或破解。这对于我们需要修改系统目录的操作至关重要。其他一些模拟器的 Root 可能不稳定或需要复杂操作。
- Android 7.1 内核的平衡性:Android 7.0 是证书信任机制的分水岭。选择 7.1 版本,既能复现现代应用(包括微信)所面临的严格证书校验环境,其系统本身又不像 Android 9.0 及以上版本那样引入了更多限制(如对非系统应用访问
/system分区的进一步限制),使得我们的操作相对可行。 - 网络桥接模式支持:逍遥模拟器支持将网络设置为“桥接模式”,让模拟器内的安卓系统像一台独立设备一样从你的路由器获取 IP 地址。这样,它和运行 Burp Suite 的宿主机就处于同一局域网段,方便设置代理。相比 NAT 模式,桥接模式在稳定性和避免 IP 冲突方面更好。
注意:请务必从逍遥模拟器官网下载 Android 7.1 版本的安装包。安装后,进入模拟器设置,在“其他设置”中,开启Root 权限和桥接模式(在网络设置中选择你的物理网卡)。首次启动可能较慢,属正常现象。
2.2 Burp Suite 社区版就够用吗?
Burp Suite 有专业版和社区版。对于拦截、查看、重放 HTTP/HTTPS 请求这些基本抓包操作,社区版完全足够。我们不需要用到专业版的主动扫描、爬虫等高级功能。确保你从 PortSwigger 官网下载最新社区版即可。
关键点在于 Burp Suite 的代理监听配置。安装并启动 Burp Suite 后,你需要进入Proxy->Options标签页,确保Proxy Listeners中有一条监听器在运行。通常默认会有一个监听127.0.0.1:8080的。你需要将其编辑或新增一个,绑定到你的宿主机在当前局域网下的 IP 地址(如192.168.1.100),端口可以仍用8080。同时,勾选Support invisible proxying对于某些情况有帮助。这个设置是为了让模拟器能够找到代理服务器。
2.3 辅助工具:ADB 与文件管理器
- Android Debug Bridge (ADB):这是与安卓设备通信的瑞士军刀。逍遥模拟器通常自带 ADB 并已连接好。你可以在模拟器的安装目录下找到
adb.exe。更简单的方法是,在逍遥模拟器启动后,直接在宿主机命令行输入adb devices,应该能看到模拟器设备已列出。我们将用它来推送文件和执行系统命令。 - 模拟器内的文件管理器与终端:我们需要在模拟器内部操作文件。可以安装一个具有 Root 文件浏览能力的应用,如
Root Explorer或MT Manager。同时,安装一个终端模拟器应用,如Termux或Terminal Emulator for Android,用于执行命令行操作。这些都可以通过模拟器内的应用商店或 APK 文件安装。
准备好这些工具后,我们的战场就搭建完毕了:宿主机运行 Burp Suite 作为代理服务器,逍遥模拟器作为目标设备,通过 ADB 连接,准备接受系统级证书的植入。
3. 核心难点破解:系统级 CA 证书安装详解
这是整个流程中最关键、最容易出错的一步。我们的目标是将 Burp Suite 的 CA 证书文件,以正确的格式和文件名,放入模拟器的/system/etc/security/cacerts/目录。这个目录是系统存储受信任根证书的地方。
3.1 获取并转换 Burp Suite CA 证书
首先,我们需要从 Burp Suite 导出证书,并转换成安卓系统识别的格式。
导出证书:在宿主机浏览器中,访问
http://burpsuite(即 Burp 代理的地址),点击 “CA Certificate” 链接下载证书文件。默认下载的是一个.der格式的文件,命名为cacert.der。转换证书格式:安卓系统要求系统证书是
PEM格式,并且文件名为证书的subject_hash_old值(一个哈希值)加上.0的扩展名。我们需要使用 OpenSSL 工具进行转换。- 如果你没有 OpenSSL,可以从官网下载或使用 Git Bash 等自带环境。
- 打开命令行,切换到证书文件所在目录,执行以下命令:
# 将 DER 格式证书转换为 PEM 格式 openssl x509 -inform DER -in cacert.der -out cacert.pem # 计算 PEM 证书的 subject_hash_old 值 openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1
命令执行后,会输出一个类似
9a5ba575的 8 位十六进制字符串。这就是你的证书文件名(不含.0)。重命名证书:将
cacert.pem文件重命名为<hash>.0,例如9a5ba575.0。
实操心得:
subject_hash_old这个参数非常重要。网上有些教程使用subject_hash,这在某些安卓版本上可能导致证书不被识别。使用-subject_hash_old是更兼容的做法。另外,确保转换后的.pem文件内容以-----BEGIN CERTIFICATE-----开头。
3.2 将证书推入系统证书目录
现在,我们有了正确的证书文件9a5ba575.0。接下来要把它放进只读的系统分区。
将证书文件推送到模拟器临时目录:使用 ADB 命令。
adb push 9a5ba575.0 /sdcard/这个命令将证书文件推送到模拟器的
/sdcard/目录(用户存储空间)。挂载系统分区为可读写:系统分区 (
/system) 默认是只读的。我们需要先获取 Root 权限,然后重新挂载它。- 在模拟器内,打开之前安装的终端应用(如 Termux)。
- 首先获取 root 权限,通常输入
su并回车,终端提示符会从$变成#。 - 执行挂载命令:
mount -o rw,remount /system
如果成功,不会有明显输出。如果提示 “Permission denied” 或 “Read-only file system”,说明模拟器的 Root 权限未正确生效,请返回逍遥模拟器设置确认 Root 已开启。
复制证书到系统证书目录:在终端中继续执行:
cp /sdcard/9a5ba575.0 /system/etc/security/cacerts/修改证书文件权限:系统证书需要正确的权限才能被识别。
chmod 644 /system/etc/security/cacerts/9a5ba575.0644的权限表示所有者可读写,组用户和其他用户只读。恢复系统分区只读属性(可选但推荐):操作完成后,为了系统安全,可以将分区改回只读。
mount -o ro,remount /system重启模拟器:这是至关重要的一步!必须重启模拟器,系统才会重新加载证书存储。直接在逍遥模拟器界面点击重启即可。
3.3 验证系统证书是否安装成功
重启后,如何确认证书已成功被系统信任?
- 在模拟器内查看:进入系统设置 -> 安全 -> 加密与凭据 -> 信任的凭据 -> 系统。在这个长长的列表里,你应该能找到以 “PortSwigger” 或你计算出的哈希值开头的证书条目。如果能找到,恭喜你,系统级证书安装成功了。
- 通过 ADB 命令验证:也可以连接 ADB 后执行:
查看文件是否存在且权限为adb shell ls -l /system/etc/security/cacerts/ | grep 9a5ba575-rw-r--r--。
4. 网络代理配置与微信小程序抓包实战
证书搞定后,剩下的就是网络配置和抓包了。
4.1 配置模拟器全局代理
在逍遥模拟器内,进行如下操作:
- 进入系统设置->WLAN。
- 长按当前已连接的 Wi-Fi 网络(通常叫 “WiredSSID” 或类似名称),选择修改网络。
- 在高级选项中,将代理设置为手动。
- 代理服务器主机名:填写你宿主机在局域网中的 IP 地址(就是之前 Burp 监听的那个 IP,如
192.168.1.100)。 - 代理服务器端口:填写 Burp Suite 的监听端口,默认为
8080。 - 保存设置。
此时,模拟器所有的网络流量(除了少数硬编码不走代理的应用)都会经过你的 Burp Suite。
4.2 在 Burp Suite 中捕获流量
- 确保 Burp Suite 的代理监听器正在运行,并且
Intercept是Off状态(除非你想拦截每一个请求手动放行)。 - 打开 Burp Suite 的
Proxy->HTTP history标签页。这里会记录所有流经代理的请求。 - 在模拟器中,打开微信,进入你想要分析的小程序。
- 在小程序内进行任意操作,如点击、刷新、提交表单等。
如果一切配置正确,你将在 Burp Suite 的 HTTP history 中看到源源不断的 HTTP 和 HTTPS 请求。点击任何一个 HTTPS 请求,你都可以在Request和Response标签页中明文查看其内容,而不会遇到证书错误警告。
4.3 针对小程序的特殊抓包技巧
微信小程序本身还有一些特性,可能会影响抓包:
- 域名校验:部分小程序开发时开启了域名白名单校验,只允许访问特定的服务器域名。如果你发现某些请求失败(在 Burp 或小程序中报错),可能是这个原因。这属于业务逻辑限制,抓包工具无法绕过,但你可以通过 Burp 看到它尝试请求了哪个被禁止的域名。
- WebSocket 连接:很多小程序的实时通信使用 WebSocket (WS/WSS)。Burp Suite 社区版和专业版都支持拦截和查看 WebSocket 流量。你可以在
Proxy->Options->Intercept WebSockets messages中设置,并在Proxy->WebSockets history中查看消息。 - 数据加密:即使抓到了包,你可能发现 POST 的数据或响应的内容是乱码或加密的。这是小程序开发者为了安全对业务数据进行的二次加密(在 HTTPS 之上)。Burp Suite 无法解密这种业务层加密,你需要结合小程序的反编译或代码分析来理解其加密算法。这时,抓包的作用是帮你定位 API 接口和了解通信协议。
5. 常见问题排查与解决方案实录
在实际操作中,你几乎一定会遇到一些问题。下面是我总结的常见故障及其解决方法。
5.1 证书安装后,小程序仍报“网络错误”或“证书错误”
这是最常见的问题。请按以下顺序排查:
- 证书未生效:你是否在安装证书并修改权限后重启了模拟器?这是必须的步骤。
- 证书格式或文件名错误:双重检查你的证书文件名是否是
subject_hash_old.0的格式,并且文件内容是正确的 PEM 格式。可以adb shell进入模拟器,用cat /system/etc/security/cacerts/你的哈希.0查看文件头尾。 - 微信/小程序缓存:微信和小程序本身有缓存。尝试清除微信存储数据(模拟器设置->应用->微信->存储->清除数据),或者卸载重装微信。注意这会清除聊天记录。
- 系统时间不正确:CA证书有有效期。确保模拟器的系统日期和时间是正确的,如果时间偏差太大,可能导致证书被视为无效。
- 目标应用使用证书固定:一些安全性要求极高的应用(包括某些版本的微信核心功能或特定银行小程序)可能使用了“证书固定”,即它在代码里硬编码了只信任特定的证书,而忽略系统证书库。这种情况下,系统级安装 Burp 证书也无效。应对方法非常复杂,可能需要对应用进行逆向修改,这超出了基础抓包的范畴。
5.2 Burp Suite 上看不到任何流量
- 代理配置错误:检查模拟器 Wi-Fi 设置中的代理 IP 和端口,是否与 Burp Suite
Proxy Listeners中配置的完全一致。主机 IP 不要填127.0.0.1,那是模拟器内部的环回地址,要填宿主机的局域网 IP。 - Burp 监听器未正确绑定:在 Burp Suite 的
Proxy Listeners中,确保监听器绑定到了0.0.0.0:8080或你的宿主机 IP192.168.1.100:8080,并且状态是Running。可以尝试暂时关闭防火墙测试。 - 流量未走代理:有些应用会检测并绕过系统代理。你可以尝试在模拟器内安装一个像
ProxyDroid这样的应用,进行更底层的全局代理配置(需要 Root),但通常 Wi-Fi 手动代理对大多数应用已足够。 - 检查 HTTP History:确认你没有不小心打开了
Intercept按钮并卡住了一个请求。同时检查HTTP history标签页上是否有过滤器隐藏了流量(如默认可能隐藏了图片等资源)。
5.3 ADB 连接失败或命令无响应
- 逍遥模拟器 ADB 端口:逍遥模拟器通常使用
adb connect 127.0.0.1:21503进行连接。确保你使用的adb版本与模拟器兼容,或者直接使用模拟器安装目录下的adb.exe。 - 多设备冲突:如果你电脑上连接了多个安卓设备或启动了多个模拟器,使用
adb devices查看,并用adb -s 设备序列号 shell来指定对逍遥模拟器进行操作。 - 模拟器未开启 Root:在执行
su命令时如果终端没有反应或提示失败,请务必进入逍遥模拟器设置,确认Root 权限开关已打开,并重启模拟器。
5.4 操作后模拟器无法启动或系统异常
在修改/system分区时,如果操作不当(如误删系统文件),可能导致模拟器无法启动。在进行任何操作前,强烈建议通过逍遥模拟器的多开管理器,为当前的模拟器创建一个“备份”或“克隆”。这样如果玩坏了,可以直接恢复备份,而不用从头开始配置环境。
这套“逍遥模拟器 7.1 + 系统级证书安装”的方案,是我目前测试过的、针对新版微信小程序抓包最稳定可靠的方法之一。它成功的关键在于利用了 Android 7.x 系统相对可控的 Root 环境,完成了证书的系统级植入。整个过程虽然步骤不少,但每一步都有其明确的目的。当你成功在 Burp Suite 中看到那些明文流动的小程序数据包时,无论是为了安全测试、逆向分析还是单纯的学习理解,那种成就感都是实实在在的。记住,技术是在不断变化的,微信和安卓系统的安全机制未来也可能会进一步升级,但掌握这套底层原理和排查思路,能让你在应对新挑战时更有底气。