当前位置: 首页 > news >正文

Python 爬虫 APP 逆向实战:Frida 注入 Hook 抓参数绕过 SSL Pinning

前言

大量安卓 APP 启用 SSL Pinning 证书锁定,内置固定 CA 白名单,中间人 mitmproxy 自签证书直接被拦截断网无法抓包;Frida 动态注入 APP 进程,Hook 系统 SSL 校验函数、前端加密方法,绕过证书校验同时直接拦截内存明文参数、密钥、AES 盐值,是原生 APP 爬虫逆向刚需。本章实现 Frida 环境部署、SSL 拦截脚本、Hook 加密函数、搭配 mitmproxy 打通 APP 抓包全链路,承接上一篇中间人抓包工程。

本文所需依赖官方文档超链接:

  1. Frida 官方文档
  2. mitmproxy 文档
  3. Requests 官方文档

一、SSL Pinning 与 Frida 逆向原理

1.1 SSL Pinning 风控逻辑

APP 内置合法服务端证书指纹,HTTPS 握手时校验中间人证书指纹不匹配,直接断开 TCP 连接,mitm/Charles 无法解密流量。

1.2 Frida 实现思路

  1. 安卓模拟器 / ROOT 真机部署 frida-server;
  2. PC 端 frida 注入目标 APP 进程;
  3. JS Hook 代码替换系统 SSL 校验方法,删除证书指纹校验逻辑,放行 mitm 自签证书;
  4. 额外 Hook APP 内部加密函数,在入参 / 出参位置直接打印明文密钥、加密前后参数,省去 JS 算法逆向。

二、环境部署

bash

运行

# PC安装frida套件 pip install frida==16.2.1 frida-tools==12.4.2
  1. 模拟器 / ROOT 手机:推送对应 CPU 架构 frida-server,授权 755 权限后台运行;
  2. 设备开启 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').implementation=function(){ 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替换目标应用包名。

四、模块 2:Hook 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 值,直接拿来构造爬虫参数。

五、Frida+mitmproxy 联动全链路抓包

  1. 模拟器 WIFI 代理配置:PC 局域网 IP:8080,mitmdump 正常启动;
  2. frida 注入 ssl 绕过脚本,放行中间人证书;
  3. APP 正常访问,HTTPS 全量报文被 mitmproxy 解密捕获,同时 frida 控制台输出加密密钥。

bash

运行

# 终端1启动mitm抓包 mitmdump -s capture_all.py -p8080 # 终端2frida注入绕过ssl frida -U com.xxx.app -l ssl_bypass.js

六、模块 3:Frida RPC 调用,Python 主动调用 APP 内部加密方法

不用复刻 AES/RSA 算法,Python 通过 frida-rpc 远程调用 APP 原生加密函数生成密文:

frida_rpc.js

javascript

运行

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",encoding="utf8") 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 选用 Magisk+LSPosed 挂载 frida 模块。

八、故障排查优化表

表格

异常问题解决方案
frida 附加进程报错frida-server 版本与 PC、安卓系统架构统一
hook 找不到类名jadx 反编译 APK 获取完整包名 + 类名
绕过 Pinning 后仍无法抓包APP 使用 Native SO 层 SSL 校验,改用 inline hook so
rpc 调用参数类型报错Java int/string 参数区分入参数据类型

九、爬虫工程落地组合

Frida Hook 拿密钥 / 原生加密方法 + mitm 抓接口 URL + Python requests 构造密文请求,形成 APP 爬虫标准化流水线。

十、本章总结

Frida 核心两大用途:绕过 SSL Pinning 打通 HTTPS 抓包、Hook 原生加密函数直拿密钥与密文规则;小规模调试用 RPC 调用原生加密,大批量爬虫抓取用抓包 + 算法复刻方案。后续拓展:SO 层 Native 函数 Hook、jadx 反编译 APK 静态分析、XPosed 插件持久化绕过证书锁定。

http://www.rkmt.cn/news/1478233.html

相关文章:

  • 宝鸡市2026年最新黄金+白银+铂金+K金回收门店及联系方式电话推荐 黄金回收店铺TOP5排行榜 - 盛世金银回收
  • Yelp评论实时情感分析系统:NiFi+Kafka+Spark端到端实践
  • 音乐如何成为AI的情绪心电图:无感式情绪识别技术解析
  • 2026成都定做铝合金箱厂家评测:核心维度选型推荐 - 优质品牌商家
  • 三维标准化落地体系!手把手教你实现品质、效率、安全三位一体提升
  • 别再混淆了!一文讲透SAP ABAP中程序锁(ENQUEUE_ES_PROG)和对象锁的区别与实战选型
  • Keras模型Flask部署实战:从训练到API上线的完整工程指南
  • LLM上下文长度扩展:RoPE外推、KV缓存优化与长文本微调实战
  • MATLAB版MOEDO多目标优化工具包:含ZDT1测试、Pareto前沿可视化与NSGA-II对比模块
  • Proteus 8.9安装包+保姆级教程:手把手教你从零搭建51单片机最小系统(附避坑指南)
  • 2026医院旗杆选购:工厂旗杆、工地旗杆、广场旗杆、户外旗杆、政府单位旗杆、景区旗杆、移动旗杆、部队旗杆、防爆旗杆选择指南 - 优质品牌商家
  • 时间序列趋势检测:从误判到可解释工程实践
  • Windows平台MQTT消息调试工具:C#开发,支持订阅/发布、QoS设置与历史消息查看
  • Sqribble文档自动化原理:模板驱动的云原生排版流水线
  • 数据切分不是随机分割:面向业务真实性的模型评估设计
  • 告别盲调!用Minibalance上位机可视化调试Arduino PID(附库文件安装避坑指南)
  • 北京黄金回收高信誉门店甄选指南 - 余生黄金回收
  • 终极无边框游戏窗口指南:告别Alt+Tab卡顿的完整解决方案
  • 别光跑示例!深入解读DPDK L3fwd输出日志里的隐藏信息
  • MinIO单机部署在CentOS 7上,如何解决控制台端口随机和默认密码警告?
  • 大语言模型微调中的合成数据生成:质量控制与工程实践
  • 告别仿真乱麻:用PSCAD高效搭建RLC电路的5个核心技巧
  • 性能之巅=协程 vs 进程 vs 线程、事件循环 epoll、连接池、火焰图)
  • 软链接与硬链接深度解析(面试必坑)
  • 效率提升秘籍:用快马ai一键生成企业级rabbitmq工具库与模板
  • 多维聚合实战:从SQL优化到OLAP引擎的工程化落地
  • 别再死记硬背了!用Proteus 8.9仿真51单片机,手把手教你搭建最小系统(附常用元件库清单)
  • C#编写的多门店零售管理系统(含可直接运行的SQL Server数据库)
  • Element UI弹窗居中踩坑记:从CSS Hack到理解Flex布局的‘弹性’奥秘
  • 从SF2文件到美妙音符:手把手教你用PolyPhone编辑器自定义SoundFont音色