在移动端数据采集场景中,闲鱼这类电商 App 普遍采用签名校验、协议加密、反调试、Root 检测等防护手段,传统抓包工具难以直接获取明文商品数据。Frida 作为动态插桩工具,无需脱壳即可实时 Hook 关键函数,拦截加密参数、解密响应、提取商品标题、价格、库存、卖家信息等核心字段,是移动端逆向采集的高效方案。
本文以实战视角,完整讲解基于 Frida 对闲鱼 App 进行逆向分析、Hook 加密算法、提取商品数据的全流程,兼顾技术原理与可落地脚本。
一、前置环境与工具准备
1. 环境要求
- 电脑:Windows/macOS/Linux
- 设备:已 Root 安卓真机 / 模拟器(雷电、夜神、MuMu 均可)
- 闲鱼 App:建议 7.x--8.x 稳定版(新版加固更强,兼容性下降)
2. 必备工具
表格
| 工具 | 用途 |
|---|---|
| Frida & Frida-tools | 动态 Hook、注入脚本 |
| adb | 设备通信、进程管理 |
| Jadx/Ghidra | 静态反编译定位类与方法 |
| Wireshark/HttpCanary | 辅助抓包定位接口 |
| Python3 | 编写控制脚本、数据解析 |
3. 环境部署步骤
- 电脑安装:
pip install frida frida-tools - 设备推送对应架构 frida-server 并启动
- 开启 USB 调试,执行
adb devices确认连接 - 启动闲鱼,
frida -U -f com.taobao.idlefish --no-pause测试注入
二、闲鱼 App 防护与逆向思路
闲鱼核心防护点:
- x-sign/x-mini-wua等请求签名算法在 So 层实现
- SSL pinning阻止常规抓包
- 反调试、反 Hook、模拟器检测
- 响应密文,需在 Java 层解密后获取明文
采集思路:
- 静态反编译定位网络请求、加解密、数据解析类
- Frida 动态 Hook 签名函数,获取明文入参与签名结果
- Hook 数据解析方法,直接提取商品 JSON
- 绕过 SSL pinning 与反检测,稳定运行采集
三、关键 Hook 点与实战脚本
1. 绕过 SSL 证书绑定
javascript
运行
Java.perform(function(){
const TrustManager = Java.use('javax.net.ssl.X509TrustManager');
const SSLContext = Java.use('javax.net.ssl.SSLContext');
const tm = Java.registerClass({
name: 'FakeTrustManager',
implements: [TrustManager],
methods: {
checkClientTrusted: function(){},
checkServerTrusted: function(){},
getAcceptedIssuers: function(){return [];}
}
});
const sslCtx = SSLContext.getInstance('TLS');
sslCtx.init(null, [tm.$new()], null);
SSLContext.init.implementation = function(){return sslCtx;};
console.log('[+] SSL Pinning 已绕过');
});
2. Hook 商品数据解析类(核心)
javascript
运行
Java.perform(function(){
// 定位商品数据解析类(以常见类名为例,需按版本微调)
const GoodsParser = Java.use('com.taobao.idlefish.business.detail.model.GoodsModel');
// Hook构造/解析方法
GoodsParser.$init.implementation = function(){
this.$init();
// 打印完整对象
console.log('[+] 商品数据:', JSON.stringify(this));
// 精准提取关键字段
console.log('标题:', this.title);
console.log('价格:', this.price);
console.log('卖家:', this.sellerNick);
console.log('商品ID:', this.itemId);
};
console.log('[+] 商品解析Hook已挂载');
});
3. Hook So 层签名函数
javascript
运行
Interceptor.attach(Module.findExportByName('libsecurity.so', 'native_getSign'), {
onEnter: function(args){
// 入参:请求参数串
this.param = Memory.readUtf8String(args[1]);
console.log('[+] 签名入参:', this.param);
},
onLeave: function(retval){
// 出参:生成的sign
const sign = Memory.readUtf8String(retval);
console.log('[+] 签名结果:', sign);
}
});
4. Python 调用 Frida 脚本
python
运行
import frida
import sys
def on_message(message, data):
if message['type'] == 'send':
print(message['payload'])
def main():
device = frida.get_usb_device()
pid = device.spawn(['com.taobao.idlefish'])
process = device.attach(pid)
with open('hook.js', 'r', encoding='utf-8') as f:
script = process.create_script(f.read())
script.on('message', on_message)
script.load()
device.resume(pid)
sys.stdin.read()
if __name__ == '__main__':
main()
四、运行与数据提取流程
- 执行 Python 脚本启动并注入闲鱼
- 手动浏览商品列表 / 详情页触发数据加载
- Frida 控制台实时输出明文商品信息
- 保存日志或对接数据库完成批量采集
- 按需求清洗字段:标题、价格、运费、销量、地区、描述等
五、常见问题与规避方案
- App 闪退
- 降低 Frida 版本,避免过高版本冲突
- 增加反调试绕过 Hook
- Hook 不到方法
- 新版类名 / 方法名混淆,用 Jadx 重新定位
- 检查包名、进程是否正确
- 无数据输出
- 确认触发数据加载动作
- 检查 So 层函数偏移是否变化
- 检测到模拟器 / Root
- Hook 系统检测函数,伪造返回值
- 使用隐藏 Root 的模拟器 / 真机
六、合规与风险提示
- 本文仅用于学习逆向技术与安全自测
- 未经许可爬取平台数据违反《网络安全法》《个人信息保护法》及平台用户协议
- 商业采集需获得平台官方 API 授权,否则需承担法律责任
- 请勿用于恶意爬虫、批量刷单、数据倒卖等行为
七、总结
Frida 无需静态脱壳,可直接在运行时 Hook 加密、解析、网络相关函数,高效突破闲鱼的签名与加密防护,精准提取商品数据。配合静态反编译定位关键类,可快速搭建稳定采集方案。
技术本身无善恶,务必在合法合规前提下使用逆向与爬虫技术,尊重平台规则与用户隐私。