今天我们要分析的app 是某瓜数据, 版本号v1.4.7 ,小伙伴们可以去各大应用商定自行下载。
转载请注明出处:
https://blog.csdn.net/weixin_38819889/article/details/123847587
1.先来抓个包
经分析,该app没有壳,然后加密参数就是一个sign
,今天研究的重点就是看看sign值是咋生成的。
2.jadx静态分析
直接搜索"sign",在这里(builder2.addHeader("Sign", com.feigua.androiddy.b.a.a(hashMap, d2, currentTimeMillis + ""));
)就能看到很可疑的地方,然后点进去看看里面的代码 是个啥。
之后,来到这里了,代码截图如下:
在这里看到 使用new Request.Builder();
方法实例化了一个请求对象builder2
,然后builder2.addHeader()
,又不断添加几个请求头,其中有一个就是"sign"
参数,sign的值又是这个方法 com.feigua.androiddy.b.a.a(hashMap, d2, currentTimeMillis + "")
返回来的,没错这里就是真正的加密地方(ps:因为我提前确认过了)。
继续跟进去,看看com.feigua.androiddy.b.a.a()
方法咋实现的。
大致看了下java的伪代码,这里定义了一个a方法
,分别传入三个参数,一个是hashMap
,另外2个都是str字符串
。然后首先声明了一个stringBuffer
对象,然后拼接一个盐值,之后向hashmap添加了 SessionId
,Platform
和ts
时间戳,再之后把传入的参数排个序,拼接成个字符串,最后走了一个i.a(stringBuffer.toString())
方法。
这个i.a()
方法是个啥?跟进去看看,来到这里。
看关键词md5,很明显这就是md5加密,正好和抓包的sign=71340D7922D7B7BEC476F49F5AEEC32C
32位长度一致。
3. frida动态调试
打开frida服务,运行命令: frida -U com.feigua.androiddy -l hook_sign.js
js命令如下:
Java.perform(function(){
var a = Java.use('XXXXXXXXXXXX');
a.a.implementation = function(parm1, parm2, parm3){
console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
console.log("a方法参数1:", parm1);
var hashmap_str = "";
var it = parm1.keySet().iterator();
while(it.hasNext()){
var keystr = it.next().toString();
var valuestr = parm1.get(keystr).toString();
hashmap_str += keystr + "=" + valuestr + "&";
}
console.log("a方法参数1转str:", hashmap_str);
console.log("a方法参数2:", parm2);
console.log("a方法参数3:", parm3);
var result = this.a(parm1, parm2, parm3);
console.log("a方法加密结果:", result);
console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
return result
};
});
效果如下图所示:
处理的逻辑并不是很复杂,接下来python还原一下,响应数据也拿到手:
完事,手工,下一个。