1. 项目概述为什么安卓App抓包越来越“难”作为一名在移动安全测试和逆向分析领域摸爬滚打了十来年的老手我几乎每天都要和各种App的通信协议打交道。早些年抓个包简直是小菜一碟装个Fiddler或者Charles手机设置个代理流量就哗啦啦地过来了。但现在情况完全不同了。你兴冲冲地打开抓包工具准备分析某个App的API结果看到的却是一片“Connection Reset”或者满屏的“Tunnel to …:443”。这背后正是App开发者为了提升安全性而广泛采用的**SSL证书锁定SSL Pinning**技术。简单来说SSL证书锁定就是App在代码里“记住”了它只信任的特定证书或公钥。当App与服务端建立HTTPS连接时它会比对服务端返回的证书是否和自己“记住”的那个一致。如果不一致即使这个证书是受系统信任的比如你自己安装的抓包工具的根证书App也会毫不犹豫地拒绝连接。这就好比你家门锁不仅认钥匙还认唯一的一把特定钥匙的齿纹你拿其他任何能开你家门型号的钥匙都打不开。所以“安卓App抓包实战”在今天核心已经演变成一场与SSL证书锁定技术的攻防战。我们的目标很明确突破这层锁定成功捕获并解密HTTPS流量以便进行安全审计、协议分析、性能调试或逆向学习。这个过程不仅需要合适的工具链更需要理解其背后的原理和一系列绕过技巧。接下来我将结合我踩过的无数个坑为你拆解从环境搭建、工具配置到高级绕过的完整实战路径。2. 核心原理与工具选型构建你的抓包武器库在动手之前我们必须搞清楚对手SSL Pinning是如何工作的以及我们有哪些“武器”可以应对。盲目操作只会浪费时间。2.1 HTTPS与中间人攻击MitM基础HTTPS的本质是在HTTP协议之上增加了TLS/SSL加密层确保传输数据的机密性和完整性。常规的抓包就是实施一次“中间人攻击”让App的流量先经过我们的抓包代理服务器由代理服务器分别与App和真实服务器建立TLS连接并完成解密-再加密的过程。正常流程App --(HTTPS)-- 目标服务器。抓包流程App --(HTTPS信任抓包工具证书)-- 抓包代理 --(HTTPS使用服务器真实证书)-- 目标服务器。要让App信任我们的抓包代理关键一步就是在安卓设备的系统信任证书库中安装我们抓包工具生成的根证书。这样代理服务器用自己的证书签发一个针对目标域名的“假”证书时设备系统会认为它是可信的。2.2 SSL证书锁定的实现方式开发者主要通过以下两种方式实现证书锁定证书锁定Certificate Pinning在App代码或配置文件中直接嵌入目标服务器证书的哈希值如SHA-256指纹。连接时计算服务器证书的哈希并与预置值比对。公钥锁定Public Key Pinning嵌入证书公钥的哈希值。这种方式更灵活因为即使证书到期续签只要公钥不变连接就不会中断。当启用锁定的App遇到我们的抓包代理时会发现代理提供的证书指纹与预置的不符随即触发SSL错误终止连接。2.3 核心工具链选型与搭配工欲善其事必先利其器。根据不同的场景和对抗强度我通常会准备以下几套方案方案A常规抓包与代理用于无锁定或弱锁定App抓包代理软件Charles或Fiddler。两者都是图形化界面的老牌强者。Charles对JSON、XML等格式展示更友好Fiddler的脚本扩展能力更强。新手可以从Charles入手界面更直观。HTTP调试代理Burp Suite。这是Web安全测试的行业标准功能极其强大尤其擅长拦截、重放、扫描和暴力破解。对于复杂的API测试Burp是首选。系统级代理工具Postern安卓或ProxyDroid需Root。用于在系统层面设置全局代理确保所有App流量包括那些不使用系统代理设置的都经过你的抓包工具。方案B高级分析与绕过用于强锁定App动态插桩框架Frida。这是当前移动安全分析的“瑞士军刀”。它允许你在App运行时通过注入JavaScript脚本动态地Hook钩子和修改其函数行为包括直接禁用证书验证逻辑。这是绕过SSL Pinning最主流、最有效的方法。逆向分析平台Objection。一个基于Frida的命令行工具封装了许多常用功能包括一键禁用SSL Pinning简化了操作。网络嗅探工具Wireshark。即使无法解密HTTPS它也能捕获所有原始网络包用于分析连接问题、DNS查询或未加密的协议。模拟器雷电模拟器或夜神模拟器。在电脑上运行安卓环境方便进行Root、安装Xposed框架等高风险操作避免污染真实手机。我的工具选型心得对于日常调试或分析一些普通AppCharles 手机安装证书的组合能解决80%的问题。一旦遇到连接失败我会立刻祭出Frida。对于需要深度逆向或自动化测试的场景Burp Suite Frida是黄金搭档。永远不要指望一个工具通吃所有情况。3. 实战环境搭建与基础配置让我们从最基础的场景开始一步步搭建一个可用的抓包环境。这里以Charles 一台非Root的安卓真机为例。3.1 配置抓包代理Charles端安装与启动从官网下载安装Charles。首次启动时它会提示你是否授予创建系统代理的权限同意即可。获取代理IP和端口在Charles中点击Help - Local IP Address查看你电脑在当前局域网内的IP地址如192.168.1.100。Charles默认的代理端口是8888。记下IP:端口如192.168.1.100:8888。启用SSL代理这是关键步骤。进入Proxy - SSL Proxying Settings。勾选Enable SSL Proxying。在Locations列表下方点击Add。Host可以填写你需要抓取的域名如*.api.app.com或者更粗暴地填*星号以代理所有HTTPS流量。Port填443。这样配置后Charles才会尝试对指定域名的443端口流量进行解密。3.2 配置安卓设备端连接同一网络确保手机和电脑连接在同一个Wi-Fi网络下。设置手动代理进入手机的Wi-Fi设置长按当前连接的网络选择“修改网络” - “高级选项”。代理选择“手动”。代理服务器主机名填写你的电脑IP如192.168.1.100。代理服务器端口填写8888。保存。安装Charles根证书这是让手机信任Charles的关键。在手机浏览器中访问chls.pro/ssl。这个网址会引导你下载Charles的根证书一个.pem或.crt文件。下载后系统会提示你安装证书。你需要为证书起一个名字比如“Charles Proxy”。在安卓系统中安装用户证书和系统证书是两回事。在非Root设备上你只能将证书安装为“用户证书”。信任用户证书针对安卓7.0及以上安卓从7.0API 24开始做了一个重大安全变更App默认不再信任用户安装的证书只信任系统证书。这导致很多App即使你装了证书也抓不到包。解决方法你需要将证书移动到系统证书区但这需要Root权限。如果没有Root我们暂时用另一个方法配置App的网络安全配置或使用低版本安卓模拟器。对于实战分析我强烈建议使用一台已Root的测试机或模拟器。3.3 验证基础抓包完成上述配置后在Charles中确保Proxy - Windows Proxy和Proxy - macOS Proxy是勾选状态这会让Charles捕获电脑本身的流量你可以先取消勾选以避免干扰。然后在手机上打开浏览器访问任意HTTPS网站如https://www.baidu.com。此时Charles会弹出一个连接请求询问你是否允许该设备连接。点击“Allow”。如果一切顺利你将在Charles的会话列表Sequence中看到抓取到的HTTP和已解密的HTTPS请求与响应。第一个常见坑点如果你在手机上设置了代理后完全无法上网请检查电脑的防火墙是否放行了8888端口。可以临时关闭防火墙测试或者手动在防火墙入站规则中添加该端口的允许规则。4. 突破SSL证书锁定从低到高的四种实战策略当你发现目标App设置了代理后无法联网或HTTPS请求显示为Tunnel to...而无法解密时就意味着SSL Pinning在起作用。下面我按难度和适用场景分享四种破解策略。4.1 策略一寻找“后门”——利用App的调试配置许多开发中的App或者某些厂商为了方便测试会在构建时留下“后门”。这是成本最低的绕过方式。检查网络安全配置文件解压App的APK文件查看res/xml/目录下是否存在network_security_config.xml文件。这个文件定义了App的网络安全策略。分析配置内容用文本编辑器打开该文件。你可能会看到类似下面的配置network-security-config base-config cleartextTrafficPermittedfalse trust-anchors certificates srcsystem / !-- 如果下面这行存在说明App允许信任用户证书 -- certificates srcuser / /trust-anchors /base-config domain-config domain includeSubdomainstruesecure.server.com/domain pin-set !-- 这里就是证书锁定的配置 -- pin digestSHA-256ABC123.../pin /pin-set /domain-config /network-security-config如果certificates srcuser /这一行存在那么恭喜你你只需要像之前那样安装用户证书就可能直接抓包。如果只有certificates srcsystem /则必须将证书放入系统区。4.2 策略二“降维打击”——使用低版本安卓或模拟器如果App没有强制要求高版本系统这是一个非常有效的物理方法。使用安卓7.0以下的设备或模拟器如前所述安卓7.0是分水岭。找一个安卓6.0的旧手机或模拟器如雷电模拟器可以安装安卓5.1/7.1等镜像在上面安装用户证书大部分未做额外锁定的App流量都可以直接捕获。修改模拟器的系统镜像在已Root的模拟器里你可以手动将Charles的根证书.pem文件重命名为特定的哈希名hash.0并放入/system/etc/security/cacerts/目录修改权限为644重启后该证书就成为系统证书。网上有大量一键脚本可以完成这个操作。4.3 策略三“内部瓦解”——使用Frida动态Hook这是目前最主流、最强大的方法。它的原理是在App运行时注入代码去修改关键函数的行为让证书验证逻辑失效。准备工作准备一台已Root的安卓手机或者已Root的模拟器。在电脑上安装Fridapip install frida-tools在安卓设备上安装并运行frida-server需要从GitHub下载对应架构的版本并adb push到设备chmod 755后运行。使用Objection一键绕过 Objection让这个过程变得极其简单。# 连接设备 frida-ps -U # 看到目标App的进程名比如 com.example.app # 使用Objection注入并启动App同时禁用SSL Pinning objection -g com.example.app explore --startup-command android sslpinning disable执行后Objection会尝试Hook常见的证书锁定实现库如OkHttp, Retrofit, Apache HttpClient等并使其失效。此时再尝试抓包大概率已经成功。手动编写Frida脚本更精准 如果Objection的通用规则不生效就需要针对特定App分析其使用的锁定库并编写定制脚本。例如针对常见的OkHttp3的证书锁定// okhttp3_pinning_bypass.js Java.perform(function() { var CertificatePinner Java.use(okhttp3.CertificatePinner); CertificatePinner.check.overload(java.lang.String, [Ljava.security.cert.Certificate;).implementation function(pin, certs) { console.log([] Bypassing OkHttp3 CertificatePinner.check for: pin); // 什么都不做直接绕过检查 }; });使用命令frida -U -f com.example.app -l okhttp3_pinning_bypass.js --no-pause来注入脚本。4.4 策略四“釜底抽薪”——逆向修改APK这是最彻底但也最复杂的方法。直接修改App的源码或字节码移除证书锁定逻辑然后重新打包签名安装。使用Apktool反编译APK得到Smali汇编代码。定位锁定代码在Smali代码中搜索关键词如pin、CertificatePinner、X509TrustManager等找到进行证书验证的地方。修改代码通常是将验证函数直接修改为return-void直接返回或使其始终返回true。使用Apktool回编并用jarsigner和zipalign重新签名。安装修改后的APK。这个过程需要对Smali语法有一定了解且如果App有签名校验很多App都有你修改后重签名的APK会无法运行还需要额外绕过签名校验难度呈指数级上升。因此除非万不得已我通常优先使用Frida方案。我的策略选择心得遇到抓包失败我的排查顺序是1) 检查网络配置和证书安装是否正确2) 查看network_security_config.xml3) 换用安卓6模拟器尝试4) 直接上Frida Objection。95%的情况下第四步都能解决问题。修改APK是最后的手段用于应对那些连Frida都检测和对抗的“硬骨头”。5. 进阶技巧与深度问题排查成功绕过SSL Pinning抓到包有时只是开始。下面分享一些进阶场景的处理技巧。5.1 处理双向证书认证mTLS有些高安全级别的API会使用双向TLS认证即客户端App也需要向服务器出示证书。抓包工具默认没有客户端的证书会导致连接失败。解决方案你需要从App的安装包或运行时内存中将客户端证书通常是.p12或.bks格式及其密码提取出来。提取证书可以搜索APK文件中的.p12,.bks,.jks文件或者使用Frida Hook密钥库相关函数在内存中导出证书。在Charles中配置在Proxy - SSL Proxying Settings - Client Certificates中添加提取到的客户端证书文件。这样当代理连接到目标服务器时就能出示正确的客户端证书了。5.2 应对证书锁定代理检测有些App不仅锁证书还会检测系统是否设置了代理。一旦发现就拒绝发送任何网络请求。检测原理App通过System.getProperty(“http.proxyHost”)等方法读取系统代理设置。绕过方法使用透明代理不在系统设置里配代理而是通过iptables规则将设备流量重定向到本机的一个透明代理端口如Burp的8080端口。这需要Root权限。工具有ProxyDroid或手动编写iptables命令。Hook代理检测函数使用Frida Hook上述getProperty方法使其返回null让App认为没有设置代理。使用VPN模式抓包一些高级抓包工具如Reqable、Packet Capture等其工作原理类似于在手机本地创建一个VPN所有流量经过这个虚拟网卡从而绕过系统代理检测。Charles和Burp也支持与这类工具配合。5.3 处理非标准端口与协议App可能不使用443端口或者使用基于TCP/UDP的自有协议如游戏、即时通讯。Wireshark抓取原始流量对于任何网络活动Wireshark都是最终的“照妖镜”。即使不能解密也能看到连接的目标IP、端口、数据包大小和频率。在Charles/Burp中配置非标准端口在SSL代理设置中将端口从443改为*或添加具体的非标准端口。解密WebSocket等长连接Charles和Burp对WebSocket有很好的支持可以直接看到明文消息。确保在工具中正确配置了WebSocket的代理。6. 实战问题排查清单与心得我把这些年遇到的高频问题整理成了一张排查表你可以像查字典一样使用它问题现象可能原因排查步骤与解决方案手机设置代理后无法上网1. 电脑防火墙阻止2. 电脑与手机不在同一局域网3. Charles代理未开启1. 关闭电脑防火墙或放行代理端口如88882. 确认手机IP与电脑IP在同一网段如都是192.168.1.x3. 检查Charles的Proxy - Proxy Settings是否启用端口是否正确HTTPS请求显示为Tunnel to...且内容为二进制SSL代理未针对该域名启用在Charles的SSL Proxying Settings中为该域名或*和443端口添加一条规则部分App能抓包目标App不能1. 目标App使用了SSL Pinning2. 目标App是安卓7.0以上且未信任用户证书1. 使用Frida Objection尝试绕过2. 将抓包工具证书安装为系统证书需Root使用Frida注入后App闪退1. Frida版本与server不匹配2. App有反调试/反Frida检测1. 确保电脑frida-tools与设备frida-server版本一致2. 尝试使用frida -U -f com.xx --no-pause尽早注入3. 使用Frida隐身脚本或修改frida-server特征进行对抗能抓到包但响应乱码或加密1. 响应体被Gzip压缩2. App进行了自定义加密1. 在Charles的View菜单中勾选Enable Gzip2. 右键请求选择Repeat并在Edit Request中移除Accept-Encoding: gzip头再发送测试3. 需逆向分析App的加解密算法编写脚本解密请求中含有Proxy-Connection等头代理信息泄露可能触发服务端拒绝在Charles的Tools - Rewrite或Burp的Proxy - Options - Match and Replace中设置规则移除请求头中的Proxy-Connection、X-Forwarded-For等最后一点个人体会安卓抓包是一个持续对抗的过程。开发者的安全意识在提升新的加固和检测方案层出不穷。保持学习深入理解HTTPS、TLS协议以及安卓运行机制比掌握任何一个单一工具更重要。当你遇到一个无法抓包的App时把它看作一个有趣的谜题——分析它用了哪种网络库OkHttp, Cronet, 还是自研如何实现的证书锁定有没有检测代理或Hook环境。解决这个谜题的过程本身就是一次极佳的学习机会。记住没有绝对的安全关键在于你愿意投入多少精力去理解它。
安卓App抓包实战:突破SSL证书锁定的四种策略与工具链详解
发布时间:2026/6/26 17:38:04
1. 项目概述为什么安卓App抓包越来越“难”作为一名在移动安全测试和逆向分析领域摸爬滚打了十来年的老手我几乎每天都要和各种App的通信协议打交道。早些年抓个包简直是小菜一碟装个Fiddler或者Charles手机设置个代理流量就哗啦啦地过来了。但现在情况完全不同了。你兴冲冲地打开抓包工具准备分析某个App的API结果看到的却是一片“Connection Reset”或者满屏的“Tunnel to …:443”。这背后正是App开发者为了提升安全性而广泛采用的**SSL证书锁定SSL Pinning**技术。简单来说SSL证书锁定就是App在代码里“记住”了它只信任的特定证书或公钥。当App与服务端建立HTTPS连接时它会比对服务端返回的证书是否和自己“记住”的那个一致。如果不一致即使这个证书是受系统信任的比如你自己安装的抓包工具的根证书App也会毫不犹豫地拒绝连接。这就好比你家门锁不仅认钥匙还认唯一的一把特定钥匙的齿纹你拿其他任何能开你家门型号的钥匙都打不开。所以“安卓App抓包实战”在今天核心已经演变成一场与SSL证书锁定技术的攻防战。我们的目标很明确突破这层锁定成功捕获并解密HTTPS流量以便进行安全审计、协议分析、性能调试或逆向学习。这个过程不仅需要合适的工具链更需要理解其背后的原理和一系列绕过技巧。接下来我将结合我踩过的无数个坑为你拆解从环境搭建、工具配置到高级绕过的完整实战路径。2. 核心原理与工具选型构建你的抓包武器库在动手之前我们必须搞清楚对手SSL Pinning是如何工作的以及我们有哪些“武器”可以应对。盲目操作只会浪费时间。2.1 HTTPS与中间人攻击MitM基础HTTPS的本质是在HTTP协议之上增加了TLS/SSL加密层确保传输数据的机密性和完整性。常规的抓包就是实施一次“中间人攻击”让App的流量先经过我们的抓包代理服务器由代理服务器分别与App和真实服务器建立TLS连接并完成解密-再加密的过程。正常流程App --(HTTPS)-- 目标服务器。抓包流程App --(HTTPS信任抓包工具证书)-- 抓包代理 --(HTTPS使用服务器真实证书)-- 目标服务器。要让App信任我们的抓包代理关键一步就是在安卓设备的系统信任证书库中安装我们抓包工具生成的根证书。这样代理服务器用自己的证书签发一个针对目标域名的“假”证书时设备系统会认为它是可信的。2.2 SSL证书锁定的实现方式开发者主要通过以下两种方式实现证书锁定证书锁定Certificate Pinning在App代码或配置文件中直接嵌入目标服务器证书的哈希值如SHA-256指纹。连接时计算服务器证书的哈希并与预置值比对。公钥锁定Public Key Pinning嵌入证书公钥的哈希值。这种方式更灵活因为即使证书到期续签只要公钥不变连接就不会中断。当启用锁定的App遇到我们的抓包代理时会发现代理提供的证书指纹与预置的不符随即触发SSL错误终止连接。2.3 核心工具链选型与搭配工欲善其事必先利其器。根据不同的场景和对抗强度我通常会准备以下几套方案方案A常规抓包与代理用于无锁定或弱锁定App抓包代理软件Charles或Fiddler。两者都是图形化界面的老牌强者。Charles对JSON、XML等格式展示更友好Fiddler的脚本扩展能力更强。新手可以从Charles入手界面更直观。HTTP调试代理Burp Suite。这是Web安全测试的行业标准功能极其强大尤其擅长拦截、重放、扫描和暴力破解。对于复杂的API测试Burp是首选。系统级代理工具Postern安卓或ProxyDroid需Root。用于在系统层面设置全局代理确保所有App流量包括那些不使用系统代理设置的都经过你的抓包工具。方案B高级分析与绕过用于强锁定App动态插桩框架Frida。这是当前移动安全分析的“瑞士军刀”。它允许你在App运行时通过注入JavaScript脚本动态地Hook钩子和修改其函数行为包括直接禁用证书验证逻辑。这是绕过SSL Pinning最主流、最有效的方法。逆向分析平台Objection。一个基于Frida的命令行工具封装了许多常用功能包括一键禁用SSL Pinning简化了操作。网络嗅探工具Wireshark。即使无法解密HTTPS它也能捕获所有原始网络包用于分析连接问题、DNS查询或未加密的协议。模拟器雷电模拟器或夜神模拟器。在电脑上运行安卓环境方便进行Root、安装Xposed框架等高风险操作避免污染真实手机。我的工具选型心得对于日常调试或分析一些普通AppCharles 手机安装证书的组合能解决80%的问题。一旦遇到连接失败我会立刻祭出Frida。对于需要深度逆向或自动化测试的场景Burp Suite Frida是黄金搭档。永远不要指望一个工具通吃所有情况。3. 实战环境搭建与基础配置让我们从最基础的场景开始一步步搭建一个可用的抓包环境。这里以Charles 一台非Root的安卓真机为例。3.1 配置抓包代理Charles端安装与启动从官网下载安装Charles。首次启动时它会提示你是否授予创建系统代理的权限同意即可。获取代理IP和端口在Charles中点击Help - Local IP Address查看你电脑在当前局域网内的IP地址如192.168.1.100。Charles默认的代理端口是8888。记下IP:端口如192.168.1.100:8888。启用SSL代理这是关键步骤。进入Proxy - SSL Proxying Settings。勾选Enable SSL Proxying。在Locations列表下方点击Add。Host可以填写你需要抓取的域名如*.api.app.com或者更粗暴地填*星号以代理所有HTTPS流量。Port填443。这样配置后Charles才会尝试对指定域名的443端口流量进行解密。3.2 配置安卓设备端连接同一网络确保手机和电脑连接在同一个Wi-Fi网络下。设置手动代理进入手机的Wi-Fi设置长按当前连接的网络选择“修改网络” - “高级选项”。代理选择“手动”。代理服务器主机名填写你的电脑IP如192.168.1.100。代理服务器端口填写8888。保存。安装Charles根证书这是让手机信任Charles的关键。在手机浏览器中访问chls.pro/ssl。这个网址会引导你下载Charles的根证书一个.pem或.crt文件。下载后系统会提示你安装证书。你需要为证书起一个名字比如“Charles Proxy”。在安卓系统中安装用户证书和系统证书是两回事。在非Root设备上你只能将证书安装为“用户证书”。信任用户证书针对安卓7.0及以上安卓从7.0API 24开始做了一个重大安全变更App默认不再信任用户安装的证书只信任系统证书。这导致很多App即使你装了证书也抓不到包。解决方法你需要将证书移动到系统证书区但这需要Root权限。如果没有Root我们暂时用另一个方法配置App的网络安全配置或使用低版本安卓模拟器。对于实战分析我强烈建议使用一台已Root的测试机或模拟器。3.3 验证基础抓包完成上述配置后在Charles中确保Proxy - Windows Proxy和Proxy - macOS Proxy是勾选状态这会让Charles捕获电脑本身的流量你可以先取消勾选以避免干扰。然后在手机上打开浏览器访问任意HTTPS网站如https://www.baidu.com。此时Charles会弹出一个连接请求询问你是否允许该设备连接。点击“Allow”。如果一切顺利你将在Charles的会话列表Sequence中看到抓取到的HTTP和已解密的HTTPS请求与响应。第一个常见坑点如果你在手机上设置了代理后完全无法上网请检查电脑的防火墙是否放行了8888端口。可以临时关闭防火墙测试或者手动在防火墙入站规则中添加该端口的允许规则。4. 突破SSL证书锁定从低到高的四种实战策略当你发现目标App设置了代理后无法联网或HTTPS请求显示为Tunnel to...而无法解密时就意味着SSL Pinning在起作用。下面我按难度和适用场景分享四种破解策略。4.1 策略一寻找“后门”——利用App的调试配置许多开发中的App或者某些厂商为了方便测试会在构建时留下“后门”。这是成本最低的绕过方式。检查网络安全配置文件解压App的APK文件查看res/xml/目录下是否存在network_security_config.xml文件。这个文件定义了App的网络安全策略。分析配置内容用文本编辑器打开该文件。你可能会看到类似下面的配置network-security-config base-config cleartextTrafficPermittedfalse trust-anchors certificates srcsystem / !-- 如果下面这行存在说明App允许信任用户证书 -- certificates srcuser / /trust-anchors /base-config domain-config domain includeSubdomainstruesecure.server.com/domain pin-set !-- 这里就是证书锁定的配置 -- pin digestSHA-256ABC123.../pin /pin-set /domain-config /network-security-config如果certificates srcuser /这一行存在那么恭喜你你只需要像之前那样安装用户证书就可能直接抓包。如果只有certificates srcsystem /则必须将证书放入系统区。4.2 策略二“降维打击”——使用低版本安卓或模拟器如果App没有强制要求高版本系统这是一个非常有效的物理方法。使用安卓7.0以下的设备或模拟器如前所述安卓7.0是分水岭。找一个安卓6.0的旧手机或模拟器如雷电模拟器可以安装安卓5.1/7.1等镜像在上面安装用户证书大部分未做额外锁定的App流量都可以直接捕获。修改模拟器的系统镜像在已Root的模拟器里你可以手动将Charles的根证书.pem文件重命名为特定的哈希名hash.0并放入/system/etc/security/cacerts/目录修改权限为644重启后该证书就成为系统证书。网上有大量一键脚本可以完成这个操作。4.3 策略三“内部瓦解”——使用Frida动态Hook这是目前最主流、最强大的方法。它的原理是在App运行时注入代码去修改关键函数的行为让证书验证逻辑失效。准备工作准备一台已Root的安卓手机或者已Root的模拟器。在电脑上安装Fridapip install frida-tools在安卓设备上安装并运行frida-server需要从GitHub下载对应架构的版本并adb push到设备chmod 755后运行。使用Objection一键绕过 Objection让这个过程变得极其简单。# 连接设备 frida-ps -U # 看到目标App的进程名比如 com.example.app # 使用Objection注入并启动App同时禁用SSL Pinning objection -g com.example.app explore --startup-command android sslpinning disable执行后Objection会尝试Hook常见的证书锁定实现库如OkHttp, Retrofit, Apache HttpClient等并使其失效。此时再尝试抓包大概率已经成功。手动编写Frida脚本更精准 如果Objection的通用规则不生效就需要针对特定App分析其使用的锁定库并编写定制脚本。例如针对常见的OkHttp3的证书锁定// okhttp3_pinning_bypass.js Java.perform(function() { var CertificatePinner Java.use(okhttp3.CertificatePinner); CertificatePinner.check.overload(java.lang.String, [Ljava.security.cert.Certificate;).implementation function(pin, certs) { console.log([] Bypassing OkHttp3 CertificatePinner.check for: pin); // 什么都不做直接绕过检查 }; });使用命令frida -U -f com.example.app -l okhttp3_pinning_bypass.js --no-pause来注入脚本。4.4 策略四“釜底抽薪”——逆向修改APK这是最彻底但也最复杂的方法。直接修改App的源码或字节码移除证书锁定逻辑然后重新打包签名安装。使用Apktool反编译APK得到Smali汇编代码。定位锁定代码在Smali代码中搜索关键词如pin、CertificatePinner、X509TrustManager等找到进行证书验证的地方。修改代码通常是将验证函数直接修改为return-void直接返回或使其始终返回true。使用Apktool回编并用jarsigner和zipalign重新签名。安装修改后的APK。这个过程需要对Smali语法有一定了解且如果App有签名校验很多App都有你修改后重签名的APK会无法运行还需要额外绕过签名校验难度呈指数级上升。因此除非万不得已我通常优先使用Frida方案。我的策略选择心得遇到抓包失败我的排查顺序是1) 检查网络配置和证书安装是否正确2) 查看network_security_config.xml3) 换用安卓6模拟器尝试4) 直接上Frida Objection。95%的情况下第四步都能解决问题。修改APK是最后的手段用于应对那些连Frida都检测和对抗的“硬骨头”。5. 进阶技巧与深度问题排查成功绕过SSL Pinning抓到包有时只是开始。下面分享一些进阶场景的处理技巧。5.1 处理双向证书认证mTLS有些高安全级别的API会使用双向TLS认证即客户端App也需要向服务器出示证书。抓包工具默认没有客户端的证书会导致连接失败。解决方案你需要从App的安装包或运行时内存中将客户端证书通常是.p12或.bks格式及其密码提取出来。提取证书可以搜索APK文件中的.p12,.bks,.jks文件或者使用Frida Hook密钥库相关函数在内存中导出证书。在Charles中配置在Proxy - SSL Proxying Settings - Client Certificates中添加提取到的客户端证书文件。这样当代理连接到目标服务器时就能出示正确的客户端证书了。5.2 应对证书锁定代理检测有些App不仅锁证书还会检测系统是否设置了代理。一旦发现就拒绝发送任何网络请求。检测原理App通过System.getProperty(“http.proxyHost”)等方法读取系统代理设置。绕过方法使用透明代理不在系统设置里配代理而是通过iptables规则将设备流量重定向到本机的一个透明代理端口如Burp的8080端口。这需要Root权限。工具有ProxyDroid或手动编写iptables命令。Hook代理检测函数使用Frida Hook上述getProperty方法使其返回null让App认为没有设置代理。使用VPN模式抓包一些高级抓包工具如Reqable、Packet Capture等其工作原理类似于在手机本地创建一个VPN所有流量经过这个虚拟网卡从而绕过系统代理检测。Charles和Burp也支持与这类工具配合。5.3 处理非标准端口与协议App可能不使用443端口或者使用基于TCP/UDP的自有协议如游戏、即时通讯。Wireshark抓取原始流量对于任何网络活动Wireshark都是最终的“照妖镜”。即使不能解密也能看到连接的目标IP、端口、数据包大小和频率。在Charles/Burp中配置非标准端口在SSL代理设置中将端口从443改为*或添加具体的非标准端口。解密WebSocket等长连接Charles和Burp对WebSocket有很好的支持可以直接看到明文消息。确保在工具中正确配置了WebSocket的代理。6. 实战问题排查清单与心得我把这些年遇到的高频问题整理成了一张排查表你可以像查字典一样使用它问题现象可能原因排查步骤与解决方案手机设置代理后无法上网1. 电脑防火墙阻止2. 电脑与手机不在同一局域网3. Charles代理未开启1. 关闭电脑防火墙或放行代理端口如88882. 确认手机IP与电脑IP在同一网段如都是192.168.1.x3. 检查Charles的Proxy - Proxy Settings是否启用端口是否正确HTTPS请求显示为Tunnel to...且内容为二进制SSL代理未针对该域名启用在Charles的SSL Proxying Settings中为该域名或*和443端口添加一条规则部分App能抓包目标App不能1. 目标App使用了SSL Pinning2. 目标App是安卓7.0以上且未信任用户证书1. 使用Frida Objection尝试绕过2. 将抓包工具证书安装为系统证书需Root使用Frida注入后App闪退1. Frida版本与server不匹配2. App有反调试/反Frida检测1. 确保电脑frida-tools与设备frida-server版本一致2. 尝试使用frida -U -f com.xx --no-pause尽早注入3. 使用Frida隐身脚本或修改frida-server特征进行对抗能抓到包但响应乱码或加密1. 响应体被Gzip压缩2. App进行了自定义加密1. 在Charles的View菜单中勾选Enable Gzip2. 右键请求选择Repeat并在Edit Request中移除Accept-Encoding: gzip头再发送测试3. 需逆向分析App的加解密算法编写脚本解密请求中含有Proxy-Connection等头代理信息泄露可能触发服务端拒绝在Charles的Tools - Rewrite或Burp的Proxy - Options - Match and Replace中设置规则移除请求头中的Proxy-Connection、X-Forwarded-For等最后一点个人体会安卓抓包是一个持续对抗的过程。开发者的安全意识在提升新的加固和检测方案层出不穷。保持学习深入理解HTTPS、TLS协议以及安卓运行机制比掌握任何一个单一工具更重要。当你遇到一个无法抓包的App时把它看作一个有趣的谜题——分析它用了哪种网络库OkHttp, Cronet, 还是自研如何实现的证书锁定有没有检测代理或Hook环境。解决这个谜题的过程本身就是一次极佳的学习机会。记住没有绝对的安全关键在于你愿意投入多少精力去理解它。