嗯,2021年快结束了,学习忙碌一年了,年底了写点文章,总结性学习成果吧!
今天我们要分析的app是6LSd5aOzdjIuNjYuMA==
(base64解码),小伙伴们可以去各大应用商定自行下载,也是一个很好的逆向分析案例。
转载文章,请注明出处,谢谢!https://blog.csdn.net/weixin_38819889/article/details/122058454
参考链接:https://core.vivcms.com/2021/10/25/637.html
1.抓包找参数
第一步,打开我们的charles直接抓包,发现这个时候没有抓到对应的包。好吧,那我们换一种vpn抓包的方式。先打开postern,然后再开启charles,这个时候就成功的抓到数据包了,如下图所示,Authorization
就是要分析研究的字段,经过多次的测试,发现其他字段可以去掉,但唯独这个字段是不能的。
2.反编译和静态分析
找到这个加密参数 Authorization
,接下来就是反编译apk,来把我们的贝壳app拖进去jadx里面,看看加密逻辑是咋写的。
搜索一波,感觉这里很像的样子map2.put("Authorization", getSignString(str3, null));
,点进去看一看。然后我们来到这里了,可以看到(下图)这里是调用一个getSignString()
方法,并传入参数str3 和null
,然后计算出结果当做Authorization
的值。
跟进去看看 getSignString()
方法是咋实现的,然后就来到了这里。
具体代码如下,没错,可以大胆的猜测下,这就是最核心的加密方法。首先,我们先静态分析一波逻辑,然后再用frida动态调试下,验证下我们的猜想对不对。
public String getSignString(String str, Map<String, String> map2) {
Map<String, String> urlParams = getUrlParams(str);
HashMap hashMap = new HashMap();
if (urlParams != null) {
hashMap.putAll(urlParams);
}
if (map2 != null) {
hashMap.putAll(map2);
}
ArrayList arrayList = new ArrayList(hashMap.entrySet());
Collections.sort(arrayList, new Comparator<Map.Entry<String, String>>() {
// from class: com.bk.base.netimpl.a.1
public int compare(Map.Entry<String, String> entry, Map.Entry<String, String> entry2) {
return entry.getKey().compareTo(entry2.getKey());
}
});
String httpAppSecret = ModuleRouterApi.MainRouterApi.getHttpAppSecret();
boolean notEmpty = Safe.C2266e.notEmpty(httpAppSecret);
String str2 = BuildConfig.FLAVOR;
if (!notEmpty)