现在的天气是真的越来越暖和,太容易口渴了,索性拿出裤兜的几块钱买杯凉饮喝喝吧!那不说来就来了。
今天分析的app是 6Jyc6Zuq5Yaw5Z+OYXBwLXYxLjIuMA==,安装包百度一下即可。
1.先抓个包
没错,今天要分析的是这个"sign"
字段,"t"是一个时间戳,所以每次请求加密肯定都是变化的。
2.jadx静态分析
拿出我们的jadx,不管三七二十一,直接把这个app给它反编译了,因为我这是低版本的所以没有壳,最新版本的好像有一个奇虎360的壳,但是不重要直接上fart脱壳机就可以。
此处就省略了。
全局搜索下,可以看到符合条件就没几个,那就一个个的点进去看看。
这里直接来到hashMap.put("sign", d.a(hashMap));
,感觉很像的样子。
大概看了下就是声明一个hashMap,然后分别添加ax.az, "appId", "sign",ax.az
是个啥点进去看下原来就是时间戳"t"啊,这和抓包看到的请求体一模一样啊
这里sign = d.a(map)
,跟进去看看。
静态分析下,a()方法内部大概就是把传递的map类型参数,拼接成一个string,之后调用b()方法。b()方法内部用到SHA256withRSA
算法先做一层加密,最后再来base64加密。
对该算法不了解,可以参考下文章:python rsa加解密
所以关键点在b()
方法,只需要hook就可以。分析差不多了,上frida动态调试下。
3.frida动态调试
打开frida服务,运行命令:
frida -U com.mxbc.mxsa -l mixue_hook.js
hook代码如下:
Java.perform(function (){
var d = Java.use("com.mxbc.mxsa.network.feima.d");
d.b.implementation = function (str1) {
console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
console.log(`d.b方法被调用`);
console.log("d.b-参数:" + str1);
var result = d.b(str1);
console.log(`d.b加密后的数据:${result}`);
console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
return result;
};
})
看看跑出来是个啥?
入参和返回值也知道了,感觉像是一个标准rsa的算法,但是秘钥不知道是啥?
咋办 继续hook啊。
看样子c
就是秘钥,里面用到base64了,hook 下base64试一试?
var base64 = Java.use("android.util.Base64");
base64.decode.overload('java.lang.String', 'int').implementation = function (a,b){
console.log(`base64.decode方法被调用`);
console.log("base64-参数 a=" + a, "b=" + b);
var result = this.decode(a, b);
console.log(`base64-result:${result}`);
return result;
};
运行下看看:
还真的把私钥hook出来了。
最后一步,当然是还原成纯python了。
数据能跑出来,说明加密构造对了,完事,手工。