JS逆向入门案例-xx志愿服务网encData-05

概要

提示:仅供学习,不得用做商业交易,如有侵权请及时联系!

逆向:xx志愿服务网

URL:aHR0cDovL2NoaW5hdm9sdW50ZWVyLm1jYS5nb3YuY24vc2l0ZS9wcm9qZWN0

目标:表单数据中的 encData参数

在这里插入图片描述

整体架构流程

提示:分析-调试-猜想-实现-执行

1、直接开始全局搜索encData:
在这里插入图片描述
我们用鼠标去触发第二页:
在这里插入图片描述
我们打印这几个参数和方法,看看都是些什么:
在这里插入图片描述
上图我们发现有几个关键参数:key,iv,mode,encrypt,信息做多了js逆向人都知道,这肯定是一个aes或者des加密,我们猜测一下,来验证是不是标准加密:
在这里插入图片描述
发现与上图的结果不一致,那么肯定是魔改了!
2、这个时候我们只能进入S方法,看看里面都进行了什么操作,然后返回了对象从而调用encrypt方法的:
在这里插入图片描述
往上找,我们看看这个w方法在哪里:
在这里插入图片描述
我们发现w是一个自执行函数,上面n(“EKta”)有点像webpack来调用的:
在这里插入图片描述
3、w方法是在webpack里面加载对象的独立空间,那么我们可以将该对象里面的所有方法和变量都可以扣下来,然后缺什么补什么:
在这里插入图片描述
发现A没有定义,那么我们可以重新断点进入,看看里面是什么:
在这里插入图片描述
在这里插入图片描述
我们去断点发现断不住,那么我们直接进入方法里面去断点:
在这里插入图片描述

这里我们发现a方法其实是一个:Object.defineProperty,直接将a()改成这个!

在这里插入图片描述
继续补g方法:
在这里插入图片描述
我们可以看到其实g什么都没有做,就是赋了俩个值:
在这里插入图片描述
继续补b方法:
在这里插入图片描述
在这里插入图片描述
我们仔细看这个p会方法该方法其实就是刚刚的A方法:
在这里插入图片描述

	key: "stringToArrayBufferInUtf8",
        value: function(e) {
            var t = TextEncoder;
            return (new t).encode(e)
        }

打印继续看看缺啥:
在这里插入图片描述
继续补u对象,断点跳转进去扣下来:

var u = {
    encode: function(t) {
             return t.replace(/./g, function(t) {
                 var n = t.charCodeAt(0);
                 if (8364 == (r = n) || r <= 127 && r >= 0)
                     return encodeURIComponent(t);
                 var r, i = n.toString(16);
                 return 4 != i.length && (i = ("000" + i).match(/....$/)[0]),
                 e[i] || t
             })
         },
    decode: function(e) {
        return e.replace(/%[0-9A-F]{2}%[0-9A-F]{2}/g, function(e) {
            return e in t ? String.fromCharCode("0x" + t[e]) : e
        }).replace(/%[\w]{2}/g, function(e) {
            return decodeURIComponent(e)
        })
    }
}

在这里插入图片描述
发现缺少h对象,继续扣,断点跳转进去发现就是这三个方法:
在这里插入图片描述

	var h = {
    byteLength : function(e) {
        var t = f(e)
          , n = t[0]
          , r = t[1];
        return 3 * (n + r) / 4 - r
    },
    toByteArray : function(e) {
        var t, n, r = f(e), a = r[0], c = r[1], s = new o(function(e, t, n) {
            return 3 * (t + n) / 4 - n
        }(0, a, c)), l = 0, u = c > 0 ? a - 4 : a;
        for (n = 0; n < u; n += 4)
            t = i[e.charCodeAt(n)] << 18 | i[e.charCodeAt(n + 1)] << 12 | i[e.charCodeAt(n + 2)] << 6 | i[e.charCodeAt(n + 3)],
            s[l++] = t >> 16 & 255,
            s[l++] = t >> 8 & 255,
            s[l++] = 255 & t;
        2 === c && (t = i[e.charCodeAt(n)] << 2 | i[e.charCodeAt(n + 1)] >> 4,
        s[l++] = 255 & t);
        1 === c && (t = i[e.charCodeAt(n)] << 10 | i[e.charCodeAt(n + 1)] << 4 | i[e.charCodeAt(n + 2)] >> 2,
        s[l++] = t >> 8 & 255,
        s[l++] = 255 & t);
        return s
    },
    fromByteArray : function(e) {
        for (var t, n = e.length, i = n % 3, o = [], a = 0, c = n - i; a < c; a += 16383)
            o.push(l(e, a, a + 16383 > c ? c : a + 16383));
        1 === i ? (t = e[n - 1],
        o.push(r[t >> 2] + r[t << 4 & 63] + "==")) : 2 === i && (t = (e[n - 2] << 8) + e[n - 1],
        o.push(r[t >> 10] + r[t >> 4 & 63] + r[t << 2 & 63] + "="));
        return o.join("")
    }
}

在这里插入图片描述
继续断点补l方法:

	function l(e, t, n) {
            for (var i, o, a = [], c = t; c < n; c += 3)
                i = (e[c] << 16 & 16711680) + (e[c + 1] << 8 & 65280) + (255 & e[c + 2]),
                a.push(r[(o = i) >> 18 & 63] + r[o >> 12 & 63] + r[o >> 6 & 63] + r[63 & o]);
            return a.join("")
        }

发现缺少r对象:
在这里插入图片描述
断点发现r为一个数组值:
在这里插入图片描述
最后运行发现:
在这里插入图片描述
4、还有一种就是webpack的形式:
在这里插入图片描述
留着自己扣吧!

技术细节

提示:边更边扣,跟对地方

小结

提示:学习交流群:v:wzwzwz0613拉进群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值