前言:一篇入门级别的加解密hook文章。
安卓测试机:一加6(Kali Nethunter) Frida版本:14.2.7 反编译工具:jadx
r0capture:https://github.com/r0ysue/r0capture
1、通过 r0capture 输出堆栈内容如下:
2、jadx 搜索关键字“cn.com.hybird.http.HttpsClient”,根据搜索结果,需要关注就两个地方:“cn.com.hybird.http.HttpsClient”和“cn.com.xxxxx.main.base.BaseActivity”。
3、先看“cn.com.xxxx.main.base.BaseActivity”的内容,关键就是HttpsClient.getResObject(url, "POST", BaseActivity.this.postEncryption(url, map, key))
4、这里需要拆分两个部分进行分析:
BaseActivity.this.postEncryption(String url, Map<String, String> map, String key) /* 应该是加密方法 */
HttpsClient.getResObject(String url, String type, Map<String, String> map)
/* 应该是数据请求方法*/
5、先看看BaseActivity.this.postEncryption(String url, Map<String, String> map, String key)
,这里定义了post数据的加密方式,需要传入三个参数,第一个是URL链接,第二个明文数据内容,第三个加密key。
RSA
的公钥信息通过Base64Coder.encodeString()
和EncodeFrontPubKey.rsaGetPublicKey()
进行编码加密,而数据包明文信息通过SHA512.SHA512Encrypt()
和AESUtil.encrypt()
进行数据加密,最后返回加密后数据。
6、接着看看HttpsClient.getResObject(String url, String type, Map<String, String> map)
,这里需要传递三个参数,第一个参数是URL链接,第二个参数是请求方法,第三个是数据包内容。
最后函数直接返回了post()
的内容。而post()
方法主要执行sendInitialization(url, postorget, encodeParameters(params))
。
7、继续跟进sendInitialization(String urlPath, String type, byte[] data)
,其实这里功能主要就是对“get”或“post”请求类型进行判断,然后构造数据包。
8、因此现在思路已经很清晰了,post方法中需要传入“data”参数,参数的值是加密过后的数据内容,而get方法中不需要传入“data”参数。
因此可以判断只要是post请求的数据都经过加密处理,处理数据加密的位置为:
9、找到cn.com.core.util.crypto.AESUtil
文件,可以看到这里采用aes加密,通过hook encrypy方法,打印出参数“content”的内容就是http请求包中的明文数据,通过hook decrypt方法就可以实现对http响应包中数据解密。
10、cn.com.core.util.crypto.SHA512
文件采用SHA512哈希加密,hook原理同上。
11、最后frida hook 脚本可以写成如下:
12、注入脚本,获取明文请求信息。