admin管理员组

文章数量:1649931

最近在抓取QQ音乐歌手粉丝数量时,发现参数多了一个sign

如果不传这个参数返回的结果

所以用了2个多小时一直debug看了一下生成sign参数的源码

源码地址:https://y.qq/component/m/qmfe-security-sign/index.umd.js?max_age=2592000

刚开始我以为直接导入js,调用window.getSecuritySign(JSON.stringify(data)),可以直接获取sign,可是结果一直不正确。

我就想是不是源码里有什么比较,只让QQ音乐那边的页面返回正确结果,然后就开始了2个小时的debug

在此中间果然发现了蹊跷

后面继续debug

结果差不多已经出来了,QQ音乐那边 location.host = y.qq

又看到indexOf,后面肯定还有一个参数是y.qq

后面执行函数

 "y.qq"['indexOf'].apply('y.qq',['y.qq']) ---->放到浏览器跑一下 返回值为0

下一步

0 === -1 返回false,所以g[15] = false

下一步

到这里 如果是我们本地运行的话,h是会赋值为963的,而QQ音乐那边则还是934(h是l数组的下标,而l数组存储的数据是调用n这个方法数组对应的方法的,具体就是n[l[h]]()),这样导致我们本地运行出来结果是错误的

最后,一直debug会看到如何获取sign参数。

分析出来的代码:

    let str = 'abcdefghijklmnopqrstuvwxyz0123456789';
    let count = Math.floor(Math.random() * 7 + 10);
    let sign = 'zza';
    for(let i = 0; i < count ; i++){
        sign += str[Math.floor(Math.random() * 36)];
    }
    sign += window.__sign_hash_20200305('CJBPACrRuNy7'+JSON.stringify(data));

 data就是请求中data参数的值

目前基本上没有什么问题


对于__sign_hash_20200305()这个加密算法,看不太明白,只能借助着这个方法来生成sgin

本文标签: 参数音乐qqsign