吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3190|回复: 21
收起左侧

[Web逆向] 【原创】 猿人学第一题解析

  [复制链接]
cainfish 发表于 2022-12-13 22:16
本文适合像我一样得小白,大牛请略过,主要是记录,哈哈哈。一、 发现一个练手的好地方
              昨日在浏览论坛的时候,发现大牛 发了一个帖子 猿人学第二题 手把手补环境
链接地址:猿人学第2题手把手补环境 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
image.png

依照Anekys 大牛提供的地址,进入之后返现者的是个练手的好地方,哈哈哈,js解密过程中,能遇到的问题,几乎在这边全部遇到了。并且还有解题排名,膜拜各种大牛的机会


二、 正式开始
      2.1 过掉debugger 分析页面
           首先看第一题
image.png


要求是获取机票的平均价格,填入答案。
依照国际管理,F12,开发者工具,ctrl+shift+r 重新加载页面,不出意外的界面停止在debugger
image.png
直接在第二行除邮件编辑断点  值填写false,过掉debugger。
       2.2  依次点击每一页的值查看,请求值变化
第一页  /api/match/1?m=5c70fb1948228fdf84f74568b037fa11|81671008953
第二页 /api/match/1?page=2&m=922c0993d9df7bc038a09470c17d5901|81671009628
第三页 api/match/1?page=3&m=e9526008c0fde5ba4e4499ec78289239|81671032379

                不难看出请求不能的页面出了添加了page的参数外,m的值发生了变化,如果在全局搜索里面搜索m的话,这个值太多了
直接去启动器中查看堆栈调用
forum.png

