失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Python爬虫:浅谈【破解某易云音乐加密-JS逆向】

Python爬虫:浅谈【破解某易云音乐加密-JS逆向】

时间:2019-03-04 06:19:25

相关推荐

Python爬虫:浅谈【破解某易云音乐加密-JS逆向】

网页及JS代码分析

我们这里直接进入某易云音乐官网,然后进入到任意一首歌曲的详情页,并进行分析。如下图:

由于我们之前分析过网页的数据构成,所以这里不再赘述。直接点进R_SO_4_1446235247?csrf_token=,往下翻,可以看到paramsencSecKey两个加密参数,如图:

这就是我们这次破解的目标。点击Initiator。

然后可以看到调用的JS文件。如下图:

选择点击一个出现次数较多的。(这里无法确定点击哪一个,需要尝试。)点击进入后点击左下角的花括号对代码进行格式化处理。如图所示:

然后我们在这里面搜索第一个加密参数:params,如图:

可以看到这里params出现了37次,我们需要一个一个的找,最后在第六次出现的位置发现了疑似的目标参数。如下图:

我们猜测这里就是加密的数据,在13091行打断点,然后刷新调试一下。结果如图:

至此,可以基本确定这就是我们需要的数据。接下来就是对其来源进行分析。由代码中可以看到,这两个数据是从bYf7Y中取出来的。而上面的代码写了var bYf7Y = window.asrsea(JSON.stringify(i9b), bqR9I(["流泪", "强"]), bqR9I(QM2x.md), bqR9I(["爱心", "女孩", "惊恐", "大笑"]));。所以应该追溯到window.asrsea函数去查看。我们全局搜索,结果如图:

该语句出现两次,则肯定是一次定义一次调用。我们直接看函数的语句,如图:

追溯到d函数,语句如图:

d函数接收四个参数,我们调用的时候也是传递四个参数,确定就是这个函数。对参数进行分析。在12964行打一个断点,翻页进行调试:

可以看到d参数是和歌曲id有关的一系列语句,后面的猜测是当前页的标识与每页偏移量(可以后续进行证实),而其他的三个参数在调用的时候都是常量,我们需要切换到其他的歌曲进行判断,最终发现他们三个都是常量。这样我们就可以把代码复制到本地进行调试了。

代码编写

在本地新建一个名为Music163.js的文件,然后把之前的有效代码复制进去,并进行一些必要的修改。修改后的代码如下:

!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}();function start() {var d = {"rid": "R_SO_4_1446235247", "offset": "20", "total": "false", "limit": "20", "csrf_token": ""};var e = "010001";var f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7";var g = "0CoJUm6Qyw8W8jud";var bYf7Y = window.asrsea(JSON.stringify(d), e, f, g);var data = {params: bYf7Y.encText,encSecKey: bYf7Y.encSecKey}return data;}

把固定的参数写成常量,调用的时候直接写名称即可。并且删除了window。最终返回需要的数据。在本地新建一个Music163.py文件,调用刚才的js代码。Python代码如下:

import execjsjs = open('./Music163.js', 'r').read()ext = pile(js)result = ext.call('start')print(result)

运行会报如下的错误:

提示缺少一个函数,我们则去源码中找到这个参数放进来,就这样一步一步的走,直到最终结果出来。提示:下方代码较多,可以直接去项目地址下载源码。友情提示:配合视频食用更佳哦!

如果觉得《Python爬虫:浅谈【破解某易云音乐加密-JS逆向】》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。