Js逆向教程18-l参数分解

作者:虚坏叔叔
博客:https://xuhss.com

早餐店不会开到晚上,想吃的人早就来了!

Js逆向教程18-l参数分解

Js逆向教程18-l参数分解_第1张图片

一、l参数分解

可以看到l是一个大数组。

里面有很多字节码

Js逆向教程18-l参数分解_第2张图片

V[$_CAIAt(353)](gt[$_CAIAt(218)](o), r[$_CAIAt(756)]())

通过字符串还原

Js逆向教程18-l参数分解_第3张图片

V['encrypt'](gt['stringify'](o), r['$_CCEc']())

然后看o。

{
    "lang": "zh-cn",
    "userresponse": "933de",
    "passtime": 389,
    "imgload": 94,
    "aa": "d(!!Rssssts_t0stsssssw(!!(p119bMb1EL9A20992$)7",
    "ep": {
        "v": "7.8.9",
        "$_BIB": false,
        "me": true,
        "tm": {
            "a": 1670029641384,
            "b": 0,
            "c": 0,
            "d": 0,
            "e": 0,
            "f": 1670029641403,
            "g": 1670029642076,
            "h": 1670029642081,
            "i": 1670029642081,
            "j": 1670029642148,
            "k": 1670029642114,
            "l": 1670029642148,
            "m": 1670029642584,
            "n": 1670029642584,
            "o": 1670029642587,
            "p": 1670029643105,
            "q": 1670029643105,
            "r": 1670029643106,
            "s": 1670029643176,
            "t": 1670029643176,
            "u": 1670029643176
        },
        "td": -1
    },
    "da0j": "1302126368",
    "rp": "acc4a24ed1c0c673bea52dfafc3b2ba6"
}

并且再次启动 这个o会改变。

{
    "lang": "zh-cn",
    "userresponse": "c088800c0c22e1",
    "passtime": 335,
    "imgload": 85,
    "aa": "N,,(!!Twwvtsv9sL*ts~s~ssvt)vsw(!!(K:1DW92092D:9:0911E8E1::",
    "ep": {
        "v": "7.8.9",
        "$_BIB": false,
        "me": true,
        "tm": {
            "a": 1670032125609,
            "b": 1670032126117,
            "c": 1670032126117,
            "d": 0,
            "e": 0,
            "f": 1670032125616,
            "g": 1670032125621,
            "h": 1670032125622,
            "i": 1670032125622,
            "j": 1670032125677,
            "k": 1670032125647,
            "l": 1670032125678,
            "m": 1670032126111,
            "n": 1670032126112,
            "o": 1670032126119,
            "p": 1670032126334,
            "q": 1670032126334,
            "r": 1670032126336,
            "s": 1670032126409,
            "t": 1670032126409,
            "u": 1670032126409
        },
        "td": -1
    },
    "da0j": "1302126368",
    "rp": "4940a9ff07828eb819bc8534cda69ac2"
}

对比下来,有如下参数会变动

  • userresponse
  • imgload
  • aa 可以猜测aa就是滑动轨迹。
  • rp

二、aa轨迹值得获取

aa是通过e赋值的,e是函数的参数

Js逆向教程18-l参数分解_第4张图片

Js逆向教程18-l参数分解_第5张图片

通过堆栈可以看到它是由l传过来的:

Js逆向教程18-l参数分解_第6张图片

再次调试 跟到这个l计算的地方

l = n[$_DAAAV(913)][$_DAAAV(1059)](n[$_DAAAV(913)][$_CJJJb(1066)](), n[$_DAAAV(69)][$_CJJJb(1097)], n[$_DAAAV(69)][$_CJJJb(319)]);

还原“

l = n['$_CICM']['$_BBEM'](n['$_CICM']['$_FDU'](), n['$_CJa']['c'], n['$_CJa']['s']);

可以看出来,这是一个方法传递3个参数,将参数还原出来

第一个参数得到的是已经编码好的值 是和轨迹相关的。

