爬虫逆向之加速乐案例(某某人民网站)

#代码星辉·七月创作之星挑战赛#

声明:本文仅作学习交流,请遵守法律法规

*案例:*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

javascript 复制代码
(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环境里,接下里随便补几个环境

javascript 复制代码
window = global
navigator = {};

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的内容了

正确做法,先定义需要的哈希

python 复制代码
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,在前面加上

javascript 复制代码
         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完美得出

总而来说,加速乐没有难度,非常简单。