q某音乐API接口分析--获取vKey和Sign

q某音乐API接口分析--获取vKey和Sign

在q某音乐网站中,想要获得一首歌曲的资源链接(必须要这两个参数vKey和Sign,破解有一定的难度)

步骤一:

F12打开开发者工具,在network中点击XHR,筛选ajxa请求(一般的数据请求都是使用ajax),这里这种数据都很简单,没有加密,没有sign(签名,口令等),不做分析

步骤二:

随便点击一个歌单,进入到歌单播放页面(https://y.qq.com/portal/player.html),右边红色圈圈里面的是歌曲的链接地址,一个一个试得出可以使用的地址在req_0.data.midurlinfo[0].purl

 

将purl拼接url直接访问可以歌曲资源:http://ws.stream.qqmusic.qq.com/C400001GV9Ix0NrZuz.m4a?guid=2849918000&vkey=D30AB7F58D1D6821C6ED837DEFF01E94DBEF70BD3FF0DD5090928E96130B93F59653E7CE4259B5244E9409FFD28745B326C8CE89FA138E2F&uin=0&fromtag=66

步骤三:

多次分析参数,发现该请求只有两个参数在变 signsongmid- 这个参数是个随机值,不变也可以。(逻辑关系,我们需要这两个参数才能得到vKey,歌曲资源链接是vKey和sign和歌曲songmid拼接组成,其它参数不变,如uin和guid)

步骤四:

我们再往前找,此时发现前面没有一个请求返回的数据跟sign的值一样,就说明sign不是由后端返回过来的,而是由前端js生成的。

这时我们ctrl+f进行关键词查找,搜索sign(关键词的选定需要根据经验来)

这里多次出现sign,说明有很大的可能性是我们要找的sign生成算法,然后打下断点看下结果。


这时我们在控制台输出这个函数,看一下返回的内容。发现正是我们需要的sign。

这时我们只需要把这个函数对应的代码复制下来,准备还原,控制台输出这个函数的代码:

多次断点发现,r(f, e, c, l, t)也是返回这个值。

通过对比,发现 sign 的位数不一样,且生成的签名串不一样,这时,我们进入到加密函数(getSecuritySign())内部,一步一步debug。

最后发现,它其实是动态的生成加密函数名,以及一个固定的加密串和随机函数。通过一个栈结构存储这些数据,并进行调用。

 

最终还原的代码如下所示:

这段代码由原网站复制得来,未改动

 动态生成的执行代码:

function getSign(data) {
  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 += global.__sign_hash_20200305('CJBPACrRuNy7'+JSON.stringify(data));
  return sign
}

执行结果如下:

与之前的结果进行比较发现后32位是一样的,证明我们的算法是没有问题的

然后再根据sign获得vKey,在purl前面加上域名就能播放歌曲:

 

 

 

 

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值