js解密剖析—爬虫之网易云音乐加密破解
栏目: JavaScript · 发布时间: 5年前
内容简介:网络爬虫的大障碍,就是各种加密。这其中包过登录的验证码以及加密。js混淆、js参数加密等等。其实以前也就了解过js加密。但是没有深入研究,借着这次实践研究了一下网易云音乐的加密方式。博主通过网易云音乐评论加密的实例来做个学习过程的分析和分享。如果有问题或者不懂的地方可以关注我的
网络爬虫的大障碍,就是各种加密。这其中包过登录的验证码以及加密。js混淆、js参数加密等等。其实以前也就了解过js加密。但是没有深入研究,借着这次实践研究了一下网易云音乐的加密方式。
博主通过网易云音乐评论加密的实例来做个学习过程的分析和分享。
如果有问题或者不懂的地方可以关注我的 微信公众号(bigsai)
,联系我。
技能点
- 前端:
js
知识(比较重要)、谷歌浏览器debug、抓包、打断点调试
能力(必须)。以及js各种加密函数(了解). - python:基础的请求
requests
。Crypto.Cipher
加密解密模块。 - 其他:postman(模拟请求使用),良好的思维能力和分析能力。(加密算法有些乱),还有一点就是
js加密转python
的代码实现。
界面概况
静态网页
对于一般的url随着页面的变化而变化的页面,网易云还是有的,你只需要抓取网页进行分析即可。
动态网页
但随着前后端分离的流行,以及数据分离好处明显。越来越多的数据采用ajax渲染。而网易云的评论即使如此。 在前后端分离刚火,那时很多网站对借口并没有太大的防护措施。就使得很多网站轻松获取结果。至今也有很多这样的借口存在,这种网站爬去就是傻瓜式爬取。
然而随着前段技术的发展,接口也变的越来越棘手。就拿网易云的评论来说:它的参数就让人很懵逼。
这一串串数字到底是啥。很多人见到这样的数据就会选择放弃。那么让我为你解开它什么的面纱
。
页面解析
step1: 找参数
你可以看的到,它的参数有两个,一个是 params
,一个是 encSecKey
并且都是经过加密的,我们就要分析它的 源头 。F12打开source 搜索encSckey
.
encSecKey
,发现原来在这里,经过断点调试发现这里就是最终参数的结果。
step2:分析js函数
这个js有4w多行,如何能在4w多行js中找到有用的信息,然后理清楚这里的思路呢?
这就需要你的抽象和逆向思维
了。来,咱么开始分析。
var bYc7V = window.asrsea(JSON.stringify(i3x), bkY2x(["流泪", "强"]), bkY2x(VM8E.md), bkY2x(["爱心", "女孩", "惊恐", "大笑"])); e3x.data = k4o.cz4D({ params: bYc7V.encText, encSecKey: bYc7V.encSecKey }) 复制代码
上面这段代码中就是来源,我们先不管这个 JSON.stringify(i3x)
这些参数是啥,先搞清楚 window.asrsea
是什么。在上面不远处你会发现:
d、e、f、g
四个参数就是我们刚刚说的不要管的参数。 从这个函数就是分析:encText是经过
两次b()
函数,encSecKey是经过
c()
函数,执行的一个参数。注意其中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 } 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 } 复制代码
可以发现 a(16)
就是一个随机生成的数,所以我们不需要管他。而b目前来看是AES的cbc模式加密。那么这个 encText
生成的规则我们就很清楚了。两次AES的cbc加密。其中偏移量为 0102030405060708
固定不变。两次的key不同。而函数c就是三个参数进行RSA加密。整个算法大体流程差不多稍微了解。
到这里先停一下
,不要在分析函数了,我们在分析分析数据。
step3:分析参数
再回到 var bYc7V = window.asrsea(JSON.stringify(i3x), bkY2x(["流泪", "强"]), bkY2x(VM8E.md), bkY2x(["爱心", "女孩", "惊恐", "大笑"]))
这个函数。凭直觉能够感觉得到有些数据一定跟我们的 核心参数
无关,最多跟时间戳有关。
查找bky2x源头,
再找的话其实没必要,这类函数你找找。可以复制到vscode溯源找到根源。分析,在这里就不繁琐介绍。直接打断点分析吧!看看他是怎么执行的。
其实多次抓你会发现后三个参数是固定不变
的(非交互型数据)。 然而最想要的是第一个参数
你心心年年的参数原来长这个样,那么和预想差不多,仅仅第一个参数和我们的参数有关。offset就是页面*20
,R_SO_4_+songid就是当前这首歌的id.其实到这个时候,你的
i和encSecKey
可以一起保存了。因为上面分析说过,这个
i
是随机生成,而
encSecKey
也和我们核心参数无关,但是和
i
相关,所以要记录一组。用作ESA加密的参数和post请求的参数。
现在的你是不是很激动,因为真想即将浮出水面。
step4: 校验
这步骤也是很重要的一环,因为你在它的js中会发现。
网易是否会动手脚呢?下载原始的js进行测试。发现哈哈,结果一致。那么就不需要更改再仔细查看那段加密算法的代码了。
架构图为
step5:转为 python 代码
需要将AES的cbc模式的代码用Python克隆。达到加密的效果,测试一下。发现结果一致nice
编写爬虫
下面就开始编写爬虫。先用 postman
测试需要那些参数。
没问题,编写爬虫。根据你喜欢的哥。把id输进去,生成你爱的词云!一首光辉岁月送给大家!
源码github地址求Star。
如果有疑问或者过期可以关注我公众号联系我。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- APICloud解密本地资源到逆向APP算法到通用资源解密
- NodeJS加密解密,node-rsa加密解密用法
- CMSEasy企业建站源代码解密工具,适用于纯本地解密机制!
- 如何解密keystore文件
- 解密 Runloop
- 加解密详解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript语言精粹
道格拉斯•克罗克福德 (Douglas Crockford) / 赵泽欣、鄢学鹍 / 电子工业出版社 / 2012-9-1 / 49.00元
JavaScript 曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax 的到来,JavaScript“从最受误解的编程语言演变为最流行的语言”,这除了幸运之外,也证明了它其实是一门优秀的语言。Douglas Crockford 在本书中剥开了JavaScript 沾污的外衣,抽离出一个具有更好可靠性、可读性和可维护性的JavaScript 子集,让你看......一起来看看 《JavaScript语言精粹》 这本书的介绍吧!