排除掉ajax 后,第一个就是request函数了,点击函数进入源代码区查看。
image.png
2.3   解密混淆和加密得js代码
js代码被加密混淆了,在线搜索js解密工具,其实不解密也能看,但是阅读的难度就比较高了。
解码后得到
[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
window['url'] = '/api/' + 'match' + '/1',
    request = function() {
        var _0x2268f9 = Date['parse'](new Date()) + (16798545 + -72936737 + 156138192),
            _0x57feae = oo0O0(_0x2268f9['toStr' + 'ing']()) + window['f'];
        const _0x5d83a3 = {};
        _0x5d83a3['page'] = window['page'],
            _0x5d83a3['m'] = _0x57feae + '丨' + _0x2268f9 / (-1 * 3483 + -9059 + 13542);             //  看到m出现了
        var _0xb89747 = _0x5d83a3;
        $['ajax']({
            'url': window['url'],
            'dataType': 'json',
            'async': ![],
            'data': _0xb89747,
            'type': 'GET',
            'beforeSend': function(_0x4c488e) {},
            'success': function(_0x131e59) {
                _0x131e59 = _0x131e59['data'];
                let _0x354583 = '',
                    _0x1b89ba = '<div ' + 'class' + '="b-a' + 'irfly' + '"><di' + 'v cla' + 'ss="e' + '-airf' + 'ly"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0"><' + 'div c' + 'lass=' + '"col-' + 'trip"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0"><d' + 'iv cl' + 'ass="' + 's-tri' + 'p"dat' + 'a-rea' + 'ctid=' + '".1.3' + '.3.2.' + '0.$KN' + '5911.' + '0.0.0' + '"><di' + 'v cla' + 'ss="c' + 'ol-ai' + 'rline' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '0"><d' + 'iv cl' + 'ass="' + 'd-air' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '0.0:$' + '0"><d' + 'iv cl' + 'ass="' + 'air"d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.0.' + '0:$0.' + '0"><s' + 'pan d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.0.' + '0:$0.' + '0.1">' + '中国联合航' + '空</sp' + 'an></' + 'div><' + 'div c' + 'lass=' + '"num"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.0' + '.0:$0' + '.1"><' + 'span ' + 'class' + '="n"d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.0.' + '0:$0.' + '1.0">' + 'KN591' + '1</sp' + 'an><s' + 'pan c' + 'lass=' + '"n"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.0.' + '0.0.0' + ':$0.1' + '.1">波' + '音737(' + '中)</s' + 'pan><' + 'noscr' + 'ipt d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.0.' + '0:$0.' + '1.2">' + '</nos' + 'cript' + '></di' + 'v></d' + 'iv><n' + 'oscri' + 'pt da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.0.' + '0.0.1' + '"></n' + 'oscri' + 'pt></' + 'div><' + 'div c' + 'lass=' + '"col-' + 'time"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.1' + '"><di' + 'v cla' + 'ss="s' + 'ep-lf' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.0">' + '<h2 d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + ('2.0.$' + 'KN591' + '1.0.0' + '.0.1.' + '0.0">' + '13:50' + '</h2>' + '<p cl' + 'ass="' + 'airpo' + 'rt"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.0.' + '0.1.0' + '.1"><' + 'span ' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.1' + '.0.1.' + '0">大兴' + '国际机场<' + '/span' + '><spa' + 'n dat' + 'a-rea' + 'ctid=' + '".1.3' + '.3.2.' + '0.$KN' + '5911.' + '0.0.0' + '.1.0.' + '1.1">' + '</spa' + 'n></p' + '></di' + 'v><di' + 'v cla' + 'ss="s' + 'ep-ct' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.1">' + '<div ' + 'class' + '="ran' + 'ge"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.0.' + '0.1.1' + '.0">3' + '小时40分' + '钟</di' + 'v><di' + 'v cla' + 'ss="l' + 'ine"d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.1.' + '1.1">' + '</div' + '></di' + 'v><di' + 'v cla' + 'ss="s' + 'ep-rt' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.2">' + '<nosc' + 'ript ' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.1' + '.2.0"' + '></no' + 'scrip' + 't><h2' + ' data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.2.1' + '">17:' + '30</h' + '2><p ' + 'class' + '="air' + 'port"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.1' + '.2.2"' + '><spa' + 'n dat' + 'a-rea' + 'ctid=' + '".1.3' + '.3.2.' + '0.$KN' + '5911.' + '0.0.0' + '.1.2.' + '2.0">' + '宝安机场<' + '/span' + '></p>' + '</div' + '><nos' + 'cript' + ' data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.3">' + '</nos' + 'cript' + '></di' + 'v></d' + 'iv></' + 'div><' + 'div c' + 'lass=' + '"col-' + 'price' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.1"><' + 'p cla' + 'ss="p' + 'rc"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.1.' + '0"><s' + 'pan d' + 'ata-r' + 'eacti' + 'd=".1') + ('.3.3.' + '2.0.$' + 'KN591' + '1.0.1' + '.0.0"' + '><i c' + 'lass=' + '"rmb"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '1.0.0' + '.0">&' + 'yen;<' + '/i><s' + 'pan c' + 'lass=' + '"fix_' + 'price' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.1.0.' + '0.1">' + '<span' + ' clas' + 's="pr' + 'c_wp"' + 'style' + '="wid' + 'th:48' + 'px">p' + 'rice_' + 'sole<' + '/span' + '></sp' + 'an></' + 'span>' + '</p><' + 'div c' + 'lass=' + '"vim"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '1.1">' + '<span' + ' clas' + 's="v ' + 'dis"d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.1' + '.1.$0' + '"></s' + 'pan><' + '/div>' + '</div' + '><div' + ' clas' + 's="co' + 'l-fol' + 'd"dat' + 'a-rea' + 'ctid=' + '".1.3' + '.3.2.' + '0.$KN' + '5911.' + '0.2">' + '<p cl' + 'ass="' + 'fd"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.2.' + '0">收起' + '</p><' + '/div>' + '</div' + '><nos' + 'cript' + ' data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.1' + '"></n' + 'oscri' + 'pt></' + 'div>'),
                    _0x548377 = ['中国南方航' + '空', '吉祥航空', '奥凯航空', '九元航空', '长龙航空', '东方航空', '中国国际航' + '空', '深圳航空', '海南航空', '春秋航空', '上海航空', '西部航空', '重庆航空', '西藏航空', '中国联合航' + '空', '云南祥鹏航' + '空', '云南英安航' + '空', '厦门航空', '天津航空', '山东航空', '四川航空', '华夏航空', '长城航空', '成都航空有', '北京首都航' + '空', '中华航空', '意大利国家' + '航空公司', '印度百捷航' + '空', '越南航空', '远东航空', '印度航空公' + '司', '印度捷特航' + '空有限公司', '以色列航空' + '公司', '意大利航空', '伊朗航空公' + '司', '印度尼西亚' + '鹰航空公司', '英国航空公' + '司', '西方天空航' + '空', '西捷航空', '西班牙欧洲' + '航空公司', '西班牙航空' + '公司', '中国南方航' + '空', '吉祥航空', '奥凯航空', '九元航空', '长龙航空', '东方航空', '中国国际航' + '空', '深圳航空', '海南航空', '春秋航空', '上海航空', '西部航空', '重庆航空', '西藏航空', '中国联合航' + '空', '云南祥鹏航' + '空', '云南英安航' + '空', '厦门航空', '天津航空', '山东航空', '四川航空', '华夏航空', '长城航空', '成都航空有', '北京首都航' + '空', '中华航空', '意大利国家' + '航空公司', '印度百捷航' + '空', '越南航空', '远东航空', '印度航空公' + '司', '印度捷特航' + '空有限公司', '以色列航空' + '公司', '意大利航空', '伊朗航空公' + '司', '印度尼西亚' + '鹰航空公司', '英国航空公' + '司', '西方天空航' + '空', '西捷航空', '西班牙欧洲' + '航空公司', '西班牙航空' + '公司'],
                    _0x5286d2 = 22 * 251 + -1721 + -3800,
                    _0xa24ff9 = ['北京首都国' + '际机场', '上海虹桥国' + '际机场', '上海浦东国' + '际机场', '天津滨海国' + '际机场', '太原武宿机' + '场', '呼和浩特白' + '塔机场', '沈阳桃仙国' + '际机场', '大连周水子' + '国际机场', '长春大房身' + '机场', '哈尔滨阎家' + '岗国际机场', '齐齐哈尔三' + '家子机场', '佳木斯东郊' + '机场', '厦门高崎国' + '际机场', '福州长乐国' + '际机场', '杭州萧山国' + '际机场', '合肥骆岗机' + '场', '宁波栎社机' + '场', '南京禄口国' + '际机场', '广州白云国' + '际机场', '深圳宝安国' + '际机场', '长沙黄花机' + '场', '海口美亚机' + '场', '武汉天河机' + '场', '济南遥墙机' + '场', '青岛流亭机' + '场', '南宁吴墟机' + '场', '三亚凤凰国' + '际机场', '重庆江北国' + '际机场', '成都双流国' + '际机场', '昆明巫家坝' + '国际机场', '昆明长水国' + '际机场', '桂林两江国' + '际机场', '西安咸阳国' + '际机场', '兰州中川机' + '场', '贵阳龙洞堡' + '机场', '拉萨贡嘎机' + '场', '乌鲁木齐地' + '窝堡机场', '南昌向塘机' + '场', '郑州新郑机' + '场', '北京首都国' + '际机场', '上海虹桥国' + '际机场', '上海浦东国' + '际机场', '天津滨海国' + '际机场', '太原武宿机' + '场', '呼和浩特白' + '塔机场', '沈阳桃仙国' + '际机场', '大连周水子' + '国际机场', '长春大房身' + '机场', '哈尔滨阎家' + '岗国际机场', '齐齐哈尔三' + '家子机场', '佳木斯东郊' + '机场', '厦门高崎国' + '际机场', '福州长乐国' + '际机场', '杭州萧山国' + '际机场', '合肥骆岗机' + '场', '宁波栎社机' + '场', '南京禄口国' + '际机场', '广州白云国' + '际机场', '深圳宝安国' + '际机场', '长沙黄花机' + '场', '海口美亚机' + '场', '武汉天河机' + '场', '济南遥墙机' + '场', '青岛流亭机' + '场', '南宁吴墟机' + '场', '三亚凤凰国' + '际机场', '重庆江北国' + '际机场', '成都双流国' + '际机场', '昆明巫家坝' + '国际机场', '昆明长水国' + '际机场', '桂林两江国' + '际机场', '西安咸阳国' + '际机场', '兰州中川机' + '场', '贵阳龙洞堡' + '机场', '拉萨贡嘎机' + '场', '乌鲁木齐地' + '窝堡机场', '南昌向塘机' + '场', '郑州新郑机' + '场'];
                if (window['page']) {} else
                    window['page'] = 2333 * 3 + 458 * -5 + -4708;
                $['each'](_0x131e59, function(_0x282f1d, _0x4e0853) {
                        _0x354583 += _0x1b89ba['repla' + 'ce']('price' + '_sole', _0x4e0853['value'])['repla' + 'ce']('中国联合航' + '空', _0x548377[_0x5286d2 * window['page']])['repla' + 'ce']('大兴国际', _0xa24ff9[parseInt(_0x5286d2 * window['page'] / (659 + 785 * -7 + 4838)) + (5666 * 1 + 2 * -4161 + 2657)])['repla' + 'ce']('宝安机场', _0xa24ff9[_0xa24ff9['lengt' + 'h'] - parseInt(_0x5286d2 * window['page'] / (8357 + -323 * 1 + -8032)) - (350 + -9 * 295 + 2306)]),
                            _0x5286d2 += -156 * -53 + -78 * -111 + -16925;
                    }),
                    $('.m-ai' + 'rfly-' + 'lst')['text']('')['appen' + 'd'](_0x354583);
            },
            'complete': function() {},
            'error': function() {
                alert('数据拉取失' + '败。可能是' + '触发了风控' + '系统,若您' + '是正常访问' + ',请使用谷' + '歌浏览器无' + '痕模式,并' + '且校准电脑' + '的系统时间' + '重新尝试'),
                    alert('生而为虫,' + '我很抱歉,' + '请刷新页面' + ',查看问题' + '是否存在'),
                    $('.page' + '-mess' + 'age')['eq'](17 * -94 + 1014 + -4 * -146)['addCl' + 'ass']('activ' + 'e'),
                    $('.page' + '-mess' + 'age')['remov' + 'eClas' + 's']('activ' + 'e');
            }
        });
    },
    request();


虽然还是有加密的内容,但是我们看到了需要的关键数据 page 和 m的出现  并且后面又是ajax,推断加密代码就在前面几行,对照加密数据设置断点。
image.png
果然断在了断点处,步进查看变化。
小技巧:如果数值看不懂得,可以直接在控制台输入之后;
image.png

继续往下走,跳转到了第一页 页面自身得 javascript  ,因为页面是一行超级长,复制出来,格式化以便理解。
image.png

继续安利,哈哈哈,我举得我更像一个分享up主。
删除掉不要得之后,发现了管家加密函数---------          oo0O0  是的就是这个狗东西。
image.png

请注意后面那个孤零零得箭头,就是她使我走向了一条没有尽头得路。

三、 解密关键函数
上文说到,window['\x66']  \x66 就是f啦,解密后的函数有表明,在跟进 关键解密函数 oo0O0  后,函数内容如下:
[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
function oo0O0(mw) {
    window.b = '';
    for (var i = 0, len = window.a.length; i < len; i++) {
        console.log(window.a[i]);
        window.b += String[document.e + document.g](window.a[i][document.f + document.h]() - i - window.c)
    }
    var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];
    var J = function (o, E) {
        o = o - 0x0;
        var N = U[o];
        if (J['bSSGte'] === undefined) {
            var Y = function (w) {
                var m = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=',
                T = String(w)['replace'](/=+$/, '');
                var A = '';
                for (var C = 0x0, b, W, l = 0x0; W = T['charAt'](l++); ~W && (b = C % 0x4 ? b * 0x40 + W : W, C++ % 0x4) ? A += String['fromCharCode'](0xff & b >> (-0x2 * C & 0x6)) : 0x0) {
                    W = m['indexOf'](W)
                }
                return A
            };
            var t = function (w, m) {
                var T = [],
                A = 0x0,
                C,
                b = '',
                W = '';
                w = Y(w);
                for (var R = 0x0, v = w['length']; R < v; R++) {
                    W += '%' + ('00' + w['charCodeAt'](R)['toString'](0x10))['slice'](-0x2)
                }
                w = decodeURIComponent(W);
                var l;
                for (l = 0x0; l < 0x100; l++) {
                    T[l] = l
                }
                for (l = 0x0; l < 0x100; l++) {
                    A = (A + T[l] + m['charCodeAt'](l % m['length'])) % 0x100,
                    C = T[l],
                    T[l] = T[A],
                    T[A] = C
                }
                l = 0x0,
                A = 0x0;
                for (var L = 0x0; L < w['length']; L++) {
                    l = (l + 0x1) % 0x100,
                    A = (A + T[l]) % 0x100,
                    C = T[l],
                    T[l] = T[A],
                    T[A] = C,
                    b += String['fromCharCode'](w['charCodeAt'](L) ^ T[(T[l] + T[A]) % 0x100])
                }
                return b
            };
            J['luAabU'] = t,
            J['qlVPZg'] = {},
            J['bSSGte'] = !![]
        }
        var H = J['qlVPZg'][o];
        return H === undefined ? (J['TUDBIJ'] === undefined && (J['TUDBIJ'] = !![]), N = J['luAabU'](N, E), J['qlVPZg'][o] = N) : N = H,
        N
    };
    eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
    return ''
}

看到函数定义后  马上定义了一个,window.b , window.b得值 是通过windows.a.length(长度)for 循环后计算得出,那么window.a的值是从哪里得来得呢,全局搜索后 window.a ,发现在自身页面得js中有定义。
嘿嘿,正道得光………………
image.png

第一个就在第一行,但是这一行也是超级长得,浏览器自带得格式化不管用,怎么操作不用我说了吧,嘿嘿,刚安利得工具。
image.png
看到了windows.a  但是貌似是乱码,控制台一下,window.a
image.png
也是存在各种各样得符号,监控一次此时得windows.b,
image.png
值越来越多了,哈哈哈,正道得光又要来了……
不仅仅在第一页找到了,window.a 连window.c 等等参与运算的,全部都找到了。
image.png
感觉自己离真相越来越近了。
image.png
image.png
在关键函数的下一行下断点,放开跑到断点之前,我们需要的m的值已经找到了。
image.png
此时我们也已经获得了window.b的全部值。
在我们解密后的关键函数中,看到window.b 有个atob ,百度一下
  • atob() //ASCII to Base64
  • btoa() //Base64 to ASCII
atob() 函数能够解码通过base-64编码的字符串数据。相反地,btoa() 函数能够从二进制数据“字符串”创建一个base-64编码的ASCII字符串。
反正不懂就找百度,控制到运行 atob(windows['b'])
image.png
得到了另外一串js代码,观察发现貌似是md5加密的,放进wt里面跑一下(WT是个js调试工具,貌似也是吾爱大神弄出来的,在这里致敬一下,我等匹夫只能用下别人的工具了,做个工具小子吧)。
还记得那个孤独的箭头吗 ,对的,window['f']哪里。
image.png
至此我们终于找到了,真正的加密代码。
[JavaScript] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
var hexcase = 0;
var b64pad = "";
var chrsz = 16;
 
function hex_md5(a) {
    return binl2hex(core_md5(str2binl(a), a.length * chrsz))
}
 
function b64_md5(a) {
    return binl2b64(core_md5(str2binl(a), a.length * chrsz))
}
 
function str_md5(a) {
    return binl2str(core_md5(str2binl(a), a.length * chrsz))
}
 
function hex_hmac_md5(a, b) {
    return binl2hex(core_hmac_md5(a, b))
}
 
function b64_hmac_md5(a, b) {
    return binl2b64(core_hmac_md5(a, b))
}
 
function str_hmac_md5(a, b) {
    return binl2str(core_hmac_md5(a, b))
}
 
function md5_vm_test() {
    return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"
}
 
function core_md5(p, k) {
    p[k >> 5] |= 128 << ((k) % 32);
    p[(((k + 64) >>> 9) << 4) + 14] = k;
    var o = 1732584193;
    var n = -271733879;
    var m = -1732584194;
    var l = 271733878;
    for (var g = 0; g < p.length; g += 16) {
        var j = o;
        var h = n;
        var f = m;
        var e = l;
        o = md5_ff(o, n, m, l, p[g + 0], 7, -680976936);
        l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586);
        m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819);
        n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330);
        o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897);
        l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426);
        m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341);
        n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983);
        o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416);
        l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417);
        m = md5_ff(m, l, o, n, p[g + 10], 17, -42063);
        n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162);
        o = md5_ff(o, n, m, l, p[g + 12], 7, 1804660682);
        l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101);
        m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290);
        n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329);
        o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510);
        l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632);
        m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713);
        n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302);
        o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691);
        l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083);
        m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335);
        n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848);
        o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438);
        l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690);
        m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961);
        n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501);
        o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467);
        l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784);
        m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473);
        n = md5_gg(n, m, l, o, p[g + 12], 20, -1921207734);
        o = md5_hh(o, n, m, l, p[g + 5], 4, -378558);
        l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463);
        m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562);
        n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556);
        o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060);
        l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353);
        m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632);
        n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640);
        o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174);
        l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222);
        m = md5_hh(m, l, o, n, p[g + 3], 16, -722881979);
        n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189);
        o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487);
        l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835);
        m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520);
        n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651);
        o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844);
        l = md5_ii(l, o, n, m, p[g + 7], 10, 11261161415);
        m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905);
        n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055);
        o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571);
        l = md5_ii(l, o, n, m, p[g + 3], 10, -1894446606);
        m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523);
        n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799);
        o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359);
        l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744);
        m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380);
        n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649);
        o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070);
        l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379);
        m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259);
        n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551);
        o = safe_add(o, j);
        n = safe_add(n, h);
        m = safe_add(m, f);
        l = safe_add(l, e)
    }
    return Array(o, n, m, l)
}
 
