一、前言
一般大多数网站、APP最常用的是http、https协议,而某两款最火的短视频dy(某音)、ks(某手)最新版使用的是quic协议(见附录1),导致fiddler和charles无法直接抓到包(某手7版本以下可以直接抓到包)。
网上有说用fiddler + xposed + justTrustMe能绕过某音的sslpinning,呵呵,别傻了好不好,dy(某音)、ks(某手)用的是非系统的sslpinning技术,使用那个方案只能绕过Java层的sslpinning,而dy(某音)、ks(某手)的sslpinning是在so层,根本行不通的好吧!不要再误人子弟了!(此方案亲测无用)
而我给大家带来的最常用一种方案(亲测可行),主要思路是禁用或者绕过quic相关的so加载,迫使它走https协议。某手的相关so文件是libconnection**.so ,接下来看方案准备前的环节。
二、方案
方案前准备
将抓包工具证书转换并添加到Android系统证书。今天我们用的抓包工具是charles、模拟器是夜神模拟器,首先需要做的是将Charles证书转换并添加到Android系统证书,方便HTTPS抓包。(Android 7.0以上版本必须要把证书添加到系统信任区,否则无法抓取https请求)。
具体步骤教程看:
https://blog.csdn.net/m0_59683157/article/details/122812586
其中openssl需要单独下载安装,下载安装教程看: https://blog.csdn.net/houjixin/article/details/25806151
方案(一):安装xposed插件,绕过quic协议
1、下载安装xposed。在模拟器中xposed下载安装教程:https://baijiahao.baidu.com/s?id=1720356526386732365&wfr=spider&for=pc
2、xposed插件安装
(1)下载安装AndroidStudio,到官网下载安装即可
(2)用AndroidStudio搭建xposed环境,demo编写教程:https://blog.csdn.net/qq_39551311/article/details/119826692
(3)编写ks(某手)的xposed插件(在hook代码主体部分替换为如下代码):
XposedHelpers.findAndHookMethod("com.**.aegon.Aegon", lpparam.classLoader, "nativeUpdateConfig", String.class, String.class, new XC_MethodHook() {
@Override
protected void
beforeHookedMethod(MethodHookParam param) throws Throwable {
param.args[0] = "{\"enable_quic\": false, \"preconnect_num_streams\": 2, \"quic_idle_timeout_sec\": 180, \"quic_use_bbr\": true, \"altsvc_broken_time_max\": 600, \"altsvc_broken_time_base\": 60, \"proxy_host_blacklist\": []}";
}
});
3、最后用postern转发到抓包工具(某手app针对本地代理进行检测,所以需要用到代理转发工具进行代理转发)
(1) postern下载地址:https://github.com/postern-overwal/postern-stuff
(下载不了请联系我免费获取)
(2)postern使用教程:https://cloud.tencent.com/developer/article/1979022
方案(二):hook大法之Frida绕过quic协议
1、安装配置Frida教程:
https://blog.csdn.net/weixin_38819889/article/details/119845994
2、frida代码
import frida, sys
jscode = """
Java.perform(
function () {
var Aegon = Java.use('com.***.aegon.Aegon');
Aegon.nativeUpdateConfig.implementation = function (a,b) {
a = '{"enable_quic":false,"preconnect_num_streams":2,"quic_idle_timeout_sec":180,"quic_use_bbr":true,"altsvc_broken_time_max":600,"altsvc_broken_time_base":60,"proxy_host_blacklist":[]}';
return this.nativeUpdateConfig(a,b);
}
}
);
"""
def message(message, data):
if message["type"] == "send":
print("[*] {0}".format(message["payload"]))
else:
print(message)
process = frida.get_remote_device().attach("com.*.*")
print("到这儿了")
script = process.create_script(jscode)
script.on("message", message)
script.load()
sys.stdin.read()
3、最后也还是要用postern转发到抓包工具
方案(三):直接用IDA反编译libconnection**.so文件,将ssl验证的地方修改
方案(四):直接用Frida来hook libconnection**.so文件,在验证sslpinning地方动态将值改为0即可
三、结语
上面第一、二种方案是最常用处理quic协议的方案,两种方案原理一样,实现不同,尤其推荐第一种,因为用Frida进行hook的时候需要把握住hook时机。
另外还可以直接到so层修改sslpinning的代码,有兴趣的同学可以自行学习,本文不做拓展。上篇介绍了dy(某音)的抓包,和某手抓包方案基本一致,有兴趣的可以一起研究。由于篇幅原因,只介绍大概流程,不详细介绍
注:这里的逆向技术仅用于学习、研究,不可用于商用或者违法用途,另外本文章属于原创,原创不易,请各位转发的时候也请注明转发地址,否则一旦发现,后果自负,谢谢各位观看。
四、附录
(一)Quic协议
QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP、TLS、HTTP/2等协议的可靠性与安全性,可以有效减少连接与传输延迟,更好地应对当前传输层与应用层的挑战。)