前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【验证码逆向专栏】最新某验四代动态参数逆向详解

【验证码逆向专栏】最新某验四代动态参数逆向详解

原创
作者头像
K哥爬虫
发布2025-02-05 17:30:45
发布2025-02-05 17:30:45
14400
代码可运行
举报
文章被收录于专栏:Python 爬虫
运行总次数:0
代码可运行

声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】联系作者立即删除!

前言

近期查看星球群聊,发现有群友讨论关于某验蝌蚪文的问题,根据以往经验来看,绝对不仅仅是单纯的 js 混淆,而逻辑不变。最近也有很多粉丝提问,表示验证通过返回值却用不了,极大可能是这次更新增加了一个动态参数的缘故,虽然可以通过,但是却被标记,导致无法通过校验:

7VouZ3.jpg
7VouZ3.jpg

此外,也有粉丝在群里发布某交易所相关验证码的需求,正好,本文就对这个站点进行分析,同时也是对某验系列的一个补充:

7VoHD5.png
7VoHD5.png

逆向目标

  • 目标:gate 登录页
  • 网址:aHR0cHM6Ly93d3cuZ2F0ZS5pby96aC9sb2dpbg==

抓包分析

进入登录页面,随机输入账号、密码,点击登录,会发现抓到了两次 /load 数据包,其中第一次 load 包返回的验证码类型为无感 ai

第二次 load 包返回验证码类型为滑块 slide

无感验证通过后返回 continue,同时返回 lot_number、payload、process_token 等参数:

这些参数同时又是第二次 load 包中的请求参数,验证通过后,即会返回最终所需的参数。

逆向分析

往期文章也详细讲过 4 代的相关算法流程,没有了解过 4 代的小伙伴可以先去看一下:

某验四代滑块验证码逆向分析:https://mp.weixin.qq.com/s/vlPH-6YpGo7jBGhg1fzMng

在以往,定位 w 的方式为搜索 "\u0077",最新版本中,可以通过 w: 来定位,位置如下:

发现 w 由 _ᖚᕿᕹᖙ 赋值,参数如下:

代码语言:javascript
代码运行次数:0
复制
{
    "device_id": "",
    "lot_number": "省略",
    "pow_msg": "",
    "pow_sign": "省略",
    "geetest": "captcha",
    "lang": "zh",
    "ep": "123",
    "biht": "1426265548",
    "gee_guard": {
        "roe": {
            "aup": "3",
            "sep": "3",
            "egp": "3",
            "auh": "3",
            "rew": "3",
            "snh": "3",
            "res": "3",
            "cdc": "3"
        }
    },
    "2WvY": "SQjH",
    "fa18b6": "1414",
    "em": {
        "ph": 0,
        "cp": 0,
        "ek": "11",
        "wd": 1,
        "nt": 0,
        "si": 0,
        "sc": 0
    }
}

可以看到,多了一个键值对参数,"fa18b6": "1414"。那么我们分析一下这个参数是如何生成的。在 w 之前我们发现该键值对参数为 a:

a 参数是由 i 参数与 r 参数生成的,其逻辑如下:

代码语言:javascript
代码运行次数:0
复制
 var i = (0,_ᖘᕹᖆᖗ[_ᕴᖉᕾᕾ(37)])(_ᕴᖙᖀᖆ["lot"], _ᕴᖙᖀᖆ[_ᕴᖉᕾᕾ(414)])
 , r = (0,_ᖘᕹᖆᖗ[_ᕸᖗᖁᖆ(37)])(_ᕴᖙᖀᖆ["lotRes"], _ᕴᖙᖀᖆ[_ᕴᖉᕾᕾ(414)])

_ᕴᖙᖀᖆ[_ᕴᖉᕾᕾ(414)] 参数为 load 接口返回的 lotNumber,那么 lot 与 lotRes 是如何得来的?我们向前跟栈,找到相关标志位置如下:

7WmZ5e.jpg
7WmZ5e.jpg

关键代码如下:

