
前言大量安卓 APP 启用 SSL Pinning 证书锁定内置固定 CA 白名单中间人 mitmproxy 自签证书直接被拦截断网无法抓包Frida 动态注入 APP 进程Hook 系统 SSL 校验函数、前端加密方法绕过证书校验同时直接拦截内存明文参数、密钥、AES 盐值是原生 APP 爬虫逆向刚需。本章实现 Frida 环境部署、SSL 拦截脚本、Hook 加密函数、搭配 mitmproxy 打通 APP 抓包全链路承接上一篇中间人抓包工程。本文所需依赖官方文档超链接Frida 官方文档mitmproxy 文档Requests 官方文档一、SSL Pinning 与 Frida 逆向原理1.1 SSL Pinning 风控逻辑APP 内置合法服务端证书指纹HTTPS 握手时校验中间人证书指纹不匹配直接断开 TCP 连接mitm/Charles 无法解密流量。1.2 Frida 实现思路安卓模拟器 / ROOT 真机部署 frida-serverPC 端 frida 注入目标 APP 进程JS Hook 代码替换系统 SSL 校验方法删除证书指纹校验逻辑放行 mitm 自签证书额外 Hook APP 内部加密函数在入参 / 出参位置直接打印明文密钥、加密前后参数省去 JS 算法逆向。二、环境部署bash运行# PC安装frida套件 pip install frida16.2.1 frida-tools12.4.2模拟器 / ROOT 手机推送对应 CPU 架构 frida-server授权 755 权限后台运行设备开启 adb 调试adb devices 校验设备连通。三、模块 1通用 SSL Pinning 绕过 Hook 脚本 (ssl_bypass.js)javascript运行// Hook okhttp、系统SSL两类主流Pinning实现 Java.perform(function(){ // Okhttp3证书锁定拦截APP最常用 try{ var CertificatePinner Java.use(okhttp3.CertificatePinner); CertificatePinner.check.overload(java.lang.String,java.util.List).implementation function(){ // 空实现直接跳过证书校验 return; } console.log(Okhttp SSL Pinning 绕过成功); }catch(e){ console.log(未找到Okhttp3:e.message); } // Android原生SSLSocket校验绕过 try{ var SSLSocketFactory Java.use(javax.net.ssl.SSLSocketFactory); SSLSocketFactory.createSocket.overload(java.net.Socket,java.lang.String,int,boolean).implementationfunction(){ var sock this.createSocket.apply(this,arguments); return sock; } }catch(e){} })启动注入命令bash运行frida -U -f com.xxx.appid -l ssl_bypass.js --no-pause-U连接 USB 设备com.xxx.appid替换目标应用包名。四、模块 2Hook APP 加密函数直接抓取明文密钥 请求参数APP 内部 AES/RSA 加密函数被 Hook函数调用瞬间打印入参明文不用逆向 SO 与 Java 代码javascript运行// hook APP自定义加密类 Java.perform(function(){ var EncryptUtil Java.use(com.xxx.utils.EncryptUtil); // AES加密方法Hook EncryptUtil.aesEncrypt.implementation function(plainText,key){ console.log([AES明文]:plainText); console.log([AES密钥]:key); var res this.aesEncrypt(plainText,key); console.log([加密结果]:res); return res; } // MD5签名Hook EncryptUtil.getSign.implementation function(param,salt){ console.log([签名原文]:param 盐:salt); var sign this.getSign(param,salt); console.log([生成sign]:sign); return sign; } })运行后 APP 任意接口请求控制台自动输出密钥、明文、密文、sign 值直接拿来构造爬虫参数。五、Fridamitmproxy 联动全链路抓包模拟器 WIFI 代理配置PC 局域网 IP:8080mitmdump 正常启动frida 注入 ssl 绕过脚本放行中间人证书APP 正常访问HTTPS 全量报文被 mitmproxy 解密捕获同时 frida 控制台输出加密密钥。bash运行# 终端1启动mitm抓包 mitmdump -s capture_all.py -p8080 # 终端2frida注入绕过ssl frida -U com.xxx.app -l ssl_bypass.js六、模块 3Frida RPC 调用Python 主动调用 APP 内部加密方法不用复刻 AES/RSA 算法Python 通过 frida-rpc 远程调用 APP 原生加密函数生成密文frida_rpc.jsjavascript运行rpc.exports { aesEnc:function(text,key){ var EncryptUtil Java.use(com.xxx.utils.EncryptUtil); return EncryptUtil.aesEncrypt(text,key); } }Python 调用代码python运行import frida device frida.get_usb_device() pid device.spawn(com.xxx.appid) session device.attach(pid) with open(frida_rpc.js,r,encodingutf8) as f: script session.create_script(f.read()) script.load() rpc script.exports # 直接调用APP原生加密 cipher_data rpc.aes_enc({page:1},1234567812345678) print(接口密文,cipher_data)爬虫可直接复用原生加密逻辑彻底省去算法逆向。七、非 ROOT 设备方案模拟器 免 ROOT 环境雷电 / 夜神模拟器自带 ROOT直接运行 frida-server真机无 ROOT 选用 MagiskLSPosed 挂载 frida 模块。八、故障排查优化表表格异常问题解决方案frida 附加进程报错frida-server 版本与 PC、安卓系统架构统一hook 找不到类名jadx 反编译 APK 获取完整包名 类名绕过 Pinning 后仍无法抓包APP 使用 Native SO 层 SSL 校验改用 inline hook sorpc 调用参数类型报错Java int/string 参数区分入参数据类型九、爬虫工程落地组合Frida Hook 拿密钥 / 原生加密方法 mitm 抓接口 URL Python requests 构造密文请求形成 APP 爬虫标准化流水线。十、本章总结Frida 核心两大用途绕过 SSL Pinning 打通 HTTPS 抓包、Hook 原生加密函数直拿密钥与密文规则小规模调试用 RPC 调用原生加密大批量爬虫抓取用抓包 算法复刻方案。后续拓展SO 层 Native 函数 Hook、jadx 反编译 APK 静态分析、XPosed 插件持久化绕过证书锁定。