
1. 项目概述与核心挑战搞移动安全测试或者应用逆向的朋友对Burp Suite这个抓包神器肯定不陌生。但自从Android 7.0API Level 24引入“网络安全配置”Network Security Configuration和更严格的证书信任机制后事情就变得麻烦起来了。以前那种简单地把Burp的CA证书丢到用户证书目录/system/etc/security/cacerts就能一劳永逸的日子一去不复返。现在应用默认只信任系统预装的CA证书而用户安装的证书除非应用显式信任否则在抓HTTPS包时你看到的很可能是一片让人头疼的“证书错误”或“网络连接失败”。这个限制对于安全测试来说简直是拦路虎。很多应用特别是金融、社交类App其核心业务逻辑都封装在HTTPS流量里。你抓不到包就相当于蒙着眼睛分析效率大打折扣。所以“突破Android 7.0的系统级证书限制”就成了一个刚需。我们总不能每次都去反编译App修改其网络安全配置文件再重打包吧那太费时了。于是模拟器就成了我们的主战场。在真机上搞系统分区、刷Magisk模块风险高、变砖可能性大而在模拟器里我们可以更自由地“折腾”。逍遥模拟器XiaoYao因其对Android高版本的良好支持和相对开放的Root权限管理成为了很多测试人员的首选。这个项目的核心目标就是在已经Root的逍遥模拟器上将Burp Suite的CA证书安装为系统级可信证书从而实现对任意App包括那些设置了严格证书锁定的App的HTTPS流量进行无感拦截和分析。简单来说这不是一个简单的“安装证书”操作而是一个涉及模拟器环境配置、ADB调试、系统分区挂载、证书格式转换和权限设置的完整工作流。下面我就把整个实战过程拆解开来每一步的原理、操作和可能遇到的坑都详细说清楚。2. 环境准备与工具选型工欲善其事必先利其器。在开始操作前我们需要把环境和工具准备好。这里的选择都是基于稳定性和通用性考虑的。2.1 核心工具清单逍遥模拟器建议使用较新的版本如9.0版本它自带Android 9甚至更高版本的系统镜像并且默认提供了Root开关。这是我们的实验沙盒。Burp Suite Professional/Community抓包代理的核心。需要确保其代理功能正常运行。ADBAndroid Debug Bridge与模拟器通信的桥梁。逍遥模拟器通常自带ADB但为了统一建议使用Android SDK Platform-Tools中的独立ADB并将其路径加入系统环境变量。文本编辑器如Notepad、VS Code或Sublime Text用于编辑脚本和查看文件。OpenSSL用于证书格式转换。这是一个关键工具后面会用到。2.2 环境初始化步骤第一步安装并启动逍遥模拟器下载安装逍遥模拟器后启动它。进入模拟器设置找到“关于平板电脑”或类似选项连续点击“版本号”以开启“开发者选项”。然后在“开发者选项”中确保“USB调试”是开启状态。这是ADB能够连接的基础。第二步配置Burp Suite代理启动Burp Suite进入Proxy-Options标签页。确保代理监听器Proxy Listeners是运行的通常监听本机127.0.0.1的8080端口。记下这个IP和端口。第三步连接模拟器与ADB打开命令行终端CMD或PowerShell。首先检查ADB设备是否连接adb devices你应该能看到一个设备列表其中包含逍遥模拟器的设备号例如127.0.0.1:21503。如果没看到可能需要检查模拟器的ADB调试端口逍遥模拟器通常使用21503端口你可以尝试adb connect 127.0.0.1:21503。第四步配置模拟器网络代理为了让模拟器的流量走向Burp我们需要在模拟器的Wi-Fi设置中配置代理。在模拟器内进入“设置” - “WLAN”。长按当前已连接的Wi-Fi网络通常是“AndroidWifi”选择“修改网络”。展开“高级选项”将“代理”设置为“手动”。代理主机名填写你运行Burp的电脑的IP地址如果Burp和模拟器在同一台电脑通常是10.0.2.2这个特殊地址它指向宿主机的localhost。代理端口填写Burp的监听端口如8080。保存。注意这里有个关键点。逍遥模拟器是运行在宿主电脑上的虚拟机它的网络是NAT模式。10.0.2.2是Android模拟器环境中预定义的、指向宿主机Host的别名IP。如果你使用其他模拟器或者网络模式不同这个IP可能需要改变例如192.168.x.x你的本机局域网IP。不确定的话可以在模拟器的浏览器里访问http://burp如果能下载到Burp的CA证书说明代理配置正确。完成以上四步基础环境就搭建好了。此时你应该能在Burp的Proxy-Intercept标签页看到模拟器产生的HTTP流量。但HTTPS流量仍然是加密的因为系统不信任Burp的证书。接下来就是攻克系统级证书安装这个核心难关。3. 证书安装原理与系统分区操作为什么用户安装的证书不行系统证书就行这得从Android的证书存储机制说起。3.1 Android证书存储机制解析Android将CA证书分为两大类系统证书System CA Store存储在/system/etc/security/cacerts/目录下。这里的证书被整个系统所信任所有应用除非应用自己做了额外的证书锁定在建立HTTPS连接时都会信任这些证书。这些证书文件通常是PEM格式并且文件名有特定要求证书主题的哈希值后面会讲。用户证书User CA Store在Android 7.0之前用户安装的证书通过“从存储设备安装”或Burp导出的证书会被放在这里具体路径因版本而异如/data/misc/user/0/cacerts-added/。在7.0之后应用默认不再信任用户安装的证书除非应用在其AndroidManifest.xml中通过android:networkSecurityConfig显式声明信任用户证书。我们的目标很明确把Burp的CA证书“变成”系统证书。这就需要我们能够向只读的/system分区写入文件。3.2 挂载系统分区为可读写在已经Root的逍遥模拟器上我们可以通过ADB Shell获得超级用户权限并重新挂载remount系统分区。连接ADB Shell并获取Root权限adb shell进入Shell后输入su命令。模拟器可能会弹窗请求Root权限点击“允许”。命令提示符应该会从$变成#表示已获得超级用户权限。检查并重新挂载/system分区# 查看/system分区的当前挂载模式 mount | grep /system你可能会看到类似/dev/block/sda6 on /system type ext4 (ro,seclabel,relatime)的输出。ro表示只读read-only。# 重新挂载为可读写read-write mount -o rw,remount /system或者使用更通用的命令mount -o rw,remount /system执行成功后再次mount | grep /system应该能看到rw标志。实操心得有些定制ROM或模拟器镜像可能对/system分区做了额外的保护。如果上述mount命令失败可以尝试指定块设备如mount -o rw,remount /dev/block/sda6 /system设备名请根据上一步mount命令的输出确定。逍遥模拟器一般直接用mount -o rw,remount /system即可。关键风险提示对/system分区的任何修改都有潜在风险不当操作可能导致系统无法启动。在模拟器中操作相对安全最坏情况可以删除当前实例新建一个。但在操作前强烈建议通过adb pull /system/etc/security/cacerts .命令将原有的系统证书备份到本地电脑一份。4. 证书处理与部署实战拿到可写的/system分区后接下来就是处理Burp的证书并把它放到正确的位置。4.1 获取并转换Burp CA证书Burp Suite的CA证书需要从Burp中导出并转换成Android系统识别的格式。从Burp导出证书在Burp Suite中浏览器访问http://burp或http://127.0.0.1:8080需在代理配置正确的设备/模拟器浏览器中访问。点击“CA Certificate”按钮下载证书文件。Burp默认导出的是der格式文件扩展名可能是.cer或.der我们假设保存为cacert.der。转换证书格式并计算哈希文件名 Android系统证书目录 (/system/etc/security/cacerts/) 下的每个证书文件都必须以特定的格式命名hash.n其中hash是证书主题Subject的哈希值旧版使用MD5新版使用SHA256n是一个数字序号通常是0。使用OpenSSL计算哈希并转换推荐 打开命令行在宿主机上操作而不是ADB Shell。# 将DER格式证书转换为PEM格式 openssl x509 -inform DER -in cacert.der -out cacert.pem # 计算PEM证书的MD5哈希值用于旧版命名兼容性更好 openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1这个命令会输出一个8位的十六进制字符串例如9a5ba575。这就是你的证书文件名不含扩展名。备用方法使用ADB Shell工具如果宿主机没有OpenSSL 可以先将cacert.der文件推送到模拟器的/data/local/tmp目录然后利用模拟器里可能自带的openssl工具或certutil来计算。但步骤稍显繁琐建议还是在宿主机装好OpenSSL。4.2 推送证书至系统目录现在我们有了正确的文件名比如9a5ba575.0和PEM格式的证书内容 (cacert.pem)。将证书文件推送到模拟器临时目录# 退出ADB Shell如果还在里面回到宿主机的命令行 exit # 将PEM证书文件推送到模拟器的临时目录 adb push cacert.pem /data/local/tmp/9a5ba575.0这里我们直接将PEM文件以目标文件名推送到临时目录。在ADB Shell中移动证书到系统目录并设置权限adb shell su # 将证书从临时目录移动到系统证书目录 cp /data/local/tmp/9a5ba575.0 /system/etc/security/cacerts/ # 设置正确的权限所有者root组root权限644即rw-r--r-- chmod 644 /system/etc/security/cacerts/9a5ba575.0 chown root:root /system/etc/security/cacerts/9a5ba575.0权限设置至关重要如果权限不对系统可能不会读取或信任该证书。4.3 验证与生效完成上述步骤后需要让系统重新加载证书库。重启模拟器或相关服务最彻底的方法是重启整个模拟器。你也可以尝试重启netd网络守护进程或者zygote但在模拟器中直接重启更简单可靠。# 在ADB Shell中有root权限重启 reboot或者直接关闭逍遥模拟器窗口再重新启动。验证证书是否生效方法一在模拟器设置中查看。进入“设置” - “安全” - “加密与凭据” - “信任的凭据” - “系统”。在长长的列表里你应该能找到以“PortSwigger”或你计算机名称为颁发者的证书。方法二使用测试连接。在模拟器中打开浏览器访问一个HTTPS网站如https://example.com。然后在Burp Suite中查看Proxy-HTTP history你应该能看到解密的HTTPS请求和响应而不再是SSL错误。方法三ADB命令验证。可以尝试连接一个已知的HTTPS端点并查看证书链但方法二最直观。5. 自动化脚本编写与高级技巧手动操作一遍后为了提升效率我们可以将整个过程脚本化。同时也会遇到一些特殊情况需要处理。5.1 一键安装脚本示例下面是一个在宿主机Windows PowerShell或Linux/macOS Bash上运行的简化版一键脚本思路。它假设OpenSSL已安装且位于PATH中并且模拟器已开启ADB调试。#!/bin/bash # 一键安装Burp证书到逍遥模拟器 (Linux/macOS Shell示例) # 1. 导出Burp证书需手动从http://burp下载保存为cacert.der在同一目录 BURP_CERTcacert.der PEM_CERTcacert.pem # 2. 转换证书并计算哈希 openssl x509 -inform DER -in $BURP_CERT -out $PEM_CERT HASH$(openssl x509 -inform PEM -subject_hash_old -in $PEM_CERT | head -1) FILENAME$HASH.0 # 3. 重命名PEM文件 cp $PEM_CERT $FILENAME # 4. 推送文件到模拟器 adb push $FILENAME /data/local/tmp/ # 5. 执行Shell命令进行安装 adb shell EOF su mount -o rw,remount /system cp /data/local/tmp/$FILENAME /system/etc/security/cacerts/ chmod 644 /system/etc/security/cacerts/$FILENAME chown root:root /system/etc/security/cacerts/$FILENAME mount -o ro,remount /system # 可选将/system重新挂载为只读以提高安全性 echo 证书 $FILENAME 安装完成请重启模拟器。 EOF注意这是一个示例脚本实际使用时需要根据你的环境调整比如处理adb root权限请求、错误检查等。Windows下可以编写对应的PowerShell脚本。5.2 应对证书锁定Certificate Pinning即使安装了系统证书有些应用仍然无法抓包这是因为它们使用了“证书锁定”Certificate Pinning。应用会内置它期望的服务端证书的公钥或哈希值只信任这个特定的证书而不是整个系统CA库。应对策略在模拟器Root环境下使用Xposed模块或Frida脚本这是最主流的方法。例如使用JustTrustMeXposed模块或使用Frida脚本Hook SSL相关的函数如TrustManager绕过证书检查。这需要模拟器安装Xposed框架或Frida-server。修改应用本身反编译APK修改其网络安全配置文件network_security_config.xml或移除证书锁定的代码逻辑然后重打包签名。这种方法更彻底但工作量较大且可能触发应用的其他完整性检查。对于大多数测试场景在安装了系统证书后结合JustTrustMe这类工具已经可以解决90%以上的抓包问题。5.3 逍遥模拟器特定优化多开器与不同版本逍遥模拟器支持多开。你可以为一个测试项目专门创建一个模拟器实例并在该实例中安装系统证书避免影响其他工作环境。Root权限管理逍遥模拟器的Root开关在“设置”-“其他设置”里。确保它是开启的。有时ADB Shell的su命令可能不直接给权限需要在模拟器弹出的对话框中点击“允许”。网络桥接模式如果你需要模拟器使用宿主机的真实局域网IP便于同局域网其他设备测试可以考虑将逍遥模拟器的网络设置改为“桥接模式”。但注意桥接模式下代理主机IP就不再是10.0.2.2而是你宿主机的实际局域网IP了。6. 常见问题排查与解决方案实录在实际操作中你几乎一定会遇到一些问题。下面是我踩过的一些坑和解决办法。6.1 证书安装后仍不信任现象证书已放入/system/etc/security/cacerts/权限也正确但应用特别是浏览器或某些App仍然报告SSL错误。排查步骤确认证书哈希和格式使用openssl x509 -in /system/etc/security/cacerts/你的证书文件名 -text -noout在ADB Shell里查看证书信息确认它是有效的PEM格式且颁发者是Burp。检查系统证书库是否更新Android可能会缓存证书列表。尝试完全关闭模拟器不仅仅是休眠再冷启动。检查时间是否正确Burp的CA证书有有效期。确保模拟器的系统日期和时间是正确的如果时间偏差太大可能导致证书被视为无效。应用级别的证书锁定如前所述遇到证书锁定的应用系统证书也没用。需要配合绕过锁定工具。6.2 ADB连接或Root权限问题现象adb devices无设备或adb shell su失败。解决方案检查逍遥模拟器ADB端口逍遥模拟器通常使用127.0.0.1:21503。尝试adb connect 127.0.0.1:21503。重启ADB服务在宿主机执行adb kill-server然后adb start-server。确保模拟器内“USB调试”已开启有时模拟器更新或重启后会关闭。Root权限弹窗执行su后注意看模拟器屏幕是否有授权弹窗必须点击“允许”。6.3 系统分区挂载失败现象mount -o rw,remount /system返回“Permission denied”或“Device or resource busy”。解决方案确认已获取Root权限Shell提示符必须是#。尝试先进入/system目录cd /system后再执行mount -o rw,remount .。使用busybox有些镜像的mount命令功能不全可以尝试busybox mount -o rw,remount /system。逍遥模拟器通常自带busybox。检查是否有进程占用理论上可能性较小可以尝试重启模拟器后再操作。6.4 安装证书后网络异常现象安装证书后部分应用无法联网甚至系统网络图标出现异常。解决方案检查证书文件是否损坏用一个简单的PEM证书如echo test /system/etc/security/cacerts/badcert.0测试如果导致问题说明你的证书可能格式不对。用正确的PEM格式重试。检查代理设置确认模拟器的Wi-Fi代理设置是否正确指向Burp且Burp代理正在运行。可以暂时关闭代理看网络是否恢复以排除代理问题。恢复备份如果你之前备份了原cacerts目录可以将有问题的证书删除或者用备份覆盖回去。7. 安全测试实践与伦理边界最后必须强调一下伦理和法律边界。我们讨论的所有技术目的都应该是授权测试只对你拥有合法权限的系统、应用或网络进行测试。例如测试自己公司开发的应用或参与正规的众测项目。学习与研究在完全隔离的环境如模拟器、虚拟机中对开源应用或自己编写的应用进行技术学习理解HTTPS和证书机制。安全评估作为安全从业人员在获得明确授权的前提下对客户资产进行渗透测试或安全评估。绝对禁止将这些技术用于拦截、窃听他人的网络通信。对未授权的商业应用或网站进行攻击测试。任何违反法律法规和公序良俗的行为。在逍遥模拟器这样的封闭环境中进行技术演练是安全的但一旦涉及到真实网络和他人资产就必须恪守红线。技术是一把双刃剑用它来筑盾而非铸矛才是我们从业者应有的态度。这套方法练熟了能极大提升你在移动应用安全测试中的效率和深度希望这份详细的实战指南能帮你扫清障碍。如果在操作中遇到新的问题多思考、多搜索、多实践往往就能找到答案。