文章总结: 本文记录了一次针对海外金融APP的SSLPinning绕过实战。作者使用Frida抓包发现证书不被信任,通过JADX反编译发现APP未使用自定义X509TrustManager,而是采用OkHttp的CertificatePinning对关键域名进行证书锁定。通过编写Frida脚本Hookec0.a类的b()方法,清空CertificatePinner.Builder内部的规则列表,成功绕过证书锁定并捕获到解密后的登录数据包。 综合评分: 78 文章分类: 移动安全,安卓逆向,渗透测试,安全工具,实战经验
安卓逆向 — 记一次SSL Pinning绕过
lichuntian00 lichuntian00
逆向有你
2026年2月10日 09:24 河南
目标APP:某海外金融APP。 工具链:Google pixel4真机、Fiddler、JADX、Fr
1.Frida抓包如下
得到2个信息: 1.能正常转发目标APP的流量,说明APP没用禁用系统代理。 2.目标APP流量没用被解密,说明证书不被信任。
用JADX反编译目标APK,搜索implements X509TrustManager:
一共实现了6种自定义X509TrustManager,暂时不知道启用的哪个,进入ec0.SSLClinentFactory类,该类会配置准备启用的X509TrustManager。
可以看到并没有启用任何一个X509TrustManger,而是使用Certificate Pinning来做证书校验,对关键域名启用了证书锁定。编写Frida脚本如下:
function main() { Java.perform(function () { const SSLCLientFactory = Java.use("ec0.a"); const CertificatePinnerBuilder = Java.use("okhttp3.CertificatePinner$Builder"); const JavaCollection = Java.use("java.util.Collection"); SSLCLientFactory.b.implementation = function () { console.log("[SSLCLientFactory] Hook b() 方法,修改证书固定规则"); // 获取原始 Builder let originalBuilder = this.b(); // 获取原 CertificatePinner.Builder const field = originalBuilder.getClass().getDeclaredField("v"); field.setAccessible(true); let certPinnerBuilder = field.get(originalBuilder); // 3. 获取 Builder 内部存储规则的列表 a const pinListField = certPinnerBuilder.getClass().getDeclaredField("a"); pinListField.setAccessible(true); let pinList = pinListField.get(certPinnerBuilder); // 4. 清空列表 const javaList = Java.cast(pinList, JavaCollection); javaList.clear(); console.log("[+] 证书固定规则已清空(a 列表为空)"); return originalBuilder; };});}setImmediate(main);
运行脚本:
成功捕获到解密之后的登录数据包。
·今 日 推 荐·
本文内容来自网络,如有侵权请联系删除
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:逆向有你 lichuntian00 lichuntian00《安卓逆向 — 记一次SSL Pinning绕过》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论