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
- 加解密详解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Trading and Exchanges
Larry Harris / Oxford University Press, USA / 2002-10-24 / USD 95.00
This book is about trading, the people who trade securities and contracts, the marketplaces where they trade, and the rules that govern it. Readers will learn about investors, brokers, dealers, arbit......一起来看看 《Trading and Exchanges》 这本书的介绍吧!