网易云剽窃教程

前言

又到了一个学期结束的时候,按照我专业的传统历史,课设无非是又是开发个web应用,真够无聊的。只不过这次是把web引用变成了app。于是我觉得做一个音乐播放器,无奈没有音乐资源,于是想到了剽窃网易云,嗯!我懂。。。弟弟行为

网易云把数据加密了,所以本教程为了解密需要以下工具

  • chrome
  • fiddler
  • 记事本
  • nodeJS环境

抓包

搜狗截图20190630160543.png

我们可以看见这个post请求的两个参数分别是paramsencSecKey,显然这个数据被加密了,于是顺藤摸瓜,我们查看调用这个post请求的js文件

从initiator发现这个post请求是从core_b5ab1dc….js?b5ab1dc…:21这个js文件发送出去的。点下它,发现它是位于s3.music.162.net目录下资源。为了方便观看代码,我们复制出来将其格式化。

提取关键代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(function() {
var c9h = NEJ.P,
er1x = c9h("nej.g"),
v9m = c9h("nej.j"),
k9b = c9h("nej.u"),
VM4Q = c9h("nm.x.ek"),
l9c = c9h("nm.x");
if (v9m.bl9c.redefine) return;
window.GEnc = true;
var bkY8Q = function(cHA7t) {
var m9d = [];
k9b.be9V(cHA7t,
function(cHy7r) {
m9d.push(VM4Q.emj[cHy7r])
});
return m9d.join("")
};
var cHx7q = v9m.bl9c;
v9m.bl9c = function(Y9P, e9f) {
var i9b = {},
e9f = NEJ.X({},
e9f),
mo3x = Y9P.indexOf("?");
if (window.GEnc && /(^|\.com)\/api/.test(Y9P) && !(e9f.headers && e9f.headers[er1x.zG7z] == er1x.JJ0x) && !e9f.noEnc) {
if (mo3x != -1) {
i9b = k9b.gZ1x(Y9P.substring(mo3x + 1));
Y9P = Y9P.substring(0, mo3x)
}
if (e9f.query) {
i9b = NEJ.X(i9b, k9b.fP1x(e9f.query) ? k9b.gZ1x(e9f.query) : e9f.query)
}
if (e9f.data) {
i9b = NEJ.X(i9b, k9b.fP1x(e9f.data) ? k9b.gZ1x(e9f.data) : e9f.data)
}
i9b["csrf_token"] = v9m.gN1x("__csrf");
Y9P = Y9P.replace("api", "weapi");
e9f.method = "post";
delete e9f.query;
var bYc9T = window.asrsea(JSON.stringify(i9b), bkY8Q(["流泪", "强"]), bkY8Q(VM4Q.md), bkY8Q(["爱心", "女孩", "惊恐", "大笑"]));
e9f.data = k9b.cz0x({
params: bYc9T.encText,
encSecKey: bYc9T.encSecKey
})
}
cHx7q(Y9P, e9f)
};
v9m.bl9c.redefine = true
})();

可以看见,bYc9T来源于window.asrsea()这个函数

可以看到这个window.asrsea()函数的四个参数分别是 1. JSON.stringify(i9b),2. bkY8Q([“流泪”, “强”]), 3. bkY8Q(VM4Q.md),4. bkY8Q([“爱心”, “女孩”, “惊恐”, “大笑”])

显然,我们需要替换js文件将这四个参数打印出来

fiddler替换js文件

我们需要将网络上的js文件替换成本地的js文件,这样我们才能打印参数。

第一步,修改本地代码,加入如下代码

1
console.log(JSON.stringify(i9b)+"--------"+bkY8Q(["流泪", "强"])+"------"+bkY8Q(VM4Q.md)+"-------------"+bkY8Q(["爱心", "女孩", "惊恐", "大笑"]));

第二步,打开fiddler,菜单 –> Rules –> Customize Rules –> add Rules

搜狗截图20190630164837.png

ok,完成。于是我们打开console就能看见我们打印出来的参数了

1
{"s":"周杰伦","limit":"8","csrf_token":""}--------010001------00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7-------------0CoJUm6Qyw8W8jud

不难发现 参数如此简单,后三个不变,第一个就是我们要搜索的内容
知道了参数,剩下的就是解决加密函数了。

加密函数

通过搜索windows.asrsea函数得到如下结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
!
function() {
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
}
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)
}
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
}
function e(a, b, d, e) {
var f = {};
return f.encText = c(a + e, b, d),
f
}
window.asrsea = d,
window.ecnonasr = e
} ();

可以看到encText是AES加密的,encSecKey是rsa加密的。然而好像知道也没什么卵用。。。于是我们强上,直接复制代码,自己跑,当然需要解决函数依赖问题,这个得自己慢慢解决了,当然也可以直接参考我的代码。

Github链接

结果测试

搜索冒险岛
搜狗截图20190630171642.png
搜狗截图20190630171651.png
完美!perfect!

坚持原创技术分享,您的支持将鼓励我继续创作!