关于某 App 请求参数 sign 字段加密分析

受害者:

6ZqG5LyX5pWw5o2u

通过 Charles 抓包发现关键信息请求均携带 sign 参数,且每次请求的值都不一样:

image-20210310150053501

使用 jadx 将对应的 apk 反编译并分析,全局搜素 "sign" 关键字没有相关结果。通过生成的代码文件结构大概可以判断该 apk 使用了 360 加固:

image-20210310150633912

通过 FDex2 获取响应的 dex 文件,再次使用 jadx 打开,搜索关键 "sign" 即可出现结果。

耐心分析即可将代码定位到实现加密的地方:

long a = DateUtils.m18817a();
request.headers("timestamp", String.valueOf(a));
request.headers("sign", Tools.m20203a(a, request.getBaseUrl()));

m20203a 方法定义如下:

 public static String m20203a(long j, String str) {
        HashMap hashMap = new HashMap();
        hashMap.put("timestamp", String.valueOf(j));  
        hashMap.put("path", str.substring(27, str.length()));  
        hashMap.put("version", "1.0.0");
        StringBuffer stringBuffer = new StringBuffer();  
        for (Map.Entry entry : m20205a((Map) hashMap).entrySet()) {
            stringBuffer.append(entry.getKey());
            stringBuffer.append(entry.getValue());
        }
        stringBuffer.append("FA0338436BFA405CAE9161748831F40B");
        return MD5Util.m18744b(stringBuffer.toString().trim().getBytes()).toUpperCase(Locale.CHINA);
    }

到此加密逻辑就显现了,即通过对请求的 URL 的一部分、当前时间戳和版本号加上指定字符做哈希处理。

对于 java 不太了解的情况下,也可以将相关代码抠出来,放到新的 java 文件中,编译后通过 python 执行终端命令运行对应的 java 类即可获取加密的结果。

你可能感兴趣的:(关于某 App 请求参数 sign 字段加密分析)