js逆向 多js合并成的webpack

文章目录

  • 扣代码练习
    • 找加密的位置
    • 扣代码开始
    • 调用例子

扣代码练习

网站地址 https://web.ewt360.com/register/#/login?_k=4xcfi6

js逆向 多js合并成的webpack_第1张图片

找加密的位置

js逆向 多js合并成的webpack_第2张图片

y.Encrypy

已经找到关键了
就是把y对象提取出来即可

扣代码开始

js逆向 多js合并成的webpack_第3张图片

这里其实看到是AES加密

1、可以去找一个原生的AES加密,一般的网页都不会改写加密的

2、将加密部分的代码扣出来

今天是来解webpack的 所以继续

js逆向 多js合并成的webpack_第4张图片
把代码啦出来 折叠一下

加密部分在407,407里面又用到 408。。

中间嵌套的非常多。

所以我们选择把所有函数都拉下来

看看函数顶部的webpackJsonp 做了什么操作

!function(e) {
    var r = window.webpackJsonp;
    window.webpackJsonp = function(t, n) {
        for (var o, i, a = 0, c = []; a < t.length; a++)
            i = t[a],
            H[i] && c.push.apply(c, H[i]),
            H[i] = 0;
        for (o in n)
            Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);
        for (r && r(t, n); c.length; )
            c.shift().call(null, D);
        if (n[0])
            return x[0] = 0,
            D(0)
    }([])

e:就是一个空数组

n:传进来的函数对象 或者函数集合

然后看到和e有关的代码其实只有一行

Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);

这里是判断o是不是在n里面 如果是就在e中添加一个函数。

这里就是通过不断的调用webpackJsonp 把其他js的函数都放到e当中。

我们再根据Encrypy的断点 会走到

    var x = {}
      , H = {
        11: 0
    };
    function D(r) {
        if (x[r])
            return x[r].exports;
        var t = x[r] = {
            exports: {},
            id: r,
            loaded: !1,
            hot: function(e) {
                var r = {
                    _acceptedDependencies: {},
                    _declinedDependencies: {},
                    _selfAccepted: !1,
                    _selfDeclined: !1,
                    _disposeHandlers: [],
                    active: !0,
                    accept: function(e, t) {
                        if (void 0 === e)
                            r._selfAccepted = !0;
                        else if ("function" == typeof e)
                            r._selfAccepted = e;
                        else if ("object" == typeof e)
                            for (var n = 0; n < e.length; n++)
                                r._acceptedDependencies[e[n]] = t;
                        else
                            r._acceptedDependencies[e] = t
                    },
                    decline: function(e) {
                        if (void 0 === e)
                            r._selfDeclined = !0;
                        else if ("number" == typeof e)
                            r._declinedDependencies[e] = !0;
                        else
                            for (var t = 0; t < e.length; t++)
                                r._declinedDependencies[e[t]] = !0
                    },
                    dispose: function(e) {
                        r._disposeHandlers.push(e)
                    },
                    addDisposeHandler: function(e) {
                        r._disposeHandlers.push(e)
                    },
                    removeDisposeHandler: function(e) {
                        var t = r._disposeHandlers.indexOf(e);
                        t >= 0 && r._disposeHandlers.splice(t, 1)
                    },
                    check: g,
                    apply: j,
                    status: function(e) {
                        if (!e)
                            return s;
                        l.push(e)
                    },
                    addStatusHandler: function(e) {
                        l.push(e)
                    },
                    removeStatusHandler: function(e) {
                        var r = l.indexOf(e);
                        r >= 0 && l.splice(r, 1)
                    },
                    data: a[e]
                };
                return r
            }(r),
            parents: c,
            children: []
        };
        return e[r].call(t.exports, t, t.exports, function(e) {
            var r = x[e];
            if (!r)
                return D;
            var t = function(t) {
                return r.hot.active ? x[t] ? (x[t].parents.indexOf(e) < 0 && x[t].parents.push(e),
                r.children.indexOf(t) < 0 && r.children.push(t)) : c = [e] : (console.warn("[HMR] unexpected require(" + t + ") from disposed module " + e),
                c = []),
                D(t)
            };
            for (var o in D)
                Object.prototype.hasOwnProperty.call(D, o) && (n ? Object.defineProperty(t, o, function(e) {
                    return {
                        configurable: !0,
                        enumerable: !0,
                        get: function() {
                            return D[e]
                        },
                        set: function(r) {
                            D[e] = r
                        }
                    }
                }(o)) : t[o] = D[o]);
            function i(e, r) {
                "ready" === s && f("prepare"),
                v++,
                D.e(e, function() {
                    try {
                        r.call(null, t)
                    } finally {
                        v--,
                        "prepare" === s && (y[e] || _(e),
                        0 === v && 0 === h && m())
                    }
                })
            }

每次函数内调用r(407) 都会走进到这个d的call方法中。

我们简单的改写一下,不知道大家能不能理解

//加载器
s = []
!(function (i) {
    function n(t) {
        
        if (s[t])
            return s[t].exports;
        var e = s[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        return i[t].call(e.exports, e, e.exports, n),
            e.l = !0,
            e.exports
    }

    en = n;
})(tempArray)

tempArray简单来说 就是前面的e集合

var tempArray = []

!function (e) {
    var r = window.webpackJsonp;
 window.webpackJsonp = function (t, n) {
        
        for (o in n)
            Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);
       
    }
}(tempArray)

我们通过这样不断去收集函数

再用加载器去生成一个en可使用的对象

调用例子

js逆向 多js合并成的webpack_第5张图片
看到407里面已经有加密的方法了

在这里插入图片描述

成功加密

你可能感兴趣的:(爬虫,爬虫反爬)