function md5_cmn(h, e, d, c, g, f) {
    return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)
}
 
function md5_ff(g, f, k, j, e, i, h) {
    return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)
}
 
function md5_gg(g, f, k, j, e, i, h) {
    return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)
}
 
function md5_hh(g, f, k, j, e, i, h) {
    return md5_cmn(f ^ k ^ j, g, f, e, i, h)
}
 
function md5_ii(g, f, k, j, e, i, h) {
    return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)
}
 
function core_hmac_md5(c, f) {
    var e = str2binl(c);
    if (e.length > 16) {
        e = core_md5(e, c.length * chrsz)
    }
    var a = Array(16),
        d = Array(16);
    for (var b = 0; b < 16; b++) {
        a[b] = e[b] ^ 909522486;
        d[b] = e[b] ^ 1549556828
    }
    var g = core_md5(a.concat(str2binl(f)), 512 + f.length * chrsz);
    return core_md5(d.concat(g), 512 + 128)
}
 
function safe_add(a, d) {
    var c = (a & 65535) + (d & 65535);
    var b = (a >> 16) + (d >> 16) + (c >> 16);
    return (b << 16) | (c & 65535)
}
 
function bit_rol(a, b) {
    return (a << b) | (a >>> (32 - b))
}
 
function str2binl(d) {
    var c = Array();
    var a = (1 << chrsz) - 1;
    for (var b = 0; b < d.length * chrsz; b += chrsz) {
        c[b >> 5] |= (d.charCodeAt(b / chrsz) & a) << (b % 32)
    }
    return c
}
 
