一,校验的原理
下图为HTTP协议的请求过程:传输过程中都是明文数据
下图为HTTPS协议的请求过程:
注意:公钥加密的数据只能通过对应的私钥才能解密,就算是进行加密的公钥也不能进行解密。
上述的请求过程看似复杂,实际就是两部分:
- 通过公钥与私钥同步对称密钥
- 使用对称密钥对传输数据进行加密
加入charles后的流程如下:
对于HTTP请求,charles不需要做什么配置,即可抓到包。
对于HTTPS请求,charles如果不进行设置,抓到的包是经过了加密的。如果想进行解密,就需要得到对称密钥,而获得对称密钥的方法通过charles抓包是实现不了的。要想获得对称密钥,charles就需要构造自己的公钥和私钥替换服务端的公钥和私钥与客户端发送数据,因此还需要在手机上安装charles的证书/公钥。
对于客户端验证,与HTTPS的请求过程相比,增加了客户端对公钥的判断。在app中会预留一个证书/公钥,这个证书/公钥就会用于判断是否公钥是被信任的。
当charles未解决客户端证书校验时,现象是app中加载不出来信息,charles可以抓到包,响应状态码是200,但就是获取不到最终的结果,报错信息一般和 SSL Pining(证书锁定) 有关。
二,绕过的方法
了解了以上内容,如何进行客户端证书校验的绕过呢?
**本质上是去修改客户端进行证书校验的代码。**在形式上有几种方法:
- 可以直接hook某些用于校验证书的API,不管证书是否可信,都直接返回true,从而绕过校验。可以利用Xposed、Fride等工具,基于它们实现hook操作。
- 通过反编译的方式还原App代码,修改AndroidManifest.xml文件或者代码中用于校验证书的逻辑,修改后重新打包签名。不过由于App打码不好完全还原,该方法的可行度并不高。
2.1 frida hook
hook的关键是找到验证的函数位置,这个位置搞开发的了解,但我不知道。不过,网上有写好的hook脚本可以拿来直接用,hook脚本有很多,这里介绍两个:
1:https://codeshare.frida.re/@akabe1/frida-multiple-unpinning/
2:https://github.com/WooyunDota/DroidSSLUnpinning/blob/master/ObjectionUnpinningPlus/hooks.js
将里面的内容复制放在一个 hook.js 文件中,运行下面的脚本,即可完成对客户端证书校验的绕过顺利抓取到有效的信息:
frida -U -f APP包名 -l hook.js
2.2 Xposed + justtrustme.apk
Frida框架是写JavaScript代码,Xposed框架是写Java代码,justtrustme.apk 本质上是xposed的Hook脚本,只不过可以打包安装在手机直接运行。
操作步骤:
- 安装 Magisk 面具(手机root)
- 在面具中刷入 LSPosed框架
- 安装 JustTrustMe
- 在LSPosed框架中配置并启动 JustTrustMe
2.2.1 Magisk面具
请根据自己手机的机型去root并安装面具,参考链接:
https://www.bilibili.com/video/BV1Ly4y1u7YE/
https://www.bilibili.com/video/BV1er4y1C7wU
https://magiskcn.com/
提示:后续的操作均使用的Magisk面具 24.0 版本。
2.2.2 刷入LSPosed
-
Riru-LSPosed
- 先刷Riru https://github.com/RikkaApps/Riru/releases - 在刷Riru-LSPosed https://github.com/LSPosed/LSPosed/releases
-
Zygisk-LSPosed(推荐)
- 刷Zygisk-LSPosed https://github.com/LSPosed/LSPosed/releases
注意:在面具中可以根据是否开启 Zygisk,来切换和生效。
示例1:红米8A
问题:LSPosed无图标
刷入成功后,就可以看到 LSPosed 的图标,如果没有出现的话,就去手机的 /data/adb/lspd/
目录下找apk包,然后再点击安装即可。
问题:LSPosed未激活
正常安装完LSPosed会直接激活,如果LSPosed显示未激活,请点击 图1 中Magisk安装,根据步骤点击安装,之后LSPosed就可以激活了。