接上节课内容

安卓逆向 -- Frida环境搭建(HOOK实例)

安卓逆向 -- FridaHook某车udid的加密值

安卓逆向 -- FridaHook分析3DES加密值

安卓逆向 -- SO文件逆向分析

一、上节课抓包有个sign值

安卓逆向 -- Frida Hook某车_sign算法分析_安卓逆向

二、用jadx打开,全局搜索"_sign",发现sign值都来自于toSign函数

安卓逆向 -- Frida Hook某车_sign算法分析_全局搜索_02

安卓逆向 -- Frida Hook某车_sign算法分析_全局搜索_03

三、查找toSign函数声明的地方

public static String toSign(Context context, Map<String, String> map) {
        if (map == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        sb.append(getSignKey(context));
        for (Map.Entry<String, String> entry : map.entrySet()) {
            sb.append(entry.getKey() + entry.getValue());
        }
        sb.append(getSignKey(context));
        return SecurityUtil.encodeMD5(sb.toString()).toUpperCase();
    }

四、经过分析最后结果来自encodeMD5函数,我们hook该函数

SecurityUtil["encodeMD5"].implementation = function (str) {
    console.log(`SecurityUtil.encodeMD5 is called: str=${str}`);
    let result = this["encodeMD5"](str);
    console.log(`SecurityUtil.encodeMD5 result=${result}`);
    return result;
};

五、查看运行结果,和抓的包一致,只是结果是小写,包里面是大写。所以sign就是上面一大堆参数进行拼接,然后再进行md5运算,最后再转为大写。

参数:W@oC!AH_6Ew1f6%8_appidatc.androidappversion3.16.1channelidcsypwde10adc3949ba59abbe56e057f20f883eudidEmf/VNnohOKgDGg18QXBQFFTz1pKemdyChiQd6+xw1FamdmTTwRuSA==username15836353612W@oC!AH_6Ew1f6%8
加密结果:a9b579e04e9c2ad64dfb3577e6b6d2fe