王者营地 Token获取:从 SSL Pinning 绕过到 Frida 动态插桩
王者营地官方英雄战力数据抓包实战从 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-server4.4 验证连接五、编写 SSL Pinning 绕过脚本5.1 脚本原理5.2 完整脚本ssl-bypass.js5.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,// 地区代码如上海310000roleId:116581781,// 玩家角色IDareaId:3,// 大区1QQ安卓, 2iOS安卓, 3微信安卓, 4微信iOSheroId:146,// 英雄代码如146露娜recommendPrivacy:0}请求头需要token从王者营地 App 抓包获取userId营地用户ID⚠️ 这个接口需要有效的 token通常需要从王者营地 App 抓包获取且 token 可能会过期。二、初步尝试直接抓包2.1 环境准备推荐方案在 PC 上使用 雷电模拟器/夜神模拟器 Fiddler操作最方便。工具抓包工具Fiddler5.0、 HttpCanary 雷电模拟器9Android 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 XposedFrida 动态插桩运行时 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、Bandizipxz-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 shellchmod 755 /data/local/tmp/frida-server4.3 启动 frida-server# adb shell /data/local/tmp/frida-server # 需要 Root 权限启动adb shellsu -c /data/local/tmp/frida-server 如果遇到报错“Unable to save SELinux policy to the kernel: Permission denied”这是SELinux 权限问题用 Root 权限启动。adb shellsu/data/local/tmp/frida-serveradb root adb shell/data/local/tmp/frida-server 常见问题Address already in usefrida-server 已在运行无需重复启动Permission denied未获取 Root 权限4.4 验证连接frida-ps-U看到手机进程列表说明连接成功。如果报错先杀掉旧的 frida-server后重新启动adb shellsu -c killall frida-serveradb shellsu -c /data/local/tmp/frida-server frida-ps-U五、编写 SSL Pinning 绕过脚本5.1 脚本原理SSL Pinning 绕过核心思想Hook 住 App 中验证服务器证书的方法让其永远返回验证通过。王者营地使用的技术栈HTTP 客户端OkHttp 4.9.1SSL 验证Android 系统 TrustManagerImpl域名验证HostnameVerifier一句话总结Frida 脚本让 App 对 Fiddler 的假证书睁一只眼闭一只眼但 Fiddler 自己还需要被 Android 系统信任才能解密内容。5.2 完整脚本ssl-bypass.jsJava.perform(function(){console.log( Hooking 王者营地 SSL);// 1. Hook 系统级证书校验核心varTrustManagerImplJava.use(com.android.org.conscrypt.TrustManagerImpl);varArrayListJava.use(java.util.ArrayList);TrustManagerImpl.checkTrustedRecursive.implementationfunction(){console.log([] checkTrustedRecursive() bypassed);// 直接返回空列表跳过所有证书链校验returnArrayList.$new();};// 2. Hook OkHttp 证书锁定try{varCertificatePinnerJava.use(okhttp3.CertificatePinner);CertificatePinner.check.overload(java.lang.String,java.util.List).implementationfunction(){console.log([] OkHttp CertificatePinner bypassed);};}catch(e){console.log([-] OkHttp CertificatePinner not found);}// 3. Hook 域名验证try{varhostnameVerifierJava.use(javax.net.ssl.HostnameVerifier);varMyHostnameVerifierJava.registerClass({name:com.example.MyHostnameVerifier,implements:[hostnameVerifier],methods:{verify:function(hostname,session){console.log([] Hostname verified: hostname);returntrue;// 任何域名都通过}}});varHttpsURLConnectionJava.use(javax.net.ssl.HttpsURLConnection);HttpsURLConnection.setDefaultHostnameVerifier(MyHostnameVerifier.$new());}catch(e){console.log([-] HostnameVerifier hook failed);}console.log( Hooks ready);});替代的Python脚本hook.pyimportfridaimportsysdefon_message(message,data):print(message)devicefrida.get_usb_device()piddevice.spawn([com.tencent.gamehelper.smoba])sessiondevice.attach(pid)withopen(ssl-bypass.js,r,encodingutf-8)asf:scriptsession.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 shellsu -c ps | grep frida# 2. 查看进程 PIDfrida-ps-U|findstr 王者营地# 输出ID 王者营地# 3. Attach 并加载脚本frida-U-p上面的ID-lC:\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# 推送到系统证书目录模拟器已 Rootadb root adb remount adb push FiddlerRoot.cer /system/etc/security/cacerts/ adb shellchmod 644 /system/etc/security/cacerts/FiddlerRoot.ceradbrebootFiddler 里全是 Tunnel to 说明 HTTPS 解密没生效Frida 虽然绕过了 App 的 SSL Pinning但 Fiddler 本身没能解密流量。6.3 配合 HttpCanary 抓包如果 Fiddler 证书一直搞不定直接在模拟器里装 HttpCanary下载 HttpCanary APK 安装到模拟器HttpCanary 设置 → 安装根证书 → 选择 System Trusted需要 RootHttpCanary 有内置 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, // 英雄ID146露娜 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 ), }关键参数说明参数位置说明tokenHeader营地登录态令牌userIdHeader营地用户IDopenidHeader微信/QQ OpenIDroleIdBody游戏角色IDareaIdBody大区代码1QQ安卓, 2iOS, 3微信安卓, 4微信iOSheroIdBody英雄ID可从 herolist.json 获取adcodeBody行政区划代码100000全国, 310000上海等编写一点python代码战力数据查询请求成功舒服了。八、完整技术总结8.1 问题解决路径直接抓包失败CONNECT 隧道 ↓ 识别 SSL Pinning 问题 ↓ 选择 Frida 动态插桩方案 ↓ 搭建 Frida 环境frida-server 客户端 ↓ 编写 Hook 脚本绕过证书校验 ↓ Attach 到目标进程 ↓ 配合 Fiddler 系统证书 ↓ 使用HttpCanary抓包获取 ↓ 成功获取明文接口参数8.2 核心知识点SSL PinningApp 将服务器证书指纹硬编码防止中间人攻击Frida 动态插桩运行时修改内存中的方法实现无需修改 APKTrustManagerImplAndroid 底层证书链验证核心类OkHttp CertificatePinner应用层额外的证书指纹校验8.3 注意事项法律合规仅供学习研究勿用于商业或恶意用途账号安全token 等凭证有有效期勿泄露请求频率避免高频调用防止被封接口变动官方可能随时更新接口需持续关注九、参考资源Frida 官方文档OkHttp SSL 文档Android TrustManager 源码SSL Pinning 绕过技术总结结语这次探索从抓包失败到深入理解 SSL Pinning 机制再到掌握 Frida 动态插桩技术收获颇丰。移动安全领域还有很多值得深挖的方向保持好奇心持续学习。有了战力数据后面我们就可以做很多的事情了比如战区修改推荐合适的战区分析那个战区容易上榜等具体的开发见后续文章创作不易点赞收藏支持一下吧~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2590705.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!