网站地址 https://web.ewt360.com/register/#/login?_k=4xcfi6
y.Encrypy
已经找到关键了
就是把y对象提取出来即可
这里其实看到是AES加密
1、可以去找一个原生的AES加密,一般的网页都不会改写加密的
2、将加密部分的代码扣出来
今天是来解webpack的 所以继续
加密部分在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可使用的对象
成功加密