代码语言:javascript
代码运行次数:0
复制
var _ᖙᕺᖀᕷ = this
 , _ᖆᕹᖈᕾ = window[_ᕴᖉᕾᕾ(22)] ? window[_ᕸᖗᖁᖆ(22)][_ᕴᖉᕾᕾ(1)] : {};
for (var i in _ᖆᕹᖈᕾ)
 if (_ᖆᕹᖈᕾ[_ᕴᖉᕾᕾ(60)](i)) {
var r = _ᖆᕹᖈᕾ[i];
 _ᖙᕺᖀᕷ["options"]["lot"] = (0, _ᖘᕹᖆᖗ[_ᕸᖗᖁᖆ(64)])(i),
 _ᖙᕺᖀᕷ["options"]["lotRes"] = (0,_ᖘᕹᖆᖗ[_ᕸᖗᖁᖆ(64)])(r)
}

在这里有明显的赋值 var _ᖙᕺᖀᕷ = this,this 指向的是 window,这里将 window 赋值给了 _ᖙᕺᖀᕷ,然后取了 window 下面的一个属性值 _ᖆᕹᖈᕾ = window[ "lib" ] ? window["lib"]["_abo"],值如下:

代码语言:javascript
代码运行次数:0
复制
{
    "n[7:9]+n[22:24]": "n[9:12]"
}

之后进行 for 循环中遍历,经过函数 _ᖘᕹᖆᖗ[_ᕸᖗᖁᖆ(64)] 得到 lot 与 lotRes,那么这个函数我们可以选择扣算法,也可以导函数,当然也可以算法模拟,这里就选择直接扣算法,进入该方法,结构如下:

7WLMvB.jpg
7WLMvB.jpg

将该方法整体拿下,依旧还是将头部函数也一起全部拿下,如下:

7WLfnt.jpg
7WLfnt.jpg

运行后发现提示报错,ReferenceError: _ᖙᕺᖀᕷ is not defined

7WLsLb.jpg
7WLsLb.jpg

将代码全部拿到 nodepad,观察代码结构,发现仍是熟悉的往原型上添加方法,_ᕸᖗᖁᖆ(29) 无疑是 prototype:

7WL2Ge.jpg
7WL2Ge.jpg

把该方法同样打包拿下,最终复现如下:

7WL6zP.jpg
7WL6zP.jpg

除了扣算法以外,函数导出也是不错的选择,将整体代码全部拿下,直接在该函数部分将该函数导出给全局:

7W0Lx5.jpg
7W0Lx5.jpg

然后将老生常谈的 window、document 进行补齐即可复现,效果同上。

将 lot 与 lotRes 进行处理后,就剩下最后一个函数 _ᖘᕹᖆᖗ[_ᕴᖉᕾᕾ(37)] 需要处理,处理方法依旧如上,发现依旧这个方法是属于 _ᖁᕴᕿᖄ 下的方法:

7W3Yr7.jpg
7W3Yr7.jpg

也是将其扣下,最终复现如下:

