简单js加密反爬的处理思路

这里简单分析一下中国 裁 判-文 书网的js加密,不展示具体代码。

先看看要爬什么数据

要爬取的数据

来看看页面源码

页面源码

很显然,页面内容是ajax动态加载的。
那么我们打开浏览器调试工具,刷新页面,选择network–xhr,如下图:
在这里插入图片描述
一个个查看内容,发现第二个内容如下:

在这里插入图片描述
这正是我们需要的数据,分析该请求,可以看到,该请求是post请求,有三个字段是加密字段,如下图:

在这里插入图片描述
我们打开postman进行测试,经过各种测试后发现,请求头里只有cookie是必须的,不加referer请求头的话,服务器处理速度会慢很多,所以我们加上cookie和referer请求头。
参数里,除了上面的查询条件和分页参数之外,只有第一个参数vl5x是必须的,如图:

在这里插入图片描述
在这里插入图片描述

接下来分析vl5x这个参数的获取方式

首先,在network页面全局搜索ctrl+f,找到包含vl5x的两个js文件,格式化后发现这个参数的值是通过getKey()这个函数获取的,如图:

在这里插入图片描述

再次全局搜索getKey,发现他内部的几个eval()函数,如图:

在这里插入图片描述
经过多次刷新,清缓存刷新,以及分析文件名发现,该js是固定js,也就是说,每次通过这个函数获取vl5x的过程是固定的,只是入参不一样,我们开始debug这几个eval函数,
在一步一步debug的过程中,把result放到watch里,发现只有在最后一步result才出现,我们拿出最后一步的eval里的参数,放到console页面,如图:

在这里插入图片描述
由于该js里的函数都是全局的,_fxxx这个函数可以直接调用,所以我们直接按下回车,结果如图:

在这里插入图片描述

分析这段js,发现他的入参是cookie里的 ‘vjkl5’ 我们打开application查看cookie ,找到’vjkl5’,刷新页面,发现这个cookie每刷新一次页面就会更新,接下来继续分析。

var funIndex=strToLong(cookie)%arrFun.length;var fun=arrFun[funIndex];var result=fun(cookie);
可以看出,arrFun是一个长400的数组,我们复制strToLong到控制台,回车,发现它不是一个函数,我们倒回前几个eval,把它们内部代码依次在console执行一遍(注意,执行的结果可能还有eval,这个过程比较麻烦,还请耐心),再次输入strToLong,发现它的构造:

function strToLong(str) {
    var long = 0;
    for (var i = 0; i < str.length; i++) {
        long += (str.charCodeAt(i) << (i % 16))
    }
    return long
}

这段很好用其他语言来重写,我们继续往下分析:

funIndex就是vjkl5经过strToLong再%400之后的结果,然后从arrFun数组中拿出第funIndex个元素,就是我们的fun,如图:

在这里插入图片描述
我们点进去看143函数,发现它调用了7函数和18函数,我们依次找到,结果如图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这就拿到了所有的加密方法,不过由于每次strToLong出来的结果都不一定一样,所以每次加密的方式都不一样,如果有工作需要,可以把前几个真正用于加密的js都重写一遍,后面的组合简单组合一下就行了。当然 拿到eval后直接用selenium或者其他的能执行js的库或jar包执行getKey也是可以的,如果出于性能考虑,把js用其他语言重写应该会好一点,如果爬取量大的话。 用该网站只是举一个例子,我平时遇到js加密的思路就是这样的,不到万不得已,我不会用selenium来解js。曾经遇到过每次刷新页面都会获取到不一样的js代码,那种变态的网站我不想再遇到了。。(最后网站都会变成这样的,目前遇到的最难的js加密就是这种。。)

希望对你有所帮助٩(๑❛ᴗ❛๑)۶

发布了8 篇原创文章 · 获赞 5 · 访问量 1877

猜你喜欢

转载自blog.csdn.net/weixin_42525191/article/details/96717037