爬虫逆向之加速乐案例(某某人民网站)
#代码星辉·七月创作之星挑战赛#
声明:本文仅作学习交流,请遵守法律法规
案例:aHR0cHM6Ly93d3cuZGFmZW5nLmdvdi5jbi9jb2wvY29sMjU4MzkvaW5kZXguaHRtbA==
请用base64解码
加速乐特征:
三次请求
第一次请求状态码512
第二次请求状态码512
第三次请求200
抓包时候请务必点击保留日志,前两次512就相当于重定向,没点击保留日志是抓不到512的状态的。观察最终生成cookies值
首三位字母是jsl也就是对应加速乐拼音首字母
第一次请求
查看第一个512的cookies的生成
只响应了一个cookie ,对他第一次请求,并返回了一大段JS代码
观察第二次512响应
http打勾✔则大概率是接口返回的,也就是第一次512返回的,__jsluid_s值是第一次响应512返回cookies。
__jsl_clearance_s则是第一次512响应返回的js代码生成的cookies
先用正则提取关键js代码,再用execjs.eval方法执行js代码
最终返回,
进一步处理
由第一次请求获取的响应cookies和第一次请求响应文本JS执行获取cookies,携带两者可进行第二次请求
第二次请求
请求的是一大坨混淆的JS代码
我们只需要这一坨
第三次请求
开始hook cookies
(function () { cookieTemp = document.cookie; Object.defineProperty(document, \'cookie\', { set: function (val) { { //v为监测cookie的键 if (val.includes(\'__jsl_clearance_s\')){ debugger; } } console.log(\'Hook捕获到cookie设置->\', val); cookieTemp = val; }, get: function () { return cookieTemp; }, });})();
先清除cookies
再打开脚本刷新
脚本断住时,运行 代码段里hookcookies脚本,再把脚本断开,断住
右键点击替换内容,因为加速乐环境会变,但原理一样。
把这一大坨js代码放进nodejs环境里,接下里随便补几个环境
window = globalnavigator = {};navigator.userAgent = \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\'location = { \"ancestorOrigins\": {}, \"href\": \"https://www.dafeng.gov.cn/col/col25839/index.html?uid=66892&pageNum=4\", \"origin\": \"https://www.dafeng.gov.cn\", \"protocol\": \"https:\", \"host\": \"www.dafeng.gov.cn\", \"hostname\": \"www.dafeng.gov.cn\", \"port\": \"\", \"pathname\": \"/col/col25839/index.html\", \"search\": \"?uid=66892&pageNum=4\", \"hash\": \"\"}document = {}
加速乐补环境毫无难度,比起瑞数来说,瑞数真的补到怀疑人生,不过瑞数大同小异.。
当你补完环境输出的是undefined
但回过头看看定位生成的cookies,有个定时器
把定时器去掉,在引用在自己的环境改为这样即可
引用使用
得出结果
除此之外,加速乐还有一个多哈希特性
就是你每次第二次请求这个ha会变成md5,sha1,sha256
搜索hash
这个相当于原生库sha1的内容了
正确做法,先定义需要的哈希
var cryptojs = require(\'crypto-js\')hash1 = { \'sha1\': function (_0x25ab0f) { return cryptojs.SHA1(_0x25ab0f).toString() }, \'md5\': function (_0x432264) { return cryptojs.MD5(_0x432264).toString() }, \'sha256\': function (_0x432264) { return cryptojs.SHA256(_0x432264).toString() }}
把原本哈希函数删掉
搜索go
go传参的名字是_0x5cbe14,在前面加上
if (_0x5cbe14[\'ha\'] === \'sha1\') { hash = hash1[\'sha1\'] } ; if (_0x5cbe14[\'ha\'] === \'md5\') { hash = hash1[\'md5\'] } ; if (_0x5cbe14[\'ha\'] === \'sha256\') { hash = hash1[\'sha256\'] } ;
hash函数最后会被调用
接下来求第二段请求响应go里面内容
先把node环境改为这样子,便于替换
最后一本,替换go参数,进行第三次请求
完美得出结果
总结:
三次请求,得出三次cookie
第一次请求,获取第一次响应cookie,响应内容js执行获取第二次响应cookie
第二次请求,携带第一次请求获取的两次cookie,得出第三次cookie的获取过程
第三次请求携带第一次请求响应cookie和第三次请求获取的cookie完美得出
总而来说,加速乐没有难度,非常简单。