首先在此声明,本文章仅仅用于研究学习,不可用于任何商业活动,否则后果自负。如侵权请与我联系,立即删除。
最近想做一个搜索歌词与歌曲的接口,自己平时使用。然后呢,就第一个反应是搞网抑云
的。
其实之前搞过网抑云的参数分析,不过已经时间久远了,不知道能不能用了,所以干脆就重新搞一下吧,我们话不多说,直接开搞。
这里我就以一个接口为例,其它的都是一样的方法。
这里以歌曲搜索接口为例。
还是老样子,打开开发者工具,然后开始抓包。然后找呀找呀找包包,最后会发现了一个包里面有我们要的数据
我们看一下接口
与接口参数
。
我们看接口参数的图片,经过多次刷新比较,发现csrf_token
一直是这样的,而params
与 encSecKey
是在一直变化的。因为返回的数据是json
格式,我们之间下一个xhr
断点。
这里我们在当前JS页面搜索参数encSecKey
与params
,这里搜索params
有很多,所以就搜索encSecKey
,它仅仅有3个,最后会发现两个参数在当前页面可以找到。
var bUM2x = window.asrsea(JSON.stringify(i0x), bsG5L(["流泪", "强"]), bsG5L(WW8O.md), bsG5L(["爱心", "女孩", "惊恐", "大笑"]));
e0x.data = j0x.cs1x({
params: bUM2x.encText,
encSecKey: bUM2x.encSecKey
})
我们可以看出参数params
与encSecKey
是来源于bUM2x
,所以我们就在var bUM2x = ...
打下断点。
在var bUM2x = ...
代码中有bsG5L(["流泪", "强"])
,bsG5L(WW8O.md)
,bsG5L(["爱心", "女孩", "惊恐", "大笑"])
,经过多次刷新对比,发现它们是不变的。本质上就是bsG5L
函数在计算值,而传入的数组的每一个元素都可以通过一个字典映射到对应的值。而JSON.stringify(i0x)
里面的i0x
是我们要的,其实在加密它。
我们接下来看一下window.asrsea
函数。
通过上图可以看到window.asrsea
就是d
函数我们看一下d
函数。
function d(d, e, f, g) {
var h = {
}
, i = a(16);
return h.encText = b(d, g),
h.encText = b(h.encText, i),
h.encSecKey = c(i, e, f),
h
}
这里我们可以看到encSecKey
参数,但没有params
参数,这个就不用管了,其实encText
就是params
,这个自己逆向一下就知道了。
其实到这里整个逆向分析差不多了,这个i = a(16)
就是一个随机函数。
function a(a) {
var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
for (d = 0; a > d; d += 1)
e = Math.random() * b.length,
e = Math.floor(e),
c += b.charAt(e);
return c
}
然后这里参数encText(params)
其实就是加密2次,第一次加密中参数d
就是i0x
,然后g
是固定值,而第二次加密中i
是随机值。
参数encSecKey
其实这个就是随机值i
与固定参数e
与f
被函数c
加密而生成。
这里函数c
与函数b
是其实是很熟悉的,我们来看一下。
function b(a, b) {
var c = CryptoJS.enc.Utf8.parse(b)
, d = CryptoJS.enc.Utf8.parse("0102030405060708")
, e = CryptoJS.enc.Utf8.parse(a)
, f = CryptoJS.AES.encrypt(e, c, {
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
}
function c(a, b, c) {
var d, e;
return setMaxDigits(131),
d = new RSAKeyPair(b,"",c),
e = encryptedString(d, a)
}
可以看出,函数b
就是AES
加密,函数c
就是RSA
加密。
这里整个分析流程就好了。
这里可以用python
写一下这个加密,当然也可以扣一下js
代码,这里我是扣的js
代码,
https://github.com/Esword618/jsCrack/tree/master/wangyiyun
这里仅仅展示的为歌词接口的。
https://music.163.com/weapi/song/lyric?csrf_token=
{
"id":歌曲id,"lv":-1,"tv":-1,"csrf_token":""}
https://music.163.com/weapi/cloudsearch/get/web
{
"hlpretag": "","hlposttag": "","s": "东西","type": "1","offset": "0","total": "true","limit": "30","csrf_token": ""}
其实这个还是非常的简单,我也终于时隔n个星期发了一篇正儿八经自己写的文章。
好了,我们本期就到这里了,我们下期再见!