代码语言:javascript
代码运行次数:0
复制
// 头部解密函数省略
function _ᖙᕺᖀᕷ(_ᖚᕿᕹᖙ) {
    var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_DR()[0][6];
    for (; _ᖁᕴᕿᖄ !== _ᖗᖉᖙᕹ.$_DR()[2][5]; ) {
        switch (_ᖁᕴᕿᖄ) {
        case _ᖗᖉᖙᕹ.$_DR()[4][6]:
            this[_ᕸᖗᖁᖆ(34)] = _ᖚᕿᕹᖙ || [];
            _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_DR()[0][5];
            break
        }
    }
}
var _ᕸᖗᖁᖆ = _ᖗᖉᖙᕹ.$_Cv
, _ᕴᖙᖀᖆ = ["$_CIAx"].concat(_ᕸᖗᖁᖆ)
, _ᕴᖉᕾᕾ = _ᕴᖙᖀᖆ[1];
_ᕴᖙᖀᖆ.shift();
var _ᖆᖗᕸᕴ = _ᕴᖙᖀᖆ[0];
_ᖙᕺᖀᕷ[_ᕸᖗᖁᖆ(29)] = {
    $_BEG: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_EAAn"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        return this[_ᕸᖗᖁᖆ(34)][_ᖚᕿᕹᖙ]
    },
    $_BFo: function() {
        var _ᖚᕿᕹᖙ = _ᖗᖉᖙᕹ.$_Cv
          , _ᖁᕴᕿᖄ = ["$_EAFe"].concat(_ᖚᕿᕹᖙ)
          , _ᕴᖂᖚᕿ = _ᖁᕴᕿᖄ[1];
        _ᖁᕴᕿᖄ.shift();
        var _ᕸᖗᖁᖆ = _ᖁᕴᕿᖄ[0];
        return this[_ᖚᕿᕹᖙ(34)][_ᕴᖂᖚᕿ(39)]
    },
    $_BGO: function(_ᖚᕿᕹᖙ, _ᖁᕴᕿᖄ) {
        var _ᕴᖂᖚᕿ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕸᖗᖁᖆ = ["$_EBAx"].concat(_ᕴᖂᖚᕿ)
          , _ᕴᖙᖀᖆ = _ᕸᖗᖁᖆ[1];
        _ᕸᖗᖁᖆ.shift();
        var _ᕴᖉᕾᕾ = _ᕸᖗᖁᖆ[0];
        return new _ᖙᕺᖀᕷ((0,
        n[_ᕴᖂᖚᕿ(74)])(_ᖁᕴᕿᖄ) ? this[_ᕴᖙᖀᖆ(34)][_ᕴᖙᖀᖆ(33)](_ᖚᕿᕹᖙ, _ᖁᕴᕿᖄ) : this[_ᕴᖙᖀᖆ(34)][_ᕴᖙᖀᖆ(33)](_ᖚᕿᕹᖙ))
    },
    $_BHe: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_EBFj"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        return this[_ᖁᕴᕿᖄ(34)][_ᖁᕴᕿᖄ(94)](_ᖚᕿᕹᖙ),
        this
    },
    $_BID: function(_ᖚᕿᕹᖙ, _ᖁᕴᕿᖄ) {
        var _ᕴᖂᖚᕿ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕸᖗᖁᖆ = ["$_ECAl"].concat(_ᕴᖂᖚᕿ)
          , _ᕴᖙᖀᖆ = _ᕸᖗᖁᖆ[1];
        _ᕸᖗᖁᖆ.shift();
        var _ᕴᖉᕾᕾ = _ᕸᖗᖁᖆ[0];
        return this[_ᕴᖙᖀᖆ(34)][_ᕴᖙᖀᖆ(103)](_ᖚᕿᕹᖙ, _ᖁᕴᕿᖄ || 1)
    },
    $_BBS: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_ECFi"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        return this[_ᖁᕴᕿᖄ(34)][_ᖁᕴᕿᖄ(71)](_ᖚᕿᕹᖙ)
    },
    $_BJV: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_EDAC"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        return new _ᖙᕺᖀᕷ(this[_ᕸᖗᖁᖆ(34)][_ᕸᖗᖁᖆ(161)](_ᖚᕿᕹᖙ))
    },
    $_JM: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_EDFd"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        var _ᕴᖉᕾᕾ = this[_ᕸᖗᖁᖆ(34)];
        if (_ᕴᖉᕾᕾ[_ᕸᖗᖁᖆ(117)])
            return new _ᖙᕺᖀᕷ(_ᕴᖉᕾᕾ[_ᕸᖗᖁᖆ(117)](_ᖚᕿᕹᖙ));
        for (var s = [], n = 0, i = _ᕴᖉᕾᕾ[_ᖁᕴᕿᖄ(39)]; n < i; n += 1)
            s[n] = _ᖚᕿᕹᖙ(_ᕴᖉᕾᕾ[n], n, this);
        return new _ᖙᕺᖀᕷ(s)
    },
    $_CAs: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_EEAJ"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        var _ᕴᖉᕾᕾ = this[_ᖁᕴᕿᖄ(34)];
        if (_ᕴᖉᕾᕾ[_ᕸᖗᖁᖆ(154)])
            return new _ᖙᕺᖀᕷ(_ᕴᖉᕾᕾ[_ᕸᖗᖁᖆ(154)](_ᖚᕿᕹᖙ));
        for (var s = [], n = 0, i = _ᕴᖉᕾᕾ[_ᕸᖗᖁᖆ(39)]; n < i; n += 1)
            _ᖚᕿᕹᖙ(_ᕴᖉᕾᕾ[n], n, this) && s[_ᖁᕴᕿᖄ(94)](_ᕴᖉᕾᕾ[n]);
        return new _ᖙᕺᖀᕷ(s)
    },
    $_CBk: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_EEFo"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        var _ᕴᖉᕾᕾ = this[_ᕸᖗᖁᖆ(34)];
        if (_ᕴᖉᕾᕾ[_ᖁᕴᕿᖄ(40)])
            return _ᕴᖉᕾᕾ[_ᕸᖗᖁᖆ(40)](_ᖚᕿᕹᖙ);
        for (var s = 0, n = _ᕴᖉᕾᕾ[_ᖁᕴᕿᖄ(39)]; s < n; s += 1)
            if (_ᕴᖉᕾᕾ[s] === _ᖚᕿᕹᖙ)
                return s;
        return -1
    },
    $_CCb: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_EFAI"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        var _ᕴᖉᕾᕾ = this[_ᖁᕴᕿᖄ(34)];
        if (_ᕴᖉᕾᕾ[_ᖁᕴᕿᖄ(40)])
            return -1 < _ᕴᖉᕾᕾ[_ᕸᖗᖁᖆ(40)](_ᖚᕿᕹᖙ);
        for (var s = 0, n = _ᕴᖉᕾᕾ[_ᖁᕴᕿᖄ(39)]; s < n; s += 1)
            if (_ᕴᖉᕾᕾ[s] === _ᖚᕿᕹᖙ)
                return !0;
        return !1
    },
    $_CDW: function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_EFFR"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        var _ᕴᖉᕾᕾ = this[_ᕸᖗᖁᖆ(34)];
        if (!_ᕴᖉᕾᕾ[_ᖁᕴᕿᖄ(179)])
            for (var s = arguments[1], n = 0; n < _ᕴᖉᕾᕾ[_ᖁᕴᕿᖄ(39)]; n++)
                n in _ᕴᖉᕾᕾ && _ᖚᕿᕹᖙ[_ᖁᕴᕿᖄ(99)](s, _ᕴᖉᕾᕾ[n], n, this);
        return _ᕴᖉᕾᕾ[_ᖁᕴᕿᖄ(179)](_ᖚᕿᕹᖙ)
    }
};
function _ᖚᕿᕹᖙ(_ᖁᕴᕿᖄ) {
    var _ᕴᖂᖚᕿ = _ᖗᖉᖙᕹ.$_Cv
      , _ᕸᖗᖁᖆ = ["$_DDFE"].concat(_ᕴᖂᖚᕿ)
      , _ᕴᖙᖀᖆ = _ᕸᖗᖁᖆ[1];
    _ᕸᖗᖁᖆ.shift();
    var _ᕴᖉᕾᕾ = _ᕸᖗᖁᖆ[0];
    function s(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_DR()[0][6];
        for (; _ᖁᕴᕿᖄ !== _ᖗᖉᖙᕹ.$_DR()[0][5]; ) {
            switch (_ᖁᕴᕿᖄ) {
            case _ᖗᖉᖙᕹ.$_DR()[4][6]:
                return new _ᖙᕺᖀᕷ(_ᖚᕿᕹᖙ[_ᕴᖂᖚᕿ(47)](_ᕴᖂᖚᕿ(17)))[_ᕴᖙᖀᖆ(88)](function(_ᖚᕿᕹᖙ) {
                    var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
                      , _ᕴᖂᖚᕿ = ["$_DEAo"].concat(_ᖁᕴᕿᖄ)
                      , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
                    _ᕴᖂᖚᕿ.shift();
                    var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
                    return parseInt(_ᖚᕿᕹᖙ[_ᖁᕴᕿᖄ(66)](), 10)
                });
            }
        }
    }
    return new _ᖙᕺᖀᕷ(_ᖁᕴᕿᖄ["split"]("+.+"))[_ᕴᖂᖚᕿ(88)](function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕴᖂᖚᕿ = ["$_DEFD"].concat(_ᖁᕴᕿᖄ)
          , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
        _ᕴᖂᖚᕿ.shift();
        var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
        return -1 !== _ᖚᕿᕹᖙ[_ᖁᕴᕿᖄ(40)](_ᖁᕴᕿᖄ(28)) ? function _ᖚᕿᕹᖙ(_ᖁᕴᕿᖄ) {
            var _ᕴᖂᖚᕿ = _ᖗᖉᖙᕹ.$_Cv
              , _ᕸᖗᖁᖆ = ["$_DFAi"].concat(_ᕴᖂᖚᕿ)
              , _ᕴᖙᖀᖆ = _ᕸᖗᖁᖆ[1];
            _ᕸᖗᖁᖆ.shift();
            var _ᕴᖉᕾᕾ = _ᕸᖗᖁᖆ[0];
            return new _ᖙᕺᖀᕷ(_ᖁᕴᕿᖄ[_ᕴᖙᖀᖆ(47)](_ᕴᖙᖀᖆ(28)))[_ᕴᖙᖀᖆ(88)](function(_ᖚᕿᕹᖙ) {
                var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
                  , _ᕴᖂᖚᕿ = ["$_DFFH"].concat(_ᖁᕴᕿᖄ)
                  , _ᕸᖗᖁᖆ = _ᕴᖂᖚᕿ[1];
                _ᕴᖂᖚᕿ.shift();
                var _ᕴᖙᖀᖆ = _ᕴᖂᖚᕿ[0];
                return s(_ᖚᕿᕹᖙ[_ᕸᖗᖁᖆ(85)](/\[(.*?)\]/)[1])
            })
        }(_ᖚᕿᕹᖙ) : new _ᖙᕺᖀᕷ([s(_ᖚᕿᕹᖙ[_ᖁᕴᕿᖄ(85)](/\[(.*?)\]/)[1])])
    })
}
function _ᖚᕿᕹᖙ2(_ᖁᕴᕿᖄ, _ᕴᖂᖚᕿ) {
    var _ᕸᖗᖁᖆ = _ᖗᖉᖙᕹ.$_Cv
      , _ᕴᖙᖀᖆ = ["$_DBFY"].concat(_ᕸᖗᖁᖆ)
      , _ᕴᖉᕾᕾ = _ᕴᖙᖀᖆ[1];
    _ᕴᖙᖀᖆ.shift();
    var _ᖆᖗᕸᕴ = _ᕴᖙᖀᖆ[0];
    return _ᖁᕴᕿᖄ[_ᕸᖗᖁᖆ(88)](function(_ᖚᕿᕹᖙ) {
        var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
          , _ᕸᖗᖁᖆ = ["$_DCAp"].concat(_ᖁᕴᕿᖄ)
          , _ᕴᖙᖀᖆ = _ᕸᖗᖁᖆ[1];
        _ᕸᖗᖁᖆ.shift();
        var _ᕴᖉᕾᕾ = _ᕸᖗᖁᖆ[0];
        return _ᖚᕿᕹᖙ[_ᕴᖙᖀᖆ(88)](function(_ᖚᕿᕹᖙ) {
            var _ᖁᕴᕿᖄ = _ᖗᖉᖙᕹ.$_Cv
              , _ᕸᖗᖁᖆ = ["$_DCFc"].concat(_ᖁᕴᕿᖄ)
              , _ᕴᖙᖀᖆ = _ᕸᖗᖁᖆ[1];
            _ᕸᖗᖁᖆ.shift();
            var _ᕴᖉᕾᕾ = _ᕸᖗᖁᖆ[0];
            var _ᖆᖗᕸᕴ = _ᖚᕿᕹᖙ[_ᖁᕴᕿᖄ(34)]
              , _ᖙᕺᖀᕷ = _ᖆᖗᕸᕴ[0]
              , _ᖆᕹᖈᕾ = 1 < _ᖆᖗᕸᕴ[_ᖁᕴᕿᖄ(39)] ? _ᖆᖗᕸᕴ[1] + 1 : _ᖆᖗᕸᕴ[0] + 1;
            return _ᕴᖂᖚᕿ[_ᕴᖙᖀᖆ(33)](_ᖙᕺᖀᕷ, _ᖆᕹᖈᕾ)
        })[_ᖁᕴᕿᖄ(30)](_ᖁᕴᕿᖄ(8))
    })[_ᕸᖗᖁᖆ(30)](_ᕴᖉᕾᕾ(12))
}
aaa = _ᖚᕿᕹᖙ("n[9:12]")
console.log(_ᖚᕿᕹᖙ2(aaa,"0ba5c6b85ba9467e8c1b84700f12a52d"))
7W3rdI.jpg
7W3rdI.jpg

