逆向快手:通过Xposed强制QUIC降级为HTTPS实现抓包

news2026/3/13 17:21:06
1. 为什么抓不到快手的包聊聊QUIC这个“拦路虎”如果你最近尝试过用Charles或者Fiddler去抓取快手App的网络请求大概率会一脸懵怎么除了几个零星的无用请求核心的API数据一个都看不到我之前也卡在这个问题上很久一度怀疑是自己的代理设置错了或者手机证书没装好。折腾了半天才发现真正的“罪魁祸首”是QUIC协议。简单来说QUIC你可以把它理解成HTTP/2的“超级进化版”由Google大力推动。它基于UDP协议而不是我们熟悉的TCP。对我们抓包者而言最要命的一点是大多数传统的抓包工具如Charles、Fiddler默认只监听和解析TCP流量对UDP上的QUIC协议束手无策。所以当快手App使用QUIC与服务端通信时你的抓包软件就像戴上了隔音耳塞什么也听不见。那快手为什么偏爱QUIC呢从用户体验角度QUIC确实厉害。它解决了TCP的一些老毛病比如“队头阻塞”——一个数据包丢了后面所有包都得等着。QUIC在连接建立速度尤其是首次握手0-RTT或1-RTT、多路复用、前向纠错等方面优势明显能让视频加载更快、直播更流畅。但对于我们做逆向分析、安全测试或者单纯想研究一下接口的人来说这就成了一堵墙。所以我们的核心思路就从“如何抓QUIC包”转变为能不能让快手不用QUIC退回到我们熟悉的HTTPS基于TCP答案是肯定的。这就是“协议降级”的思路。快手Android版使用了Chromium的网络库Cronet这个库是支持QUIC的但它的行为可以通过配置来控制。我们的目标就是“骗过”快手让它加载一个“禁用QUIC”的配置从而乖乖地走HTTPS通道这样流量就能被我们的代理工具轻松捕获了。2. 核心武器Xposed框架与Hook原理简介要让一个App改变它既定的网络行为我们不可能去修改它的安装包那太麻烦且每次更新都要重做。我们需要一种运行时动态修改其逻辑的方法这就是Xposed框架的用武之地。你可以把Xposed理解成一个给Android系统开的“上帝模式”外挂。它允许我们在任何App包括系统本身的代码执行过程中插入我们自己的代码片段从而改变其原有的行为。这个过程叫做“Hook”挂钩。想象一下App的代码像一条预设好的流水线。Hook就是在流水线的某个关键工位安插我们自己的“工人”。当程序执行流经过这个工位时我们的工人可以先于、后于或者完全替代原来的工人进行操作比如检查传递的“原料”参数、替换“产品”返回值甚至直接改变“生产工艺”执行逻辑。在本次实战中我们要Hook的目标就是快手App中负责初始化Cronet网络引擎的那个方法。我们要在这个方法里把原本可能包含enable_quic:true的配置JSON字符串替换成我们精心构造的、明确设置了enable_quic:false的配置。这样当Cronet库被初始化时它读取到的指令就是“禁用QUIC”从而自然降级到使用HTTPS。准备工作很简单你需要一台已经Root的Android手机或模拟器并在上面安装好Xposed框架或者它的衍生版本如EdXposed、LSPosed。然后你需要开发一个非常简单的Xposed模块。这个模块不需要任何界面它的全部使命就是在快手App启动时把我们写好的Hook代码“注射”进去。下面我会给出最精简的模块代码框架。3. 寻找关键Hook点深入Cronet配置的加载过程这是整个过程中最需要耐心和技巧的一步。我们得找到快手App里哪个类、哪个方法负责处理Cronet的配置信息。原始文章里直接给出了一个类名j.e0.e0.f.e。但这是经过混淆的不同版本快手的类名可能完全不同。所以掌握寻找方法比记住这个类名更重要。我常用的工具是Jadx-GUI这是一个反编译APK的神器。把从手机里提取出来的快手APK文件拖进去它会将字节码转换成可读性较高的Java代码。由于代码被混淆了所有类名、方法名都变成了a.b.c.d这种无意义的字符串直接搜索“quic”或“cronet”可能一无所获。我的策略是“顺藤摸瓜”搜索特征字符串在Jadx中全局搜索一些Cronet配置里可能出现的键名比如enable_quic、quic_idle_timeout_sec、cdn_preresolver等。原始配置很可能以JSON字符串的形式硬编码在代码里。定位调用处找到这些字符串后查看它所在的上下文。它很可能作为一个参数被传递给某个方法。记下这个方法及其所属的类。分析参数类型观察这个方法的参数。我们的目标是找到一个参数是String类型可能就是配置JSON并且方法名可能是init、configure、a混淆后的通用名的方法。原始文章中的Hook方法签名是a(String.class, Type.class, Object.class)这很可能就是一个通用的配置设置方法。以我手头一个版本的快手为例我通过搜索enable_quic找到了一个JSON字符串它被传递给com.kuaishou.network.cronet.b.a()方法。这个a方法就是我们要Hook的潜在目标。你需要在自己的目标APK版本中重复这个过程找到属于你的那个“关键方法”。找到后用Xposed的findAndHookMethod去挂钩它。4. 构造“魔法”配置详解禁用QUIC的JSON找到Hook点只是成功了一半另一半在于我们替换进去的“假配置”是否有效。我们不能简单地只设置enable_quic:false因为一个残缺的配置可能会引起App的异常或崩溃。我们需要构造一个完整的、合法的Cronet配置JSON。原始文章给出的配置已经非常好了我们来逐项拆解一下理解每部分的作用{ enable_quic: false, cdn_preresolver_ip_blacklist: [0.0.0.0, 1.1.1.1, 127.0.0.1], preconnect_num_streams: 1, quic_idle_timeout_sec: 180, quic_use_bbr: false, altsvc_broken_time_max: 600, altsvc_broken_time_base: 60, proxy_host_blacklist: [*] }enable_quic: false核心中的核心直接关闭QUIC协议支持。cdn_preresolver_ip_blacklist这个非常关键它指定了一个IP黑名单。我们把127.0.0.1本地环回地址和常见的DNS地址加了进去。目的是防止Cronet库尝试绕过系统代理直接解析域名并连接。很多现代网络库为了性能会尝试“直连”这会导致流量不经过我们设置的代理加了这层黑名单能增加一道保险。preconnect_num_streams预连接流数量保持默认值1即可。quic_idle_timeout_secQUIC空闲超时既然禁用了这个值无关紧要但保留以避免结构错误。quic_use_bbr是否使用BBR拥塞控制算法关闭。altsvc_broken_time_*与Alt-SvcAlternative Service协议相关的参数用于指定替代服务失效的时间保持默认值一般没问题。proxy_host_blacklist: [*]这是另一道重要保险。它意味着“所有主机都不使用代理”。这听起来矛盾但其实是为了禁用Cronet内置的代理逻辑迫使网络流量走系统的全局代理设置。这样我们在手机系统或Postern里设置的代理才能生效。这个配置是我经过几次测试和调整后确定的它既成功禁用了QUIC又确保了流量能乖乖地流向系统代理实测下来非常稳定。5. 编写Xposed模块代码实战Hook步骤理论清楚了我们来写代码。创建一个新的Android项目选择“No Activity”因为我们的模块不需要界面。在AndroidManifest.xml中必须声明Xposed模块的元数据meta-data android:namexposedmodule android:valuetrue / meta-data android:namexposeddescription android:value强制快手使用HTTPS以方便抓包 / meta-data android:namexposedminversion android:value82 /核心代码在一个实现了IXposedHookLoadPackage接口的类中。我们在handleLoadPackage方法里判断当前加载的包名是否是快手例如com.kuaishou.nebula或com.smile.gifmaker具体包名以你反编译的为准如果是则执行我们的Hook逻辑。下面是完整的Hook函数示例我加上了详细的注释public class MainHook implements IXposedHookLoadPackage { Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { // 1. 只针对目标App生效 if (!lpparam.packageName.equals(com.smile.gifmaker)) { return; } // 2. 尝试查找我们反编译得到的配置类 // 注意这里的类名“j.e0.e0.f.e”是示例你必须替换成自己找到的类名 Class? targetClass XposedHelpers.findClassIfExists(j.e0.e0.f.e, lpparam.classLoader); if (targetClass ! null) { XposedBridge.log([快手QUIC劫持] 成功找到目标类: targetClass.getName()); // 3. Hook目标方法。方法名“a”和参数类型需要根据你的分析确定 XposedHelpers.findAndHookMethod(targetClass, a, // 方法名 String.class, // 第一个参数可能是配置标识如cronetConfig Class.forName(java.lang.reflect.Type), // 第二个参数Type类型 Object.class, // 第三个参数可能是配置对象或回调 new XC_MethodHook() { Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { // 4. 方法执行后检查参数 // 将参数数组转为字符串方便日志输出和判断 String argsStr Arrays.toString(param.args); XposedBridge.log([快手QUIC劫持] 方法被调用参数: argsStr); XposedBridge.log([快手QUIC劫持] 原返回值: param.getResult()); // 5. 关键判断如果参数中包含配置标识则进行替换 if (argsStr ! null argsStr.contains(cronetConfig)) { XposedBridge.log([快手QUIC劫持] 检测到cronetConfig开始替换...); // 这是我们构造的禁用QUIC的配置JSON字符串 String fakeConfig {\enable_quic\:false,\cdn_preresolver_ip_blacklist\:[\0.0.0.0\,\1.1.1.1\,\127.0.0.1\],\preconnect_num_streams\:1,\quic_idle_timeout_sec\:180,\quic_use_bbr\:false,\altsvc_broken_time_max\:600,\altsvc_broken_time_base\:60,\proxy_host_blacklist\:[\*\]}; // 替换方法的返回值 param.setResult(fakeConfig); XposedBridge.log([快手QUIC劫持] 配置已替换为禁用QUIC版本。); } } }); } else { XposedBridge.log([快手QUIC劫持] 未找到目标类可能类名已变更或版本不符。); } } }编译安装这个模块到手机在Xposed管理器如LSPosed中启用它并作用到快手App上。然后重启快手。查看Xposed日志如果看到成功的日志输出就说明Hook生效了。6. 配置代理环境让流量流向CharlesHook成功让快手降级到了HTTPS但流量还在手机内部。我们需要把它导出来到电脑上的抓包工具如Charles。这里推荐使用Postern这款App。它比单纯设置手机Wi-Fi代理更强大和稳定特别是可以处理一些不走系统代理的流量。设置步骤如下电脑端Charles准备确保Charles正在运行并记录下电脑的IP地址和代理端口默认8888。在Charles的Proxy - Proxy Settings中确保勾选了“Enable transparent HTTP proxying”。手机端Postern配置安装Postern进入主界面。进入“配置” - “代理规则”。点击右上角“”新建一条规则。规则类型选择“所有流量”。动作选择“通过代理”。代理这里需要先创建一个代理配置。点击“代理”字段选择“新建代理”。在代理配置页面类型选“HTTP/HTTPS”服务器填你电脑的IP地址端口填Charles的端口如8888。保存这个代理配置。回到规则页面选择刚创建的代理保存这条规则。启用Postern回到Postern主界面点击顶部的开关按钮启动VPN服务。此时手机会建立一个到Postern的本地VPN通道所有TCP流量现在包括快手的HTTPS流量都会被Postern接管并根据规则转发到你的Charles。这时打开快手App进行任意操作刷视频、看评论等。如果一切顺利你会在Charles的会话列表中看到大量来自快手域名的HTTPS请求。恭喜你抓包成功了7. 疑难杂症与排查指南实战过程中不可能一帆风顺我把自己踩过的坑和解决方案总结一下问题一Xposed模块不生效日志里找不到目标类。排查首先确认Xposed框架本身是否激活其他模块是否工作。然后检查Hook的包名是否正确快手可能有多个包名如主包、极速版等。最大的可能是类名或方法签名不对。你需要重新反编译对应版本的APK仔细确认。混淆后的类名a.b.c.d在不同版本间差异极大。问题二Hook生效了有日志但Charles还是抓不到包。排查检查Postern和Charles的连接在手机浏览器访问http://charlesproxy.com/getssl看看能否在Charles中抓到这次请求。如果抓不到说明代理设置有问题检查电脑防火墙、IP地址是否正确。检查证书HTTPS抓包需要安装Charles的根证书到手机系统信任区。确保你已经按照Charles的指引chls.pro/ssl在手机上安装并信任了证书。检查配置JSON重点确认cdn_preresolver_ip_blacklist和proxy_host_blacklist是否已正确设置。可以尝试将黑名单IP范围扩大。尝试其他代理模式在Postern的代理规则里可以尝试将“所有流量”改为更具体的规则比如目标地址包含快手域名的流量。问题三App出现网络错误或崩溃。排查这通常是因为我们替换的配置JSON不完整或格式错误与App期待的结构不符。确保你的JSON格式完全正确没有缺少必要的逗号或引号。可以尝试先Hook但不修改返回值只打印日志看看原始的配置JSON长什么样然后模仿它的结构进行修改只改动enable_quic等关键字段。这个过程确实需要一些耐心和调试但一旦跑通你会发现之前加密的、不可见的网络交互都清晰地展现在面前对于分析接口、理解App行为有巨大帮助。记住逆向工程就像解谜每一步的验证和日志输出都是你最重要的线索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2408286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…