某品会app逆向—so文件逆向
逆向目标:请求头authorization参数
1、jadx参数来源分析
我们直接打开jadx搜索OAuth api_sign关键字
直接进入关键加密位置
直接找到str的赋值位置
追到最里层发现sign的值是通过这个gs方法返回的
我们分析一下这个gs方法,它这里是通过invoke进行调用, 在 Java 中,invoke 是反射机制中的一个方法,用于调用某个对象的指定方法
1 | gsMethod = clazz.getMethod("gs", Context.class, Map.class, String.class, Boolean.TYPE); |
- clazz保存的是类的地址
- object保存的是类实例的地址
- gsMethod用于获取clazz类的gs方法,然后通过invoke进行调用
那么我们需要找到object在哪赋值,我们直接往下看initInstance方法,发现object = cls.newInstance();
Class<?> cls = Class.forName(“com.vip.vcsp.KeyInfo”);
那么说明object是com.vip.vcsp.KeyInfo类的实例对象
那么实际上gs方法做的就是调用了com.vip.vcsp.KeyInfo类下面的gs方法,我们直接搜索com.vip.vcsp.KeyInfo
这里最终调用了gsNav,gsNav对象是一个native方法,那么我们就要开始分析so文件了
2、frida hook
hook gsNav方法
1 | function hook() { |
打印日志
1 | KeyInfo.gsNav is called: context=com.achievo.vipshop.common.VipApplicationLike@27bfb62, map=[object Object], str=null, z=false |
这里传入了一个context对象,map中存放的就是接口的表单数据,str是一个null,z是一个布尔值
gsNav方法是一个native方法,往上查找翻到它的加载的so文件为keyinfo
3、so文件分析
我们找到对应的so文件,并将so文件托入至ida中进行分析,这个so文件是一个armeabi-v7a架构的,需要使用32位的ida打开进行分析
进入到ida后直接搜索gsNav方法
这里返回的是v9,我们直接进入到v9赋值的方法中去
进到最里层的方法后,我们直接将这里的代码全选赋值给ai帮我们分析一下
发现会提取map中的key和value,将键值对转为key=value形式,用&连接,然后拼接字符串给j_getByteHash放方法计算哈希值,我们直接跟进j_getByteHash方法中
发现这里似乎用的是SHA1的算法,我们直接hook getByteHash方法,我们直接按住tab键查看该方法的地址值
1 | function hook_so() { |
由于是32位的架构,所以内存地址要+1
输出的日志结果:
1 | args1 --> ���(���� |
通过和抓包工具分析e585d05a1af08912261113f55822575b51f9acb6就是我们需要的值,args2是传入的明文值,我们分析这两个args2的值可以发现加密逻辑为:
- 提取map中的key和value,将键值对转为key=value形式,用&连接
- 将a84c5883206309ad076deea939e850dc和转换的map字符串进行拼接
- 拼接后通过标准的sha1算法进行一次加密得到结果
- 将a84c5883206309ad076deea939e850dc和第一次加密得到的字符串拼接再次进行sha1加密得到最终的值