最终键值对的获取流程拼接即可,因为考虑到是动态 js,所以我们每次加载 js 的时候,在最新的 js 全部通过 with 扩展作用域链给 window,实现动态键值对的获取,当然也可以仅通过 window["lib"]["_abo"] 获取分割字符串的位置,自行分割 lotnumber 来实现动态键值对的生成。完整流程如下:

代码语言:javascript
代码运行次数:0
复制
//环境
with (window){
 "dtjs"
}
​
// 上文扣出方法省略
function get_jzd(lot){
    _ᖆᕹᖈᕾ = window["lib"]["_abo"]
    var _ᕸᖗᖁᖆ = _ᖗᖉᖙᕹ.$_Cv
    , _ᕴᖙᖀᖆ = ["$_BJEFD"].concat(_ᕸᖗᖁᖆ)
    , _ᕴᖉᕾᕾ = _ᕴᖙᖀᖆ[1];
  _ᕴᖙᖀᖆ.shift();
    _ᖘᖗᕾᕶ={"options":{}}
    for (var i in _ᖆᕹᖈᕾ)
  if (_ᖆᕹᖈᕾ[_ᕴᖉᕾᕾ(60)](i)) {
    var r = _ᖆᕹᖈᕾ[i];
    _ᖘᖗᕾᕶ[_ᕴᖉᕾᕾ(411)][_ᕸᖗᖁᖆ(614)] = _ᖚᕿᕹᖙ(i),
    _ᖘᖗᕾᕶ[_ᕴᖉᕾᕾ(411)][_ᕴᖉᕾᕾ(688)] = _ᖚᕿᕹᖙ(r)}
    a1=_ᖚᕿᕹᖙ2(_ᖘᖗᕾᕶ["options"]["lot"],lot)
    b1=_ᖚᕿᕹᖙ2(_ᖘᖗᕾᕶ["options"]["lotRes"],lot)
    o = a1["split"](".")
    , a = {};
  o["reduce"](function(_ᖚᕿᕹᖙ, _ᖁᕴᕿᖄ, _ᕴᖂᖚᕿ) {
     
      return  _ᖚᕿᕹᖙ[_ᖁᕴᕿᖄ] = b1 ,
      _ᖚᕿᕹᖙ[_ᖁᕴᕿᖄ]
  }, a)
    return a
}

结果展示

7W3zwV.jpg
7W3zwV.jpg

当我们尝试修改键值对的时候,发现它二次出现了蜜罐九宫格,且通过后一直二次验证,所以动态键值对这个参数至关重要:

7W34SL.jpg
7W34SL.jpg

相关算法会分享到知识星球中,感兴趣的小伙伴自取,仅供学习交流~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 声明
  • 前言
  • 逆向目标
  • 抓包分析
  • 逆向分析
  • 结果展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档