n['$_CICM']['$_FDU']()
'U-!!Lxusttttst(ysttsttstt!!(S2891912028112011192'

第二个参数是直接获取的,这数据是从get.php请求里面获取的c

n['$_CJa']['c']
(9) [12, 58, 98, 36, 43, 95, 62, 15, 12]

第三个参数是js的crc版本数据校验值 是从get.php请求里面获取的s

n['$_CJa']['s']
'3a39574c'

Js逆向教程18-l参数分解_第7张图片

2.1参数破解

确定了第一个参数是轨迹相关之后 可以进到这个函数里面 看一下轨迹是如何计算出的。

"\u0024\u005f\u0046\u0044\u0055": function() {
                var $_BEGJO = QBLnx.$_CM
                  , $_BEGIl = ['$_BEHCE'].concat($_BEGJO)
                  , $_BEHAL = $_BEGIl[1];
                $_BEGIl.shift();
                var $_BEHBJ = $_BEGIl[0];
                function n(t) {
                    var $_DBEAP = QBLnx.$_Db()[3][19];
                    for (; $_DBEAP !== QBLnx.$_Db()[12][17]; ) {
                        switch ($_DBEAP) {
                        case QBLnx.$_Db()[0][19]:
                            var e = $_BEGJO(447)
                              , n = e[$_BEGJO(125)]
                              , r = $_BEGJO(15)
                              , i = Math[$_BEGJO(360)](t)
                              , o = parseInt(i / n);
                            n <= o && (o = n - 1),
                            o && (r = e[$_BEGJO(187)](o));
                            $_DBEAP = QBLnx.$_Db()[12][18];
                            break;
                        case QBLnx.$_Db()[9][18]:
                            var s = $_BEHAL(15);
                            return t < 0 && (s += $_BEHAL(474)),
                            r && (s += $_BEGJO(411)),
                            s + r + e[$_BEGJO(187)](i %= n);
                            break;
                        }
                    }
                }
                var t = function(t) {
                    var $_BEHET = QBLnx.$_CM
                      , $_BEHDy = ['$_BEHHD'].concat($_BEHET)
                      , $_BEHFo = $_BEHDy[1];
                    $_BEHDy.shift();
                    var $_BEHGR = $_BEHDy[0];
                    for (var e, n, r, i = [], o = 0, s = 0, a = t[$_BEHET(125)] - 1; s < a; s++)
                        e = Math[$_BEHET(129)](t[s + 1][0] - t[s][0]),
                        n = Math[$_BEHFo(129)](t[s + 1][1] - t[s][1]),
                        r = Math[$_BEHET(129)](t[s + 1][2] - t[s][2]),
                        0 == e && 0 == n && 0 == r || (0 == e && 0 == n ? o += r : (i[$_BEHET(173)]([e, n, r + o]),
                        o = 0));
                    return 0 !== o && i[$_BEHET(173)]([e, n, o]),
                    i;
                }(this[$_BEHAL(343)])
                  , r = []
                  , i = []
                  , o = [];
                return new ct(t)[$_BEHAL(20)](function(t) {
                    var $_BEHJs = QBLnx.$_CM
                      , $_BEHIl = ['$_BEICx'].concat($_BEHJs)
                      , $_BEIAy = $_BEHIl[1];
                    $_BEHIl.shift();
                    var $_BEIBp = $_BEHIl[0];
                    var e = function(t) {
                        var $_BEIEr = QBLnx.$_CM
                          , $_BEIDP = ['$_BEIHs'].concat($_BEIEr)
                          , $_BEIFF = $_BEIDP[1];
                        $_BEIDP.shift();
                        var $_BEIGe = $_BEIDP[0];
                        for (var e = [[1, 0], [2, 0], [1, -1], [1, 1], [0, 1], [0, -1], [3, 0], [2, -1], [2, 1]], n = 0, r = e[$_BEIEr(125)]; n < r; n++)
                            if (t[0] == e[n][0] && t[1] == e[n][1])
                                return $_BEIFF(406)[n];
                        return 0;
                    }(t);
                    e ? i[$_BEHJs(173)](e) : (r[$_BEHJs(173)](n(t[0])),
                    i[$_BEIAy(173)](n(t[1]))),
                    o[$_BEIAy(173)](n(t[2]));
                }),
                r[$_BEGJO(421)]($_BEGJO(15)) + $_BEGJO(452) + i[$_BEGJO(421)]($_BEGJO(15)) + $_BEHAL(452) + o[$_BEGJO(421)]($_BEGJO(15));
            }

