快手__nsTokensig和sig签名算法分析

一、__nstokensig签名

最近在学习android逆向,不足之处欢迎大佬多多指点。
这次分析的是快手极速版1.2.2.8,使用Fiddler抓包发现有2个签名,一个是__nstokensig和sig。

通过jadx-gui搜索字符串找到nstokensig算法,只在java层
快手__nsTokensig和sig签名算法分析_第1张图片快手__nsTokensig和sig签名算法分析_第2张图片

这里我就不继续往下跟e.a了,实际上他就是判断编码的操作。通过上面第一层发现,是传递str和str2进行签名,接下来我们hook一下他的传参数据。
快手__nsTokensig和sig签名算法分析_第3张图片
通过xposed hook观测得知,str是sig签名结果,str2是kuaishou.api_client_salt,也就是在快手登录之后返回的一个值,这个值后续包是抓不到的。只有登录的时候才有。

得到传参后,我们回到刚刚的第二层,发现他先用 sha-256 计算之后,还调用了d.a(),我们跟进去看即可拿到java层算法,直接抠出来即可。
快手__nsTokensig和sig签名算法分析_第4张图片

以下就是扣好的nstokensig签名

// An highlighted block
   public String getNsTokenSig(String sig,String token) throws NoSuchAlgorithmException {
        String str2 = sig+token;
        return new String(b(MessageDigest.getInstance("SHA-256").digest(str2.getBytes())));
    }

    private static char[] b(byte[] bArr) {
        char[] b = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        char[] cArr = b;
        int length = bArr.length;
        char[] cArr2 = new char[(length << 1)];
        int i = 0;
        for (int i2 = 0; i2 < length; i2++) {
            int i3 = i + 1;
            cArr2[i] = cArr[(bArr[i2] & 240) >>> 4];
            i = i3 + 1;
            cArr2[i3] = cArr[bArr[i2] & 15];
        }
        return cArr2;
    }

二、sig签名

sig签名之前看到是在so层,能力有限没有把so层还原成java代码,最终我只能通过unidbg或者xposed直接调用so,那么我们先看看sig签名都传递了什么参数,直接先继续搜索关键字"sig"

快手__nsTokensig和sig签名算法分析_第5张图片
CPU.a() 就是计算sig,那么一共3个参数,第一个是Context,第二个是byte[],第三个是int
第一个和第三个都知道具体的结果,我们只需要关心第二个即可,我们发现他是通过合并2个map最后链接成字符串转成byte[],只需要关心a.b()里面干的事情即可。

快手__nsTokensig和sig签名算法分析_第6张图片
这个比前面的签名更加简单,就是将map链接道一块儿,然后sort重新排序一下,那么接下来直接xposedhook来得到他传递的参数值。
快手__nsTokensig和sig签名算法分析_第7张图片
通过2个map得知,第一个是url的参数,第二个是post的参数,也就是他是将2个参数衔接在了一起,那么这里贴一下map合并的代码。

    public byte[] encode(String url,String post){
        String[] url_arr = url.substring(url.indexOf("?")+1,url.length()).split("&");
        String[] post_arr = post.split("&");

        ArrayList arrayList = new ArrayList(url_arr.length+post_arr.length);
        for(int i=0;i<url_arr.length;i++){
            arrayList.add(url_arr[i]);
        }

        for(int i=0;i<post_arr.length;i++){
            arrayList.add(post_arr[i]);
        }
        Collections.sort(arrayList);
        byte[] data = null;
        try {
            System.out.println(TextUtils.join("",arrayList));
            data = TextUtils.join("",arrayList).getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return data;
    }

只需要提供url和post即可处理好了,那么最好我们只需要通过xposed来调用so函数即可。
在这里插入图片描述

你可能感兴趣的:(android安全)