本篇介绍如何破解汽车之家配置页面的伪元素和混淆的JS。
**温馨提示:如需转载本文,请注明内容出处。**
笔者爬取得网站中,印象最为深刻的就是汽车之家的网站了,也是麻烦最多的网站之一了,特点是页面大面积使用伪元素代替关键字,解析伪元素的JS进行了动态混淆,每次刷新后的JS都是不同的,页面被禁用右键菜单,无法选中或复制。
基本就是这样,如果单纯的抓取页面元素后会是这样:
开始分析:
1.整个页面通过及配置数据都是直接Write出来的,因为配置项的详情在页面JS里同页面一起生成,并非通过接口。
2.配置项数据在页面上
(PS小妙招:将网页保存本地后发现文字依旧显示,然后大面积删除JS后刷新页面,如果文字依旧显示,继续删,直到找到加载数据的JS为止)
事后发现第一个变量keyLink是左边配置名称的超链接
第二个变量config是我们要的配置上半页(到车轮制动那),
第三个变量option是主/被动安全装备及以下,
其他的没什么用,第五个可能是什么运动套装之类的,豪车才有,没仔细看。
这个JS是被混淆过的,不可以根据变量名去获取。
4.破解流程,拿到这个配置JSON串,然后找到解析JS,计算JS的变量得到字典集(一大串文字)和下标集(一大串数字集合)根据下标取字典里对应的文字,得到真正的数据字典,然后替换指定的伪元素。
5.解析被混淆的JS,格式化后可以得到这样的一串JS
提供一个完整的JS,有兴趣的小伙伴可以去研究研究
开始解析:
如上图所示,里面有好多函数和变量,里面会返回一段文字或者符号,这些零零散散的文字将被组成一个完成数据字典库,
大致分为这几种:
直接变量赋值的,如
varmH_='例'通过函数为变量赋值的,值等于return后面的字符串,如
varlI_=function(){'returnlI_';return'3;7';};函数,调用的时候获得值,值等于return后面的字符串,如
众所周知,函数是需要被调用才能运行的,那么入口呢,就很巧妙的隐藏在了这里↓
varHH_=$FillDicData$('iU_');接着会跳到这个函数
这个就是调用上面的那些大部分的变量组成字典集
紧接着下面的这个方法就是获取下标集合
这个方法实现根据坐标集取得字典,注意这个方法是不混淆的!可以直接搜索方法名找到。
"77,7"就是"环保"通过这种方式替换页面的伪元素
分析到这里了,后面也就不难了,不再详细说明,如有不明白的,可以留言给我。
获取数据字典,模拟了刚才分析的JS
破解数据字典,其实就是模拟我们上面分析的JS解析过程,其中用到大量的正则分别处理不同格式的数据集
1usingMicrosoft.JScript;2usingMicrosoft.JScript.Vsa;3usingSystem;4usingSystem.CodeDom.Compiler;5usingSystem.Collections.Generic;6usingSystem.Linq;7usingSystem.Reflection;8usingSystem.Text;9usingSystem.Threading.Tasks;1011namespacelibrary12{13publicstaticclassJSHelper14{15staticVsaEngineEngine=VsaEngine.CreateEngine();16publicstaticobjectExecJs(stringstr)17{18returnEvalJScript(str);19}20publicstaticobjectEvalJScript(stringJScript)21{22objectResult=null;23try24{25Result=Microsoft.JScript.Eval.JScriptEvaluate(JScript,Engine);26}27catch(Exceptionex)28{29returnex.Message;30}31returnResult;3233}34}35}
这种稍微复杂点的爬虫真的十分锻炼分析能力和耐心,这也是笔者认为开发者十分重要的一种能力,而对于.net这种门槛较低,技术能力金字塔分布的开发群体,真的需要我们好好钻研技术。