function binl2str(c) {
    var d = "";
    var a = (1 << chrsz) - 1;
    for (var b = 0; b < c.length * 32; b += chrsz) {
        d += String.fromCharCode((c[b >> 5] >>> (b % 32)) & a)
    }
    return d
}
 
function binl2hex(c) {
    var b = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    var d = "";
    for (var a = 0; a < c.length * 4; a++) {
        d += b.charAt((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c[a >> 2] >> ((a % 4) * 8)) & 15)
    }
    return d
}
 
function binl2b64(d) {
    var c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var f = "";
    for (var b = 0; b < d.length * 4; b += 3) {
        var e = (((d[b >> 2] >> 8 * (b % 4)) & 255) << 16) | (((d[b + 1 >> 2] >> 8 * ((b + 1) % 4)) & 255) << 8) | ((d[b + 2 >> 2] >> 8 * ((b + 2) % 4)) & 255);
        for (var a = 0; a < 4; a++) {
            if (b * 8 + a * 6 > d.length * 32) {
                f += b64pad
            } else {
                f += c.charAt((e >> 6 * (3 - a)) & 63)
            }
        }
    }
    return f
};

验证一下是否正确
image.png image.png

哦吼,是一致的,那么说明,我们找的的加密函数是正确的,挖哈哈哈哈哈!!
四、关于算法
            算法也是挺简单的,
            1.  首先生成一个时间戳
            2.  用hex_md5()函数加密时间戳,
            3.  用时间戳除以1000 得到后面的值,
