王者营地官方英雄战力数据抓包实战:从 SSL Pinning 绕过到 Frida 动态插桩获取Token
背景:近期在研究王者荣耀英雄战力数据时,需要通过王者营地 App 获取官方战力榜接口参数。过程中遇到了 HTTPS 抓包失败、SSL Pinning 拦截等问题,最终通过 Frida 动态插桩成功绕过,完整记录下这次技术探索过程。
文章目录
- 王者营地官方英雄战力数据抓包实战:从 SSL Pinning 绕过到 Frida 动态插桩获取Token
- 一、目标与需求
- 二、初步尝试:直接抓包
- 2.1 环境准备
- 2.2 操作抓包
- 2.3 遇到的问题
- 三、解决方案选择
- 四、Frida 环境搭建
- 4.1 安装 Frida 工具链
- 4.2 部署 frida-server 到手机
- 4.3 启动 frida-server
- 4.4 验证连接
- 五、编写 SSL Pinning 绕过脚本
- 5.1 脚本原理
- 5.2 完整脚本(ssl-bypass.js)
- 5.3 关键方法解析
- 六、执行 Hook 与抓包
- 6.1 Attach 到运行中的进程
- 6.2 配合 Fiddler 抓包
- 6.3 配合 HttpCanary 抓包
- 七、获取到的接口参数
- 请求示例
- 八、完整技术总结
- 8.1 问题解决路径
- 8.2 核心知识点
- 8.3 注意事项
- 九、参考资源
一、目标与需求
需要获取王者营地 App 中英雄战力榜的官方接口参数,用于查询:
- 全国/省/市/区各级榜单
- 英雄最低上榜战力
- 英雄排名数据
其实本篇主要是抓取UserID和Token,本来就想用一下王者荣耀官方战力查询接口,但是获取不到参数,这能忍吗,不能忍。
参考: 分享王者荣耀官方战力查询接口:直接调用王者营地API获取英雄战力数据
目标接口:
POSThttps://kohcamp.qq.com/honor/ranklist Content-Type:application/json这是目前最权威、最稳定的战力数据来源,很多开源项目(包括类似工具)都使用这个接口
请求参数(JSON):
{"adcode":"310000",// 地区代码(如上海:310000)"roleId":"116581781",// 玩家角色ID"areaId":"3",// 大区:1=QQ安卓, 2=iOS安卓, 3=微信安卓, 4=微信iOS"heroId":"146",// 英雄代码(如146=露娜)"recommendPrivacy":0}请求头需要:
- token:从王者营地 App 抓包获取
- userId:营地用户ID
⚠️ 这个接口需要有效的 token,通常需要从王者营地 App 抓包获取,且 token 可能会过期。
二、初步尝试:直接抓包
2.1 环境准备
推荐方案:在 PC 上使用 雷电模拟器/夜神模拟器 + Fiddler,操作最方便。
- 工具:抓包工具(Fiddler5.0、 HttpCanary) + 雷电模拟器9(Android 9.0)+ ADB调试工具
- 配置:模拟器 WiFi 代理指向 Fiddler(端口 8888)
- 证书:Fiddler 根证书已安装到模拟器用户证书目录
Fiddler5.0可以去吾爱论坛下载,HttpCanary 尽量找找高级版。ADB从官网下载了解压后添加个环境变量即可。
我最终Fiddler还是没抓到包,但是HttpCanary 可以。
2.2 操作抓包
配置抓包环境(以 Fiddler + 模拟器为例)
步骤 1:配置 Fiddler 下载安装 Fiddler 打开 Tools → Options → HTTPS 勾选 Decrypt HTTPS traffic 点击 Actions → Trust Root Certificate 安装证书 切换到 Connections 标签,勾选 Allow remote computers to connect 记住 Fiddler 的监听端口(默认 8888) 步骤 2:配置模拟器代理 打开模拟器的 WiFi 设置 长按当前 WiFi → 修改网络 → 高级选项 代理选择 手动 输入你电脑的 IP 地址 和端口 8888 步骤 3:安装 Fiddler 证书到模拟器 在模拟器浏览器中访问:http://你的电脑IP:8888 下载并安装 Fiddler 根证书打开Fiddler,【工具】->【选项】->【HTTPS】,勾选抓取HTTPS连接和解密HTTPS流量,可以选择仅从远程客户端抓取,因为我们只要模拟器的流量。
连接这里配置监听端口,默认8888,还有勾选允许远程计算机连接。
打开模拟器,配置模拟器代理,记得使用桥接网络模式,然后点击wifi配置代理,首先查一下你的电脑的ip地址
这个时候你的抓包软件应该能捕获到http的流量了,之后打开浏览器,地址栏输入你的代理IP+端口,我这里是192.168.10.121:8888,会出现以下界面,点击下载完成后安装CA证书。安装好之后代理就配置完成了,打开王者营地,你会发现根本抓不到需要的包,同时还有告警提示:
打开HttpCanary看看,点击设置、选择目标应用、安装CA证书后发现还是一样的,甚至应用界面都无法打开了。
具体的分析和处理见下面。
2.3 遇到的问题
抓包时发现所有 HTTPS 请求都显示为CONNECT 隧道,无法解密(甚至都抓不到HTTPS的流量,这个我怀疑是抓包工具的问题,后面换成HttpCanary正常的):
CONNECT galileotelemetry.tencent.com:443 HTTP/1.1 Host: galileotelemetry.tencent.com:443 Connection: Keep-Alive User-Agent: okhttp/4.9.1 A SSLv3-compatible ClientHello handshake was found...原因分析:王者营地 App 使用了SSL Pinning(证书锁定)技术,检测到 Fiddler 的中间人证书后拒绝连接,导致 Fiddler 只能看到 TCP 握手层,无法获取应用层 HTTP 内容。
三、解决方案选择
| 方案 | 原理 | 难度 | 适用性 |
|---|---|---|---|
| Xposed + JustTrustMe | 模块绕过证书校验 | 中 | 需要 Root + Xposed |
| Frida 动态插桩 | 运行时 Hook 修改验证逻辑 | 中高 | 无需 Xposed,更灵活 |
| HttpCanary | 内置 SSL Pinning 绕过 | 低 | 部分版本需 Root |
| 降级 Android 版本 | 低版本默认信任用户证书 | 低 | 功能可能受限 |
这里我最终选择Frida,原因:
- 无需安装 Xposed 框架
- 可以精确 Hook 目标方法
- 对系统侵入性较小
(对其它感兴趣的伙伴也可以动手试一下)
四、Frida 环境搭建
4.1 安装 Frida 工具链
首先你的电脑环境得先安装了python。
# 电脑端安装 frida-toolspipinstallfrida-tools# 验证版本frida--version# 输出:17.9.5# 查看adb连接情况,这里模拟器设置里面要先开启adb调试adb devices# 输出:List of devices attached# emulator-5554 device # 这个就是模拟器设备信息4.2 部署 frida-server 到手机
frida-server下载 https://github.com/frida/frida/releases
# 查看手机架构adb shell getprop ro.product.cpu.abi# 输出:x86_64 (不同的模拟器不同)# 根据上面输出的信息下载对应版本 frida-server# https://github.com/frida/frida/releases# frida-server-17.9.5-android-x86_64.xz# 解压并重命名(也可以用自己电脑解压软件解压,如7-zip、Bandizip)xz-dfrida-server-17.9.5-android-x86_64.xzmvfrida-server-17.9.5-android-x86_64 frida-server# 推送到手机adb push frida-server /data/local/tmp/# 赋予执行权限adb shell"chmod 755 /data/local/tmp/frida-server"4.3 启动 frida-server
# adb shell "/data/local/tmp/frida-server &"# 需要 Root 权限启动adb shell"su -c '/data/local/tmp/frida-server &'"如果遇到报错“Unable to save SELinux policy to the kernel: Permission denied”这是SELinux 权限问题,用 Root 权限启动。
adb shellsu/data/local/tmp/frida-server&adb root adb shell"/data/local/tmp/frida-server &"常见问题:
Address already in use:frida-server 已在运行,无需重复启动Permission denied:未获取 Root 权限
4.4 验证连接
frida-ps-U看到手机进程列表说明连接成功。如果报错,先杀掉旧的 frida-server后重新启动:
adb shell"su -c 'killall frida-server'"adb shell"su -c '/data/local/tmp/frida-server &'"frida-ps-U五、编写 SSL Pinning 绕过脚本
5.1 脚本原理
SSL Pinning 绕过核心思想:Hook 住 App 中验证服务器证书的方法,让其永远返回"验证通过"。
王者营地使用的技术栈:
- HTTP 客户端:OkHttp 4.9.1
- SSL 验证:Android 系统 TrustManagerImpl
- 域名验证:HostnameVerifier
一句话总结
Frida 脚本让 App 对 Fiddler 的"假证书"睁一只眼闭一只眼,但 Fiddler 自己还需要被 Android 系统信任才能解密内容。
5.2 完整脚本(ssl-bypass.js)
Java.perform(function(){console.log(" Hooking 王者营地 SSL");// 1. Hook 系统级证书校验(核心)varTrustManagerImpl=Java.use("com.android.org.conscrypt.TrustManagerImpl");varArrayList=Java.use("java.util.ArrayList");TrustManagerImpl.checkTrustedRecursive.implementation=function(){console.log("[+] checkTrustedRecursive() bypassed");// 直接返回空列表,跳过所有证书链校验returnArrayList.$new();};// 2. Hook OkHttp 证书锁定try{varCertificatePinner=Java.use("okhttp3.CertificatePinner");CertificatePinner.check.overload('java.lang.String','java.util.List').implementation=function(){console.log("[+] OkHttp CertificatePinner bypassed");};}catch(e){console.log("[-] OkHttp CertificatePinner not found");}// 3. Hook 域名验证try{varhostnameVerifier=Java.use("javax.net.ssl.HostnameVerifier");varMyHostnameVerifier=Java.registerClass({name:'com.example.MyHostnameVerifier',implements:[hostnameVerifier],methods:{verify:function(hostname,session){console.log("[+] Hostname verified: "+hostname);returntrue;// 任何域名都通过}}});varHttpsURLConnection=Java.use("javax.net.ssl.HttpsURLConnection");HttpsURLConnection.setDefaultHostnameVerifier(MyHostnameVerifier.$new());}catch(e){console.log("[-] HostnameVerifier hook failed");}console.log(" Hooks ready");});替代的Python脚本(hook.py):
importfridaimportsysdefon_message(message,data):print(message)device=frida.get_usb_device()pid=device.spawn(["com.tencent.gamehelper.smoba"])session=device.attach(pid)withopen("ssl-bypass.js","r",encoding="utf-8")asf:script=session.create_script(f.read())script.on("message",on_message)script.load()device.resume(pid)sys.stdin.read()5.3 关键方法解析
| Hook 目标 | 原始功能 | Hook 后效果 |
|---|---|---|
TrustManagerImpl.checkTrustedRecursive() | 递归验证证书链是否可信 | 直接返回空列表,跳过校验 |
CertificatePinner.check() | OkHttp 验证证书指纹 | 空实现,不执行校验 |
HostnameVerifier.verify() | 验证域名与证书匹配 | 永远返回 true |
六、执行 Hook 与抓包
6.1 Attach 到运行中的进程
先手动打开王者营地 App
# 1. 确认 frida-server 在运行adb shell"su -c 'ps | grep frida'"# 2. 查看进程 PIDfrida-ps-U|findstr 王者营地# 输出:<ID> 王者营地# 3. Attach 并加载脚本frida-U-p<上面的ID>-l"C:\Users\yxn\Downloads\ssl-bypass.js"成功后会看到:
[+] Hostname verified: galileotelemetry.tencent.com [+] Hostname verified: galileotelemetry.tencent.com6.2 配合 Fiddler 抓包
注意:Frida 绕过了 App 的证书校验,但 Fiddler 还需要被 Android 系统信任。
证书安装步骤:
# 导出 Fiddler 证书到桌面# Tools → Options → HTTPS → Actions → Export Root Certificate# 推送到系统证书目录(模拟器已 Root)adb root adb remount adb push FiddlerRoot.cer /system/etc/security/cacerts/ adb shell"chmod 644 /system/etc/security/cacerts/FiddlerRoot.cer"adbreboot
Fiddler 里全是 Tunnel to 说明 HTTPS 解密没生效,Frida 虽然绕过了 App 的 SSL Pinning,但 Fiddler 本身没能解密流量。
6.3 配合 HttpCanary 抓包
如果 Fiddler 证书一直搞不定,直接在模拟器里装 HttpCanary:
下载 HttpCanary APK 安装到模拟器
HttpCanary 设置 → 安装根证书 → 选择 System Trusted(需要 Root)
HttpCanary 有内置 SSL Pinning 绕过功能
开启抓包 → 打开王者营地 → 操作战力查询
在 HttpCanary 里直接看明文请求
成功了,可以看到捕获到了kohcamp.qq.com相关的数据,随便点一个进去,里面就有我们要的内容:
七、获取到的接口参数
请求示例
POST https://kohcamp.qq.com/honor/ranklist HTTP/1.1 Host: kohcamp.qq.com token: eyJhbGciOiJIUzI1NiIs... userId: 123456789 openid: oABC123... appid: 1104466820 version: 8.94.0417 Content-Type: application/json { "adcode": "310000", // 地区代码:上海 "roleId": "116581781", // 角色ID "areaId": "3", // 大区:3=微信安卓 "heroId": "146", // 英雄ID:146=露娜 "recommendPrivacy": 0 } # python请求头 DEFAULT_HEADERS = { "Content-Type": "application/json", "Accept": "*/*", "Host": "kohcamp.qq.com", "Connection": "keep-alive", "User-Agent": ( "Mozilla/5.0 (Linux; Android 14; PLR110 Build/UKQ1.230917.001; wv) " "AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/121.0.6167.178 Mobile Safari/537.36" ), }- 关键参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
token | Header | 营地登录态令牌 |
userId | Header | 营地用户ID |
openid | Header | 微信/QQ OpenID |
roleId | Body | 游戏角色ID |
areaId | Body | 大区代码:1=QQ安卓, 2=iOS, 3=微信安卓, 4=微信iOS |
heroId | Body | 英雄ID,可从 herolist.json 获取 |
adcode | Body | 行政区划代码:100000=全国, 310000=上海等 |
编写一点python代码,战力数据查询请求成功,舒服了。
八、完整技术总结
8.1 问题解决路径
直接抓包失败(CONNECT 隧道) ↓ 识别 SSL Pinning 问题 ↓ 选择 Frida 动态插桩方案 ↓ 搭建 Frida 环境(frida-server + 客户端) ↓ 编写 Hook 脚本(绕过证书校验) ↓ Attach 到目标进程 ↓ 配合 Fiddler 系统证书 ↓ 使用HttpCanary抓包获取 ↓ 成功获取明文接口参数8.2 核心知识点
- SSL Pinning:App 将服务器证书指纹硬编码,防止中间人攻击
- Frida 动态插桩:运行时修改内存中的方法实现,无需修改 APK
- TrustManagerImpl:Android 底层证书链验证核心类
- OkHttp CertificatePinner:应用层额外的证书指纹校验
8.3 注意事项
- 法律合规:仅供学习研究,勿用于商业或恶意用途
- 账号安全:token 等凭证有有效期,勿泄露
- 请求频率:避免高频调用,防止被封
- 接口变动:官方可能随时更新接口,需持续关注
九、参考资源
- Frida 官方文档
- OkHttp SSL 文档
- Android TrustManager 源码
- SSL Pinning 绕过技术总结
结语:这次探索从抓包失败到深入理解 SSL Pinning 机制,再到掌握 Frida 动态插桩技术,收获颇丰。移动安全领域还有很多值得深挖的方向,保持好奇心,持续学习。
有了战力数据,后面我们就可以做很多的事情了,比如战区修改,推荐合适的战区,分析那个战区容易上榜等,具体的开发见后续文章,创作不易,点赞收藏支持一下吧~