前言:一篇简单入门级别的加解密hook文章。
转载自博主jammny文章https://www.yuque.com/jammny/ioh9u7/su23eg

#测试环境

安卓测试机:一加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、注入脚本