别问我为什么指导的,下一句就是,哈哈哈。
image.png

具体的就不写了哈,后续有时间在写python的实现。发现写文章还挺浪费时间,但是还是想把这些分享出来,给像我一样的小白避坑!!!
image.png
image.png
image.png
image.png

免费评分

参与人数 3吾爱币 +9 热心值 +2 收起 理由
涛之雨 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
yp17792351859 + 1 + 1 用心讨论,共获提升!
gongkong + 1 感谢楼主分享

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

jgjackson 发表于 2025-1-2 18:18
本帖最后由 jgjackson 于 2025-1-2 18:27 编辑

我才是真的小白,抄作业都抄得磕磕绊绊。交上作业
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import time
import execjs
import requests
 
js_code = 'var hexcase=0;var b64pad="";var chrsz=16;function hex_md5(a){return binl2hex(core_md5(str2binl(a),a.length*chrsz))}function b64_md5(a){return binl2b64(core_md5(str2binl(a),a.length*chrsz))}function str_md5(a){return binl2str(core_md5(str2binl(a),a.length*chrsz))}function hex_hmac_md5(a,b){return binl2hex(core_hmac_md5(a,b))}function b64_hmac_md5(a,b){return binl2b64(core_hmac_md5(a,b))}function str_hmac_md5(a,b){return binl2str(core_hmac_md5(a,b))}function md5_vm_test(){return hex_md5("abc")=="900150983cd24fb0d6963f7d28e17f72"}function core_md5(p,k){p[k>>5]|=128<<((k)%32);p[(((k+64)>>>9)<<4)+14]=k;var o=1732584193;var n=-271733879;var m=-1732584194;var l=271733878;for(var g=0;g<p.length;g+=16){var j=o;var h=n;var f=m;var e=l;o=md5_ff(o,n,m,l,p[g+0],7,-680976936);l=md5_ff(l,o,n,m,p[g+1],12,-389564586);m=md5_ff(m,l,o,n,p[g+2],17,606105819);n=md5_ff(n,m,l,o,p[g+3],22,-1044525330);o=md5_ff(o,n,m,l,p[g+4],7,-176418897);l=md5_ff(l,o,n,m,p[g+5],12,1200080426);m=md5_ff(m,l,o,n,p[g+6],17,-1473231341);n=md5_ff(n,m,l,o,p[g+7],22,-45705983);o=md5_ff(o,n,m,l,p[g+8],7,1770035416);l=md5_ff(l,o,n,m,p[g+9],12,-1958414417);m=md5_ff(m,l,o,n,p[g+10],17,-42063);n=md5_ff(n,m,l,o,p[g+11],22,-1990404162);o=md5_ff(o,n,m,l,p[g+12],7,1804660682);l=md5_ff(l,o,n,m,p[g+13],12,-40341101);m=md5_ff(m,l,o,n,p[g+14],17,-1502002290);n=md5_ff(n,m,l,o,p[g+15],22,1236535329);o=md5_gg(o,n,m,l,p[g+1],5,-165796510);l=md5_gg(l,o,n,m,p[g+6],9,-1069501632);m=md5_gg(m,l,o,n,p[g+11],14,643717713);n=md5_gg(n,m,l,o,p[g+0],20,-373897302);o=md5_gg(o,n,m,l,p[g+5],5,-701558691);l=md5_gg(l,o,n,m,p[g+10],9,38016083);m=md5_gg(m,l,o,n,p[g+15],14,-660478335);n=md5_gg(n,m,l,o,p[g+4],20,-405537848);o=md5_gg(o,n,m,l,p[g+9],5,568446438);l=md5_gg(l,o,n,m,p[g+14],9,-1019803690);m=md5_gg(m,l,o,n,p[g+3],14,-187363961);n=md5_gg(n,m,l,o,p[g+8],20,1163531501);o=md5_gg(o,n,m,l,p[g+13],5,-1444681467);l=md5_gg(l,o,n,m,p[g+2],9,-51403784);m=md5_gg(m,l,o,n,p[g+7],14,1735328473);n=md5_gg(n,m,l,o,p[g+12],20,-1921207734);o=md5_hh(o,n,m,l,p[g+5],4,-378558);l=md5_hh(l,o,n,m,p[g+8],11,-2022574463);m=md5_hh(m,l,o,n,p[g+11],16,1839030562);n=md5_hh(n,m,l,o,p[g+14],23,-35309556);o=md5_hh(o,n,m,l,p[g+1],4,-1530992060);l=md5_hh(l,o,n,m,p[g+4],11,1272893353);m=md5_hh(m,l,o,n,p[g+7],16,-155497632);n=md5_hh(n,m,l,o,p[g+10],23,-1094730640);o=md5_hh(o,n,m,l,p[g+13],4,681279174);l=md5_hh(l,o,n,m,p[g+0],11,-358537222);m=md5_hh(m,l,o,n,p[g+3],16,-722881979);n=md5_hh(n,m,l,o,p[g+6],23,76029189);o=md5_hh(o,n,m,l,p[g+9],4,-640364487);l=md5_hh(l,o,n,m,p[g+12],11,-421815835);m=md5_hh(m,l,o,n,p[g+15],16,530742520);n=md5_hh(n,m,l,o,p[g+2],23,-995338651);o=md5_ii(o,n,m,l,p[g+0],6,-198630844);l=md5_ii(l,o,n,m,p[g+7],10,11261161415);m=md5_ii(m,l,o,n,p[g+14],15,-1416354905);n=md5_ii(n,m,l,o,p[g+5],21,-57434055);o=md5_ii(o,n,m,l,p[g+12],6,1700485571);l=md5_ii(l,o,n,m,p[g+3],10,-1894446606);m=md5_ii(m,l,o,n,p[g+10],15,-1051523);n=md5_ii(n,m,l,o,p[g+1],21,-2054922799);o=md5_ii(o,n,m,l,p[g+8],6,1873313359);l=md5_ii(l,o,n,m,p[g+15],10,-30611744);m=md5_ii(m,l,o,n,p[g+6],15,-1560198380);n=md5_ii(n,m,l,o,p[g+13],21,1309151649);o=md5_ii(o,n,m,l,p[g+4],6,-145523070);l=md5_ii(l,o,n,m,p[g+11],10,-1120210379);m=md5_ii(m,l,o,n,p[g+2],15,718787259);n=md5_ii(n,m,l,o,p[g+9],21,-343485551);o=safe_add(o,j);n=safe_add(n,h);m=safe_add(m,f);l=safe_add(l,e)}return Array(o,n,m,l)}function md5_cmn(h,e,d,c,g,f){return safe_add(bit_rol(safe_add(safe_add(e,h),safe_add(c,f)),g),d)}function md5_ff(g,f,k,j,e,i,h){return md5_cmn((f&k)|((~f)&j),g,f,e,i,h)}function md5_gg(g,f,k,j,e,i,h){return md5_cmn((f&j)|(k&(~j)),g,f,e,i,h)}function md5_hh(g,f,k,j,e,i,h){return md5_cmn(f^k^j,g,f,e,i,h)}function md5_ii(g,f,k,j,e,i,h){return md5_cmn(k^(f|(~j)),g,f,e,i,h)}function core_hmac_md5(c,f){var e=str2binl(c);if(e.length>16){e=core_md5(e,c.length*chrsz)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=core_md5(a.concat(str2binl(f)),512+f.length*chrsz);return core_md5(d.concat(g),512+128)}function safe_add(a,d){var c=(a&65535)+(d&65535);var b=(a>>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<<b)|(a>>>(32-b))}function str2binl(d){var c=Array();var a=(1<<chrsz)-1;for(var b=0;b<d.length*chrsz;b+=chrsz){c[b>>5]|=(d.charCodeAt(b/chrsz)&a)<<(b%32)}return c}function binl2str(c){var d="";var a=(1<<chrsz)-1;for(var b=0;b<c.length*32;b+=chrsz){d+=String.fromCharCode((c[b>>5]>>>(b%32))&a)}return d}function binl2hex(c){var b=hexcase?"0123456789ABCDEF":"0123456789abcdef";var d="";for(var a=0;a<c.length*4;a++){d+=b.charAt((c[a>>2]>>((a%4)*8+4))&15)+b.charAt((c[a>>2]>>((a%4)*8))&15)}return d}function binl2b64(d){var c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var f="";for(var b=0;b<d.length*4;b+=3){var e=(((d[b>>2]>>8*(b%4))&255)<<16)|(((d[b+1>>2]>>8*((b+1)%4))&255)<<8)|((d[b+2>>2]>>8*((b+2)%4))&255);for(var a=0;a<4;a++){if(b*8+a*6>d.length*32){f+=b64pad}else{f+=c.charAt((e>>6*(3-a))&63)}}}return f};'
 