折叠代码看的更加清楚

Js逆向教程18-l参数分解_第8张图片

调试进去可以看到t存的是坐标,它是一个数组

Js逆向教程18-l参数分解_第9张图片


然后,对单个坐标进行处理:

Js逆向教程18-l参数分解_第10张图片

最终返回如下:

r[$_BEGJO(421)]($_BEGJO(15)) + $_BEGJO(452) + i[$_BEGJO(421)]($_BEGJO(15)) + $_BEHAL(452) + o[$_BEGJO(421)]($_BEGJO(15));

还原:

r['join']('') + '!!' + i['join']('') + '!!' + o['join']('');

40:00

所以需要将这段代码抠出来,传递轨迹进去,就能够得到加密的字符串

Js逆向教程18-l参数分解_第11张图片

它需要将轨迹参数传递进去:轨迹转换成字符串

'[[-37,-25,0],[0,0,0],[1,-1,4],[2,-1,13],[3,-1,21],[6,-2,29],[6,-2,37],[7,-3,53],[8,-3,61],[10,-3,69],[10,-3,77],[11,-3,93],[14,-3,100],[15,-3,109],[15,-3,117],[19,-3,125],[21,-3,133],[24,-3,142],[27,-3,149],[30,-3,158],[31,-3,165],[34,-3,173],[35,-3,181],[35,-3,189],[36,-3,198],[36,-3,310]]'

Js逆向教程18-l参数分解_第12张图片

这个时候,将这个数组作为字符串,传递到window.get_track()函数 可以获得一个加密的结果:

Js逆向教程18-l参数分解_第13张图片

2.2函数破解

函数在这里:

Js逆向教程18-l参数分解_第14张图片

搜索一下,都在一块代码里面 我们可以将这个函数也导出去:

		window.get_track = W[$_CJFA(230)]["\u0024\u005f\u0046\u0044\u0055"];
		window.get_method = W[$_CJFA(230)]["\u0024\u005f\u0042\u0042\u0045\u004d"];

总结

最后的最后
由本人水平所限,难免有错误以及不足之处, 屏幕前的靓仔靓女们 如有发现,恳请指出!

最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客对你有所帮助!

你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

往期优质文章分享

  • C++ QT结合FFmpeg实战开发视频播放器-01环境的安装和项目部署
  • 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
  • 解决安装QT后MSVC2015 64bit配置无编译器和调试器问题
  • Qt中的套件提示no complier set in kit和no debugger,出现黄色感叹号问题解决(MSVC2017)
  • Python+selenium 自动化 - 实现自动导入、上传外部文件(不弹出windows窗口)

优质教程分享

  • 如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
  • 比如以下几个专栏:Python实战微信订餐小程序、Python量化交易实战、C++ QT实战类项目 和 算法学习专栏
  • 可以学习更多的关于C++/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁) 知识定位 人群定位
Python实战微信订餐小程序 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
Python量化交易实战 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️ 难度偏高 分享学习QT成品的视频播放器源码,需要有扎实的C++知识!
游戏爱好者九万人社区 互助/吹水 九万人游戏爱好者社区,聊天互助,白嫖奖品
Python零基础到入门 Python初学者 针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门

资料白嫖,温馨提示

关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!

请添加图片描述

你可能感兴趣的:(js逆向,javascript,前端,算法)