高版本Android抓包实战:逍遥模拟器+Burp Suite系统级证书方案
1. 项目概述:为什么高版本Android抓包成了“老大难”?
如果你做过移动端安全测试或者逆向分析,肯定遇到过这个头疼的问题:在Android 7.0(API 24)之后,系统对HTTPS流量的安全策略收紧了。简单来说,就是你没法像以前那样,随便在手机上装个Burp Suite或者Charles的CA证书,就能愉快地抓取所有App的HTTPS包了。系统默认不再信任用户安装的证书,导致很多App,特别是那些做了证书绑定(SSL Pinning)或者严格遵循系统安全策略的App,直接“免疫”了你的抓包工具,流量该走加密通道还是走加密通道,你这边看到的只是一片“Connection Reset”或者“Certificate Pinning Failure”。
这个问题的核心在于Android系统的网络安全配置(Network Security Configuration)。从Android 7开始,App可以(并且越来越多的App选择)在其配置中声明只信任系统预置的CA证书,而忽略用户凭据存储区里的证书。这就把我们这些安全研究员、开发测试人员常用的“用户证书”这条路给堵死了。所以,要想在高版本Android上实现全局HTTPS抓包,思路就必须从“让App信任我的证书”转变为“让系统把我的证书当成系统证书”。
今天要聊的“逍遥模拟器+Burp Suite”组合,就是解决这个难题的一个非常接地气、实操性极强的方案。逍遥模拟器作为一个基于Android 7.1/9.0等内核的桌面端模拟器,它给了我们一个绝佳的环境:一个我们可以完全控制的“手机系统”。我们不再需要去折腾真机的Root、刷Magisk模块,或者去修改App的源码和签名。在模拟器里,我们可以直接以系统管理员的身份,将Burp Suite的CA证书安装到系统的受信任凭据存储区,实现真正的“系统级”信任。这个方案稳定、可逆、对测试目标App无侵入,是进行安全评估、协议分析、逆向调试的利器。
2. 环境准备与工具选型背后的逻辑
工欲善其事,必先利其器。选择逍遥模拟器和Burp Suite这个组合,不是随便拍脑袋决定的,背后有很强的场景适配性和实操便利性考量。
2.1 为什么是逍遥模拟器?
市面上Android模拟器很多,比如蓝叠、夜神、雷电等。选择逍遥模拟器,主要基于以下几点实战考量:
- 内核版本可控且较新:逍遥模拟器稳定版通常提供Android 7.1和9.0等镜像,这正好覆盖了我们所需的高版本Android环境。太老的版本(如4.4)没有证书信任问题,但很多新App已不兼容;太新的版本(如12、13)在模拟器上可能稳定性欠佳,且系统分区挂载方式可能有变。7.1和9.0是一个在“问题存在”和“方案成熟”之间的甜点区。
- Root权限获取简单且原生:逍遥模拟器在设置中直接提供了“Root开关”。打开后,adb shell默认就是
root用户。这省去了我们刷机、破解的麻烦,是进行系统级操作(如写入/system分区)的前提。其他模拟器可能也需要Root,但逍遥的这一步最为直接。 - 系统分区可写:这是最关键的一点。高版本Android即使Root了,
/system分区默认也是只读(ro)的。我们需要将其重新挂载为可写(rw)才能放入证书文件。逍遥模拟器的系统镜像对此支持良好,通过标准的mount命令即可完成,过程稳定可预测。 - 网络桥接模式支持:逍遥模拟器的网络设置允许选择“桥接模式”,让模拟器内的Android系统像一台真实设备一样,从你的路由器获取一个同网段的IP。这样,你的物理机和模拟器就在同一个局域网内,方便将Burp Suite设置为代理,避免了NAT模式可能出现的代理设置复杂问题。
注意:请务必从逍遥模拟器官方网站下载安装程序。第三方下载站的文件可能被篡改,存在安全风险。
2.2 为什么是Burp Suite?
抓包工具也有Fiddler、Charles等优秀产品。Burp Suite成为安全测试领域的“瑞士军刀”,在此场景下优势明显:
- 拦截与修改能力强大:Burp Proxy的拦截(Intercept)功能是动态测试的核心。我们可以暂停任意请求和响应,并直接修改其参数、头部、体内容,这对于测试漏洞(如越权、注入)至关重要。
- 生态与扩展性:拥有丰富的插件(Extender)生态,比如用于自动处理证书绑定的
SSL Kill Switch等插件,虽然我们本次用系统级证书方案可以绕过很多绑定,但Burp的扩展能力为后续更复杂的测试提供了可能。 - 项目与协作功能:Burp的Project文件可以保存整个会话状态(包括代理历史、目标站点地图、插件配置等),方便回溯和团队协作。
- 社区与资料丰富:遇到任何问题,几乎都能找到相关的社区讨论和解决方案,学习成本相对较低。
对于本指南,使用Burp Suite Community(免费版)即可完成所有抓包操作。专业版(Professional)的主动扫描(Active Scan)等功能并非本场景必需。
你需要准备的工具清单:
- 逍遥模拟器:最新稳定版,安装时建议选择Android 9.0镜像(如果7.1镜像更稳定也可选7.1)。
- Burp Suite:从PortSwigger官网下载Community或Professional版。
- adb(Android Debug Bridge)工具:通常包含在Android SDK Platform-Tools中。逍遥模拟器安装后,其安装目录下(如
MEmu文件夹)一般也自带adb工具,可以直接使用。
3. 核心原理:系统证书与用户证书的天壤之别
在深入实操前,花几分钟理解原理,能让你在遇到问题时知道从何下手,而不是机械地跟着步骤走。
Android系统管理CA证书的存储位置主要有两个:
- 系统CA证书存储:路径为
/system/etc/security/cacerts/。这里的证书拥有最高的信任级别,被所有App(无论其networkSecurityConfig如何配置)默认信任。证书文件需要特定的格式和命名规则(后续会详述)。 - 用户CA证书存储:在Android设置中,“安全”或“加密与凭据”里“安装证书”的位置。路径通常对应
/data/misc/user/0/cacerts-added/(因版本而异)。这里的证书只有在App的网络安全配置明确声明<trust-anchors>包含user源时,才会被信任。
Android 7.0之后,Google鼓励开发者使用Network Security Configuration文件。一个典型的、限制较严的配置如下:
<network-security-config> <base-config cleartextTrafficPermitted="false"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>这个配置意味着:App只信任系统CA存储(src="system")中的证书,而明确不信任用户安装的证书。这就是为什么你装了Burp证书到用户存储区,却抓不到某些App包的根本原因。
我们的核心战术:利用模拟器的Root权限,将Burp Suite生成的CA证书,直接“塞进”系统的保险箱——/system/etc/security/cacerts/目录。一旦证书在此落户,它就拥有了“免检通行证”,所有App都会将其视为可信任的根证书颁发机构,HTTPS中间人攻击(MITM)的通道就此打通。
这个方案的优势在于,它是在系统层面解决问题,不依赖于修改单个App,因此是“全局生效”的。无论你测试哪个App,只要它走系统网络栈,就能被成功抓包。
4. 分步实操:从零搭建抓包环境
下面我们进入最核心的实操环节。请严格按照步骤操作,我会在关键点说明“为什么这么做”以及可能遇到的坑。
4.1 第一步:配置Burp Suite代理与导出证书
启动Burp Suite并配置代理监听: 打开Burp,在
Proxy->Options选项卡中,找到Proxy Listeners。确保有一个监听器在运行(默认127.0.0.1:8080)。检查其Running状态为true。最好将Bind to address从Loopback only改为All interfaces,或者直接指定你物理机的局域网IP地址。这是因为后续模拟器需要连接到这个代理,如果只绑定回环地址(127.0.0.1),模拟器是无法访问的。导出Burp的CA证书: 这是最关键的文件。打开浏览器,访问
http://burpsuite或http://你的物理机IP:8080。点击CA Certificate按钮,下载证书文件。务必选择Der格式,保存为cacert.der。为什么是DER格式而不是PEM?因为Android系统证书存储要求证书是DER格式,并且以特定的哈希值命名。PEM格式是Base64编码的文本,系统不认。实操心得:有时通过上述HTTP页面下载的证书,在后续步骤中可能会遇到“证书无效”的提示。一个更可靠的方法是,在Burp Suite的
Proxy->Options->Proxy Listeners-> 选中你的监听器 ->Import / export CA certificate中,直接导出证书。选择Export->Certificate in DER format,同样保存为cacert.der。
4.2 第二步:设置逍遥模拟器与网络
- 安装并启动逍遥模拟器:创建一个新的实例,建议选择Android 9.0镜像。启动后,进入模拟器
设置。 - 开启Root权限:在
设置中找到关于平板电脑(或类似选项),连续点击版本号开启开发者选项。然后在开发者选项中,找到并开启Root授权开关。 - 配置网络代理(临时步骤):
- 在
设置->WLAN中,长按已连接的Wi-Fi网络(通常是WiredSSID或Ethernet),选择修改网络。 - 展开
高级选项,将代理设置为手动。 代理服务器主机名填写你物理机的局域网IP地址(在Windows上可通过ipconfig查看,通常是192.168.x.x;在macOS/Linux上用ifconfig或ip addr查看)。代理服务器端口填写Burp监听的端口,默认为8080。- 保存。这个步骤的目的是为了让模拟器能访问之前
http://burpsuite的地址以下载/安装证书,以及后续初始的抓包验证。在完成系统证书安装后,这个手动代理可以移除,因为Burp的全局流量拦截不依赖于此。
- 在
4.3 第三步:在模拟器内安装用户证书(过渡步骤)
- 在模拟器的浏览器中,访问
http://你的物理机IP:8080,点击CA Certificate下载证书文件。 - 下载完成后,系统会提示你安装证书。给证书起个名字,如
BurpRoot,选择用途为VPN和应用(或WLAN,根据系统提示)。 - 安装需要你输入锁屏密码或确认。安装成功后,你可以在
设置->安全->加密与凭据->信任的凭据->用户标签页下看到刚刚安装的BurpRoot证书。此时,你可以尝试抓取一些系统浏览器或未做严格证书校验的App的HTTPS流量,应该已经可以成功。但对于目标App,很可能还是失败。这一步主要是为了验证代理连通性,并获取证书文件到设备本地,方便我们下一步将其转化为系统证书。
4.4 第四步:获取证书文件并推送到模拟器
现在我们需要将证书文件放到一个方便操作的位置。有两个途径:
途径A(推荐,更直接):使用adb命令将我们在物理机上导出的cacert.der推送到模拟器。
# 打开命令行,切换到adb所在目录(逍遥模拟器安装目录下的adb工具) adb connect 127.0.0.1:21503 # 逍遥模拟器的默认adb连接地址和端口 adb push C:\path\to\your\cacert.der /data/local/tmp/cacert.der21503是逍遥模拟器默认的第一个实例的adb端口。第二个实例通常是21523,以此类推。/data/local/tmp/是一个对Shell可读写的临时目录。
途径B:如果模拟器内浏览器下载的证书找不到,或者格式不对,可以从用户证书存储中提取。但这需要Root权限,且步骤稍复杂,这里不展开。推荐直接使用途径A。
4.5 第五步:关键操作——将用户证书安装为系统证书
这是整个流程的技术核心。我们需要将DER格式的证书文件,重命名为特定的名称,并复制到系统证书目录。
adb shell连接并获取Root权限:
adb shell su执行
su后,模拟器界面可能会弹出Root授权请求,点击“允许”。命令行提示符应该会从$变成#,表示已获得超级用户权限。将/system分区重新挂载为可写: 默认情况下,
/system是只读的。mount -o rw,remount /system如果上述命令报错,可以尝试指定块设备:
mount -o rw,remount /dev/block/sda6 /system # 具体设备名可能不同,sda6是常见情况可以使用
mount | grep system来查看/system当前挂载在哪个设备上。重要警告:对
/system分区的任何修改都有风险。操作时务必小心,不要删除或修改其他无关文件。建议在操作前先对/system/etc/security/cacerts/目录进行备份:cp -r /system/etc/security/cacerts/ /sdcard/cacerts_backup/。转换证书格式并计算哈希名: 系统证书目录
/system/etc/security/cacerts/下的证书文件,必须以证书主题的哈希值加.0作为文件名。我们需要计算cacert.der的哈希值。cd /data/local/tmp openssl x509 -inform DER -in cacert.der -subject_hash_old -noout这条命令会输出一个8位的十六进制字符串,例如
9a5ba575。这就是证书的文件名(不含.0)。为什么是_old哈希?Android早期使用-subject_hash_old(OpenSSL 1.0的算法),为了兼容性,系统证书存储通常沿用此命名。使用-subject_hash(OpenSSL 1.1+算法)得到的哈希值不同,系统可能不识别。将证书复制到系统证书目录:
cp cacert.der /system/etc/security/cacerts/<hash>.0请将
<hash>替换为上一步得到的哈希值,例如:cp cacert.der /system/etc/security/cacerts/9a5ba575.0设置正确的文件权限和所有者: 系统证书目录下的文件需要有正确的权限才能被系统读取。
chmod 644 /system/etc/security/cacerts/<hash>.0 chown root:root /system/etc/security/cacerts/<hash>.0644权限表示所有者可读写,组用户和其他用户只读。root:root的所有者和组是系统标准配置。恢复/system分区的只读属性(可选但建议):
mount -o ro,remount /system或者直接重启模拟器,系统会自动以只读方式重新挂载。重启是一个很好的验证步骤。
4.6 第六步:验证与测试
重启逍遥模拟器。这是必须的,因为系统只会在启动时加载
cacerts目录下的证书。移除Wi-Fi手动代理:回到模拟器的Wi-Fi设置,将代理改回
无或无代理。因为系统级证书生效后,所有流量都会信任Burp的CA,无需再在应用层设置代理指向Burp。我们只需要在Burp Suite中设置好上游代理规则即可。实际上,更常见的做法是让模拟器网络保持原始状态(不设代理),然后在你的物理机或路由器上设置透明代理或流量重定向,但这涉及更复杂的网络配置。对于大多数测试,我们采用另一种更简单的方法:配置模拟器的全局HTTP代理,但这不在Wi-Fi设置里,而是通过adb命令或某些系统设置App实现。一个更通用的方法是:- 确保Burp Suite监听在所有网卡(All interfaces)上。
- 在模拟器中,安装一个能设置全局代理的App(此类App通常需要Root权限),将全局代理设置为你的物理机IP:8080。
- 或者,对于测试特定App,如果该App支持配置代理,就在其设置中配置。
- 最简单直接的验证方法:打开模拟器的浏览器,访问一个HTTPS网站(如
https://example.com)。如果Burp Suite的Proxy->HTTP history中能捕获到该请求且没有证书错误,说明系统证书安装成功。你会发现,即使没有在Wi-Fi里设置手动代理,只要Burp开着且在监听,流量也可能被捕获(取决于模拟器的网络桥接模式),但为了稳定抓取所有App流量,建议还是使用能设置全局代理的方法。
测试目标App:打开你想要抓包分析的App,进行正常的操作。此时,Burp Suite中应该能够看到清晰的HTTPS请求和响应,而不再是之前的一堆
TLS handshake failure。
5. 疑难杂症与深度排查指南
即使按照步骤操作,你也可能会遇到一些问题。这里汇总了常见的坑和解决方案。
5.1 证书安装后,部分App仍抓不到包
这是最可能遇到的情况。原因和解决方案如下:
| 现象 | 可能原因 | 排查与解决方案 |
|---|---|---|
| 目标App的流量完全不见 | 1. App使用了纯TCP/UDP自定义协议,不走HTTP/HTTPS。 2. App使用了WebSocket或其他长连接,在Burp默认配置下可能不直观。 3.App启用了证书绑定(SSL Pinning)。 | 1. 使用Wireshark等底层抓包工具确认是否有流量产生。 2. 在Burp的 Proxy->Options->Intercept Client Requests中,检查是否有过滤规则误删了请求。3.对于证书绑定:系统级证书方案可以绕过基于信任锚(Trust Anchor)的绑定,即App只信任系统证书库。但如果App使用了公钥绑定(Public Key Pinning)或将证书硬编码在代码里,则系统级证书也无效。此时需要反编译App,修改其网络库代码或使用Frida等Hook框架来绕过。这超出了本指南范围,但你可以搜索“SSL Pinning Bypass Frida”来寻找方案。 |
| 抓到的包响应是乱码或证书错误 | 1. Burp Suite未正确解密HTTPS流量。 2. App使用了HTTP/2或HTTP/3,Burp的显示可能需调整。 3. 网络不稳定导致连接重置。 | 1. 确认系统证书确已安装且哈希命名正确。重启模拟器。 2. 在Burp的 Proxy->Options->TLS设置中,尝试调整TLS协议版本和密码套件,以匹配服务器要求。3. 在Burp的 User options->TLS中,确保Server SSL Certificates里没有旧的无用证书。 |
| 只有浏览器流量能抓,App不行 | 1. 该App可能使用了自己的网络栈(如Cronet、OkHttp配置了自定义TrustManager),未使用系统默认的SSLContext。 2. 模拟器的全局代理未生效,App直连了网络。 | 1. 这是最难处理的情况。需要分析App使用的网络库。对于OkHttp,如果它配置了自定义的CertificatePinner或TrustManager,则系统证书无效。同样需要逆向或Hook。2. 尝试使用更强大的全局代理工具,如ProxyDroid(需Root),确保所有TCP流量都经过Burp。 |
5.2 adb命令常见错误
error: device offline:模拟器的adb连接不稳定。尝试adb kill-server然后adb start-server,再重新连接。remount failed:/system分区重挂载失败。确保已执行su获得root权限。尝试使用adb remount命令(但此命令在某些系统上可能不可用)。最稳妥的方法是进入adb shell后,使用mount命令查看/system的具体挂载点,然后用mount -o rw,remount /dev/block/[具体设备] /system。openssl command not found:模拟器系统镜像可能精简了openssl工具。有两种解决方式:- 从其他完整镜像或通过
apt(如果支持)安装openssl。 - 更简单的方法:在你的物理机上计算哈希。在物理机命令行(确保已安装OpenSSL)执行:
得到哈希值后,在adb shell中执行复制和重命名命令时,直接使用这个哈希值。openssl x509 -inform DER -in cacert.der -subject_hash_old -noout
- 从其他完整镜像或通过
5.3 证书相关错误
INSTALL_PARSE_FAILED_NO_CERTIFICATES:在模拟器内安装证书时出现。这通常是因为下载的证书文件损坏或格式不正确。请务必通过http://burpsuite页面或Burp内建功能导出DER格式证书。- 系统证书安装后,浏览器访问HTTPS站点仍报不安全:首先确认证书文件是否已正确放置在
/system/etc/security/cacerts/目录,权限是否为644,所有者是否为root:root。然后,清除浏览器数据(特别是SSL状态缓存),或者使用一个新的浏览器会话进行测试。Android系统会缓存证书信息,重启设备是最彻底的清除方式。
5.4 网络与代理问题
- 模拟器无法连接物理机Burp代理:
- 检查物理机防火墙是否放行了8080端口(入站规则)。
- 检查Burp Suite的监听器是否绑定在
All interfaces或正确的IP上。 - 在模拟器浏览器中直接访问
http://<物理机IP>:8080,看是否能打开Burp的欢迎页面。如果不能,说明网络不通。 - 尝试将逍遥模拟器的网络模式从
NAT改为桥接,让模拟器获得一个与物理机同网段的IP,这样网络互通性更好。
6. 进阶技巧与优化配置
掌握了基础方法后,这些技巧能让你的抓包工作更高效、更强大。
6.1 使用Magisk模块(可选进阶)
如果你熟悉Magisk,在已Root的环境下,有一个更优雅、无需修改/system分量的方案:使用MagiskTrustUserCerts模块。这个模块的作用是,将用户安装的证书(/data/misc/user/0/cacerts-added/)在每次系统启动时,自动符号链接(symlink)到系统证书目录。这样你只需要在设置里安装一次证书,重启后它就自动变成系统证书了。
优点:无需手动操作/system分区,避免误操作风险,证书管理更方便(安装/卸载都在系统设置里完成)。缺点:需要安装Magisk,步骤稍多,适合喜欢折腾、需要在多种环境下快速切换证书的用户。
在逍遥模拟器上安装Magisk的步骤较为复杂,需要刷入特定的补丁镜像,此处不展开。但对于真机测试,这是一个非常推荐的方案。
6.2 配置Burp Suite提升抓包体验
- 过滤无关流量:在
Proxy->Options->Intercept Client Requests中,可以添加过滤规则,例如只拦截目标域名的流量(*.target.com),避免被海量的其他请求(如广告、统计SDK)干扰。 - 解码和美化:对于JSON、XML等格式的响应,在
Proxy->HTTP history中,右键响应内容,选择Send to Repeater,然后在Repeater的Pretty、Hex等标签页下查看,或者使用Extensions->BApp Store安装JSON Beautifier等插件。 - 处理WebSocket:Burp Suite可以拦截和查看WebSocket流量,但需要在
Proxy->Options->Intercept WebSockets Messages中启用。 - 上游代理:如果你公司网络需要代理才能访问外网,需要在
User options->Connections->Upstream Proxy Servers中配置,否则模拟器内的App可能无法访问互联网。
6.3 模拟器性能与快照管理
逍遥模拟器支持创建“快照”(Snapshot)。强烈建议你在完成系统证书安装、配置好一个干净的抓包环境后,创建一个快照,并命名为“Base with Burp System Cert”。
这样做的好处:
- 一键还原:以后每次测试新App,都可以从这个干净的快照启动,避免测试不同App时环境相互污染。
- 节省时间:无需重复进行繁琐的系统证书安装步骤。
- 风险隔离:如果某个测试把系统搞乱了,直接恢复快照即可。
7. 安全测试中的伦理与法律边界
最后,也是最重要的一部分,我们必须谈谈责任。拥有抓包能力,意味着你能窥见应用网络通信的内幕。
- 仅用于授权测试:绝对不要对你没有书面授权(如漏洞众测项目、公司内部应用、自己开发的应用)的App进行抓包和渗透测试。这是违法行为。
- 尊重用户隐私:在测试过程中,你可能会看到用户的敏感数据(即使是测试数据)。这些数据绝不能泄露或用于任何其他目的。
- 遵守平台政策:Google Play和其他应用商店对于逆向工程、修改应用行为有严格规定。你的测试活动应在完全可控的内网或离线环境进行。
- 证书安全:Burp Suite生成的CA证书是你的“万能钥匙”。请妥善保管
cacert.der文件,不要随意分享。测试结束后,从模拟器中移除该证书(删除/system/etc/security/cacerts/下的对应文件并重启)。
这套“逍遥模拟器+Burp Suite系统级证书”的方案,是我在移动端安全评估中最常用的环境搭建方法。它平衡了难度和效果,能解决90%以上的高版本Android App HTTPS抓包问题。剩下的10%,则需要结合逆向工程、动态插桩(如Frida)等技术去解决证书绑定等更复杂的防护。希望这份超详细的指南,能帮你扫清障碍,把精力真正聚焦在安全测试和分析本身上。