if __name__ == '__main__':
 
    total = 0
    count = 0
    for i in range(1, 6):
        timestamp = int(time.time()) * 1000 + 100000000
        # 通过compile命令转成一个js对象
        js = execjs.compile(js_code)
        # 调用function ==> 调用的方法名, 参数1  参数2 ...
        window_f = js.call('hex_md5', str(timestamp))
        m = window_f + "丨" + str(int(timestamp / 1000))
        data = {"m": m, "page": i}
        url = f"https://match.yuanrenxue.cn/api/match/1"
        print(url)
        response_json = requests.get(url=url, params=data).json()
        print(response_json)
        content = response_json['data']
        for a in content:
            total = a['value'] + total
            count = 1 + count
    average = total / count
    print(average)
 楼主| cainfish 发表于 2022-12-18 15:23
看床走不动路 发表于 2022-12-17 15:00
感谢分享!
直接在这一步“直接在第二行除邮件编辑断点  值填写false,过掉debugger”卡住不动如山{:301_1 ...

我刚才特地测试了一下,不会卡啊,你看下你的浏览器,最好ctrl+shift+N,创建一个无痕模式的浏览器,这样浏览器不加载其他插件,可能就不会卡了。
tongyan 发表于 2022-12-16 14:17
ghx230011 发表于 2022-12-16 15:46
厉害,厉害,真棒~我就是学不会
 楼主| cainfish 发表于 2022-12-16 16:58
其实这里有个误区,那个关键解密函数return 的是个空值,真正有用的是atob(window.b),并且window。b 页面加载完之后,就能atob了
qq11xx 发表于 2022-12-16 17:54
感谢分享
 楼主| cainfish 发表于 2022-12-17 01:23
是不是大神太多了,没人看。嘎嘎,看来要练习技术了,写点牛逼的!
0755sz 发表于 2022-12-17 09:30
谢谢楼主分享
tpl633 发表于 2022-12-17 12:29
牛逼,看得头大,哈哈
看床走不动路 发表于 2022-12-17 15:00
感谢分享!
直接在这一步“直接在第二行除邮件编辑断点  值填写false,过掉debugger”卡住不动如山
 楼主| cainfish 发表于 2022-12-17 21:29
感谢大家的评论,最近在学习JavaScript,到时后更新更多的文章给大家。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-1 07:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表