分析请求
经过查看请求,并没有请求的加密参数,但是响应的内容却不正常,许多文字在响应中都变成了 span 标签【图1-2】
定位加密
CSS中,::before 创建一个伪元素,其将成为匹配选中的元素的第一个子元素。常通过 content
属性来为一个元素添加修饰性的内容。此元素默认为行内元素。
继续搜索::before
,这次找到的同样是请求页面的响应内容但是::before
在文件的位置值得我们打开看看。【图2-5】
点开文件再次搜索,在这里就定位到了疑似加密的地方【图2-6】,对!只是疑似加密。
你不能因为代码长得丑、难理解就怀疑它是加密
.context_kw
可以找到操作 DOM 的代码,可以找到操作 DOM 的加密位置,搜索方法大同小异。分析与改写
CryptoJS
的加解密的内容,第二部分是经过混淆的内容,根据部分 JS 可以猜测第二部分的 JS 操作了 DOM ,完成了 CSS 相关的解密。【图3-1】CryptoJS
没啥好改的,照着用就好了。1. 先取出 _0xa12e
这个数组里面一个加密过的元素,取出后用 AES
解密
secWords
中,对secWords
中的值遍历并做了一堆骚操作,将处理过后的值放入到words
当中,注意这里words
就已经是文字了。部分解析
在 node 中运行输出的结果是这样的【图3-3】
很明显 node 环境下输出的结果不是我们要的,而且字符数也少了两个,同一份代码环境不同,可以大致猜到可能是代码里做了一些对环境属性的判断。
这个时候理解代码的好处就来了,可以很快定位到下面这行代码【图3-4】:
图3-4
图3-4
这里检测的是当前的 URL ,在浏览器中这个判断条件是不成立的【图3-5】,所以不执行判断中代码。
图3-5
图3-5
到了 node 环境下是没有浏览器的window属性的,所以执行这句会出现异常,执行的是异常处理中的代码,所以我们直接把这段if代码注释掉。
继续向下,找找还有没有相关的代码,只要是判断浏览器相关属性的都需要注意一下。
很快看到【图3-6】这一行的代码也进行了相关的判断。
图3-6
图3-6
在浏览器环境下代码的结果是这样的【图3-7】
图3-7
图3-7
但是在 node 环境下是这样的,计算结果也相应的出现了错误【图3-8】
图3-8
图3-8
所以这里需要做相应的修改,让结果能够计算正确。
例如:
_0x1532b6[_0xea12('0x26')](_0x490c80, 0x3 * +!('object' === _0xea12('0x27')))
这样 node 环境下的计算结果就正常了。
将经过处理后的 JS 运用到 Python 爬虫中,就可以看到正确的内容了【图3-9】
图3-9
图3-9
总结
这个网站的加密不是很难,不过加密的方法很典型,前段时间有不少读者朋友在群里讨论研究,非常值得学习一下。
不过既然是小说网站,这里也涉及到相关的版权问题,所以希望大家不要搞事,以学习的态度和目的阅读本文。