目的
通过获取http://www.pbc.gov.cn/goutongjiaoliu/113456/113469/index.html
这个新闻页上的列表,并且访问其详情页
开干
先用console获取一下新闻列表url的内容,如下图所示:
很明显,根据爬虫经验,这种反爬类似于一种叫做”加速乐”的反爬机制,在红圈1处进行一些js运行的参数混淆加载,然后红圈2中进行主要的反爬逻辑,”加速乐”通常会通过js加密一串字符,然后在Cookie中需要带有该参数才能通过访问,而这里通过后面分析可以知道,这个网站是需要生成一个动态URL来让对方服务器校验。这里先进行的是解决eval函数里面的js参数解析
分析过程如下:
1.先拷贝代码到chrome里面运行一下看能生成一个什么结果
这里可以看到根据上面的eval执行的代码实际上会生成如上图的js变量并应用,那么我就可以通过python进行模拟
上图红圈位置实际上是模拟了JS里面的Number.toString方法。
通过分析JS的源代码可以从里面扣出逻辑并生成python代码
2.运行上边模拟的JS代码Debug到下图位置
图中real_var前面的逻辑实际上是从源网站里面提取到eval里面的代码,并且通过正则与逻辑从字符串中提取到我写的packet函数所需要的参数,并且返回的real_var正是与chrome里面生成的一模一样(类似)
3.再解决JS加密的模块,通过第一个步骤得到的红圈2里面的就是主要的JS加密处,通常我对于这种的混淆分析都会通过Vscode+nodeJS去模拟一个js运行的浏览器环境然后单步调试
红圈里面的就是我通过python运行后得到的变量,并且因为浏览器执行js代码的时候一般带有一些用到的全局对象例如window之类的,那么我这里设置一个空的
找到程序执行的入口
进入其代码看逻辑,实际上有用的部分就是下图这里
通过单步运行可以知道这三个值实际上目的是拼接一个下图这里的URL,也就是我开篇说说的动态URL
那么只要模拟到上面的3个参数就可以破解了
4.破解流程
这里通过运行可以知道函数是被映射到上边箭头所指向的地方,那么进去分析
这个函数的逻辑抠出来并用python实现就是我这一段代码
得到一段WZWS_CONFIRM_PREFIX_LABEL加上后缀参数的结果
然后运行第二个函数如下调用流程
到了这里,就是我python代码里面的_0x412a72函数的逻辑了
抠取里面的逻辑并且用python实现位置如下(红圈)
这里的变量复杂所以我在python里面也没改变量名了,直接用并且调试
如下图,这里的逻辑很明显就是传入的71652034就是下面switch逻辑运行的顺序
执行我写的逻辑得到如下结果
对比源js代码
最后一个函数实际上就是用一开始的dynamicurl与参数1,2还有下图字符进行拼接成动态url
最后python运行得到下面红线结果,完成破解
说明:实际上最快的解决方案可以是用python的executeJS库+本地nodejs环境来运行js源码,但是会存在调起nodejs运行环境的损耗以及容易发生一些难以控制的错误
本解决方案的所有代码都是使用python的环境进行编码并运行,是效率最高的方法,而在运行过程中也存在调用动态url失败的方法,通过获取到失败的一次js代码并且放到chrome中运行也是显示失败的,也证明对方服务器也存在一些错误
如下:
绿色圈中的key与value也调转了