- 点音app最新版本
- 留学中介一般要收多少钱?
- 2023 年搜索引擎优化的 8 个最佳关键词研究工具(比较)
- 中国产业结构优化与升级的路径
- 出国旅游常用英语单词和短语,收藏后可以大胆走出国门旅游啦
- 抖音20.1.0版本
邮箱:demo@eyoucms.com
手机:13900001111
电话:400-123-4567
地址:广东省广州市天河区某某科技园
某音短视频APP 最新版(21.8)SSL PINNING 绕过
本文主要讲解在短视频APP上逆向抓包遇到的坑,通过本文方法可以顺利使用抓包工具抓到数据包,也可以通过文中介绍的获取proto文件的方法,使用编程语言解析数据包中的内容。
文末还会提供编译好的proto类,可以直接解析response。
一般抓包都是采用中间人的方式,即在客户端用户与网站服务器中间,安插一个代理。所有客户端发送的包与服务器返回的包都经过这个中间人代理转发。
对于https的应用,需要伪造信任证书,对客户端充当服务器,对服务器充当客户端。
开始下载了5.0版的安卓模拟器,下载了比较旧的某音APP 17.3版本,发现是可以抓到包的,但是无法登陆,提示版本过低。所以只能升级APP版本,但升级到最新版发现之前的抓包工具无法抓到包了,提示 SSL Handshake Failed。
[SSL Pinning]分为两种:
- Certificate Pinning(证书锁定)证书锁定即APP仅接受指定域名的证书,而不接受其他任何证书。
- Public Key Pinning(公钥锁定)公钥锁定则是提取证书中的公钥并内置到移动端APP中,通过与服务器对比公钥值来验证连接的合法性。
在Android N(Android 7.0 API 24)及以后版本,由CA权威机构签发的证书,其根证书都内置在最新的[Android操作系统]中,因此默认情况下可不进行SSL证书锁定。因此该版本之前的安全性设置仍然需要使用证书锁定方法,即自建证书在客户端强制判断,以达到防止中间人攻击(MITM)的目的。
客户端在收到服务器的证书后,对该证书进行强校验,验证该证书是不是客户端承认的证书,如果不是,则直接断开连接。所以会出现 SSL Handshake Failed 的情况。想破解客户端证书锁定有以下几种方式:
- 将证书安装到系统证书中
- xposed(virtualxposed) 及其插件 [JustTrustMe]
- 修改app中的证书判断源码
- 使用动态插桩框架如Frida、Unidbg
系统证书
如果是安卓7以上,因为有系统功能限制,可以尝试将mitm证书安装到系统目录。
系统证书的目录是:
每个证书的命名规则为:
<Certificate_Hash> 表示证书文件的 hash 值, 是为了防止证书文件的 hash 值一致而增加的后缀;
证书的 hash 值可以由命令计算出来,在终端输入 ,其中 <Certificate_File> 为证书路径,将证书重命名为 hash.0 放入系统证书目录,之后你就可以正常抓包了。
抖音是使用自建证书,此方法无效
Xposed
Xposed框架是一套开源的、在Android root模式下运行的框架,它可以在不修改APP源码的情况下通过Hook方式去影响程序的运行。
JustTrustMe 是一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。JustTrustMe 是将 APK 中所有已知用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查。
安装xposed需要root手机,且安装繁琐,启动APP时需要同时启动该框架。
但是抖音是采用自建证书来实现,JustTrustMe内置方法无法匹配到关键函数名。
修改用于证书校验的native层
使用IDA PRO打开so文件,通过搜索cert等关键字,一顿搜索之后发现。看返回值是1,但是经过查阅发现 返回值为0的时候才是 ssl_verify_ok
所以我们动下小手给他改成0,然后apply patchs,将so文件保存。
然后把修改过的so复制到你的安卓手机上,这种方案,手机必须ROOT,因为我们要替换lib下面的libsscronet.so,修改一下文件权限重启APP即可抓包
替换so文件
联想模拟器:adb connect 127.0.0.1:11509
mumu模拟器:adb connect 127.0.0.1:7555
拿到数据包之后发现里面文字显示都不正常,通过请求头发现,原来使用的谷歌的protobuf协议,类似json和xml用于两端数据传输,因为protobuf更节省空间,传输过程中将变量名省略,变量名都以文件的方式存储在服务器和客户端上,所以我们需要使用Python的
blackboxprotobuf库来解析。
或者也可以使用官方protoc解析。需要先下载[protoc]
但是以上方法均不能拿到对应键值,取数据时比较麻烦。
逆向获取proto
方法来源于这个帖子[抖音直播间弹幕protocbuf分析]
首先用jadx反编译apk包。因为某音最新版(21.8)安装包较大。本人的16G机器hold不住。所以本人用的是低版本的apk包(之后借用了公司服务器,将反编译代码下载下来了,这里可以提供下载地址)。反编译后通过搜索抓包抓到的接口地址。
之后查看这个类,需要的字段以及类型都在这里了。13.9版本的proto文件都在这个文件夹里,提取会很方便 。
后来拥有了大内存的机器,又尝试反编译了一下21.8版本的,大概需要使用40g的内存才能反编译完成。可以搜索encodeWithTag来找到encode()函数,我们发现proto文件分散到各个文件夹中了。寻找起来可能有点麻烦,但是提取的方法还是一样,没有变化。
之后就是通过该proto文件生成对应语言的版本。我这里用的是Python,于是使用该命令生成Python文件
然后使用该文件解析请求返回的数据。
proto与blackboxprotobuf
blackboxprotobuf是个不错的开源库,但是解析的速度与可靠性有些问题,通过对同一个文件的解析,做个对比。
blackboxprotobuf
proto
那是因为 blackboxprotobuf 在内部是使用递归的方式,逐步猜测要解析数据的类型格式。一不小心就会陷入循环中。。
至此,可以成功采集并解析数据包了。
这里放我生成好的proto解析代码,直接导入项目即可使用
-
2018-05-18CMS是如何应运而生的?
-
2018-05-18网站建设,静态页面和动态页面如何选择
-
2018-05-18网站建设的五大核心要素
-
2018-05-17一文读懂互联网女皇和她的报告:互联网领域的投资圣经、选股指南
-
2018-05-17新手科普文!什么是用户界面和体验设计?
-
2018-05-17用户界面设计和体验设计的差别