JS逆向关于Webpack的学习
Webpack打包介绍
——RUNOOB-Webpack入门教程
Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。
——知乎-什么是webpack
webpack是一个打包器(bundler),它能将多个js文件打包成一个文件(其实不止能打包js文件,也能打包其他类型的文件,比如css文件,json文件等)。
可以查看官方文档,官方文档也明确表明webpack是一个打包器:
但是webpack不是一个翻译器,它只能理解诸如"imort"、"from"等模块导入语句,其他的JS语句等它是不能够识别理解的。
如上所示,打包后会呈现一个自执行函数,结构如下:
!function(形参){加载器;}([模块])
//OR
!function(形参){加载器;}({模块})
模块以数组形式储存,每个元素都是函数
特征:
- 加载器代码几乎一致
- 开头便是自执行函数
- 结构如上
- 关键字:
exports
逆向实战
目标
注意使用旧版登录,新版登录有账号检测,未注册账号不能触发登录
登录表单中的加密参数
XHR断点或者发起程序找到如下:
可以看到加密参数s
的定义代码:
(0,r.encryptedString)(n, i)
这里采用了(0,function)
的形式,可以直接看作:
r.encryptedString(n, i)
这里n
已在上面定义,i
为输入的密码,因此本地代码为:
function getPwdEncrypt(pwd){
var n = new r.RSAKeyPair("10001","",$("#pubkey").val()),
s = r.encryptedString(n, pwd);
return s
}
$("#pubkey").val()
从HTML文档中取值,可以新开一个网页查看原始文档中是否就已经存在:
将其复制进本地代码:
function getPwdEncrypt(pwd){
var pubKey = 'BC087C7C00848CE8A349C9072C3229E0D595F817EDDE9ABF6FC72B41942A759E97956CE9CB7D1F2E99399EADBACC0531F16EAE8EFCB68553DE0E125B2231ED955ADBF5208E65DC804237C93EB23C83E7ECDA0B586ECF31839038EE6B640E0EEC5FF17D219FDEA33E730F287F0D384C74A53DFE1F91ACC63C7C92039A43AC6E97',
n = new r.RSAKeyPair("10001","",pubKey),
s = r.encryptedString(n, pwd);
return s
}
现在就是来解决两个函数的时候,先跳转到第一个:
一眼Webpack,并且第二个函数也在其中。
以往都是直接无脑全复制,这次优雅一点,先只将跳转到的代码复制到本地(别忘了Webpack格式及加载器)
代码:
var webpack;
!function (t) {
var e = {};
function i(n) {
if (e[n])
return e[n].exports;
var s = e[n] = {
i: n,
l: !1,
exports: {}
};
return t[n].call(s.exports, s, s.exports, i),
s.l = !0,
s.exports
}
i.m = t,
i.c = e,
i.d = function (t, e, n) {
i.o(t, e) || Object.defineProperty(t, e, {
enumerable: !0,
get: n
})
}
,
i.r = function (t) {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, {
value: "Module"
}),
Object.defineProperty(t, "__esModule", {
value: !0
})
}
,
i.t = function (t, e) {
if (1 & e && (t = i(t)),
8 & e)
return t;
if (4 & e && "object" == typeof t && t && t.__esModule)
return t;
var n = Object.create(null);
if (i.r(n),
Object.defineProperty(n, "default", {
enumerable: !0,
value: t
}),
2 & e && "string" != typeof t)
for (var s in t)
i.d(n, s, function (e) {
return t[e]
}
.bind(null, s));
return n
}
,
i.n = function (t) {
var e = t && t.__esModule ? function () {
return t.default
}
: function () {
return t
}
;
return i.d(e, "a", e),
e
}
,
i.o = function (t, e) {
return Object.prototype.hasOwnProperty.call(t, e)
}
,
i.p = "//esfres.leju.com/agent_www_new/dist/",
//这里将其注释掉,否则会报缺少参数错误
//i(i.s = 301),
webpack = i
}(
{
228: function (t, e, i) {
"use strict";
Object.defineProperty(e, "__esModule", {
value: !0
});
var n, s;
function o(t) {
n = new Array(t);
for (var e = 0; e < n.length; e++)
n[e] = 0;
new a,
(s = new a).digits[0] = 1
}
o(20);
l(1e15);
function a(t) {
this.digits = "boolean" == typeof t && 1 == t ? null : n.slice(0),
this.isNeg = !1
}
function r(t) {
var e = new a(!0);
return e.digits = t.digits.slice(0),
e.isNeg = t.isNeg,
e
}
function l(t) {
var e = new a;
e.isNeg = t < 0,
t = Math.abs(t);
for (var i = 0; t > 0;)
e.digits[i++] = 65535 & t,
t >>= 16;
return e
}
function c(t) {
for (var e = "", i = t.length - 1; i > -1; --i)
e += t.charAt(i);
return e
}
new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
var u = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f");
function d(t) {
for (var e = "", i = 0; i < 4; ++i)
e += u[15 & t],
t >>>= 4;
return c(e)
}
function p(t) {
return t >= 48 && t <= 57 ? t - 48 : t >= 65 && t <= 90 ? 10 + t - 65 : t >= 97 && t <= 122 ? 10 + t - 97 : 0
}
function h(t) {
for (var e = 0, i = Math.min(t.length, 4), n = 0; n < i; ++n)
e <<= 4,
e |= p(t.charCodeAt(n));
return e
}
function f(t, e) {
var i;
if (t.isNeg != e.isNeg)
e.isNeg = !e.isNeg,
i = g(t, e),
e.isNeg = !e.isNeg;
else {
i = new a;
for (var n, s = 0, o = 0; o < t.digits.length; ++o)
n = t.digits[o] + e.digits[o] + s,
i.digits[o] = 65535 & n,
s = Number(n >= 65536);
i.isNeg = t.isNeg
}
return i
}
function g(t, e) {
var i;
if (t.isNeg != e.isNeg)
e.isNeg = !e.isNeg,
i = f(t, e),
e.isNeg = !e.isNeg;
else {
var n, s;
i = new a,
s = 0;
for (var o = 0; o < t.digits.length; ++o)
n = t.digits[o] - e.digits[o] + s,
i.digits[o] = 65535 & n,
i.digits[o] < 0 && (i.digits[o] += 65536),
s = 0 - Number(n < 0);
if (-1 == s) {
s = 0;
for (o = 0; o < t.digits.length; ++o)
n = 0 - i.digits[o] + s,
i.digits[o] = 65535 & n,
i.digits[o] < 0 && (i.digits[o] += 65536),
s = 0 - Number(n < 0);
i.isNeg = !t.isNeg
} else
i.isNeg = t.isNeg
}
return i
}
function m(t) {
for (var e = t.digits.length - 1; e > 0 && 0 == t.digits[e];)
--e;
return e
}
function y(t) {
var e, i = m(t), n = t.digits[i], s = 16 * (i + 1);
for (e = s; e > s - 16 && 0 == (32768 & n); --e)
n <<= 1;
return e
}
function v(t, e) {
for (var i, n, s, o = new a, r = m(t), l = m(e), c = 0; c <= l; ++c) {
i = 0,
s = c;
for (var u = 0; u <= r; ++u,
++s)
n = o.digits[s] + t.digits[u] * e.digits[c] + i,
o.digits[s] = 65535 & n,
i = n >>> 16;
o.digits[c + r + 1] = i
}
return o.isNeg = t.isNeg != e.isNeg,
o
}
function b(t, e) {
var i, n, s, o = new a;
i = m(t),
n = 0;
for (var r = 0; r <= i; ++r)
s = o.digits[r] + t.digits[r] * e + n,
o.digits[r] = 65535 & s,
n = s >>> 16;
return o.digits[1 + i] = n,
o
}
function w(t, e, i, n, s) {
for (var o = Math.min(e + s, t.length), a = e, r = n; a < o; ++a,
++r)
i[r] = t[a]
}
var k = new Array(0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535);
function C(t, e) {
var i = Math.floor(e / 16)
, n = new a;
w(t.digits, 0, n.digits, i, n.digits.length - i);
for (var s = e % 16, o = 16 - s, r = n.digits.length - 1, l = r - 1; r > 0; --r,
--l)
n.digits[r] = n.digits[r] << s & 65535 | (n.digits[l] & k[s]) >>> o;
return n.digits[0] = n.digits[r] << s & 65535,
n.isNeg = t.isNeg,
n
}
var x = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535);
function _(t, e) {
var i = Math.floor(e / 16)
, n = new a;
w(t.digits, i, n.digits, 0, t.digits.length - i);
for (var s = e % 16, o = 16 - s, r = 0, l = r + 1; r < n.digits.length - 1; ++r,
++l)
n.digits[r] = n.digits[r] >>> s | (n.digits[l] & x[s]) << o;
return n.digits[n.digits.length - 1] >>>= s,
n.isNeg = t.isNeg,
n
}
function $(t, e) {
var i = new a;
return w(t.digits, 0, i.digits, e, i.digits.length - e),
i
}
function S(t, e) {
if (t.isNeg != e.isNeg)
return 1 - 2 * Number(t.isNeg);
for (var i = t.digits.length - 1; i >= 0; --i)
if (t.digits[i] != e.digits[i])
return t.isNeg ? 1 - 2 * Number(t.digits[i] > e.digits[i]) : 1 - 2 * Number(t.digits[i] < e.digits[i]);
return 0
}
function j(t, e) {
var i, n, o = y(t), l = y(e), c = e.isNeg;
if (o < l)
return t.isNeg ? ((i = r(s)).isNeg = !e.isNeg,
t.isNeg = !1,
e.isNeg = !1,
n = g(e, t),
t.isNeg = !0,
e.isNeg = c) : (i = new a,
n = r(t)),
new Array(i, n);
i = new a,
n = t;
for (var u = Math.ceil(l / 16) - 1, d = 0; e.digits[u] < 32768;)
e = C(e, 1),
++d,
++l,
u = Math.ceil(l / 16) - 1;
n = C(n, d),
o += d;
for (var p = Math.ceil(o / 16) - 1, h = $(e, p - u); -1 != S(n, h);)
++i.digits[p - u],
n = g(n, h);
for (var v = p; v > u; --v) {
var w = v >= n.digits.length ? 0 : n.digits[v]
, k = v - 1 >= n.digits.length ? 0 : n.digits[v - 1]
, x = v - 2 >= n.digits.length ? 0 : n.digits[v - 2]
, j = u >= e.digits.length ? 0 : e.digits[u]
, A = u - 1 >= e.digits.length ? 0 : e.digits[u - 1];
i.digits[v - u - 1] = w == j ? 65535 : Math.floor((65536 * w + k) / j);
for (var T = i.digits[v - u - 1] * (65536 * j + A), q = 4294967296 * w + (65536 * k + x); T > q;)
--i.digits[v - u - 1],
T = i.digits[v - u - 1] * (65536 * j | A),
q = 65536 * w * 65536 + (65536 * k + x);
(n = g(n, b(h = $(e, v - u - 1), i.digits[v - u - 1]))).isNeg && (n = f(n, h),
--i.digits[v - u - 1])
}
return n = _(n, d),
i.isNeg = t.isNeg != c,
t.isNeg && (i = c ? f(i, s) : g(i, s),
n = g(e = _(e, d), n)),
0 == n.digits[0] && 0 == m(n) && (n.isNeg = !1),
new Array(i, n)
}
e.setMaxDigits = o,
e.biFromHex = function (t) {
for (var e = new a, i = t.length, n = 0; i > 0; i -= 4,
++n)
e.digits[n] = h(t.substr(Math.max(i - 4, 0), Math.min(i, 4)));
return e
}
,
e.biHighIndex = m,
e.biCopy = r,
e.BigInt = a,
e.biDivide = function (t, e) {
return j(t, e)[0]
}
,
e.biMultiply = v,
e.biDivideByRadixPower = function (t, e) {
var i = new a;
return w(t.digits, e, i.digits, 0, i.digits.length - e),
i
}
,
e.biModuloByRadixPower = function (t, e) {
var i = new a;
return w(t.digits, 0, i.digits, 0, e),
i
}
,
e.biSubtract = g,
e.biCompare = S,
e.biShiftRight = _,
e.biToHex = function (t) {
for (var e = "", i = (m(t),
m(t)); i > -1; --i)
e += d(t.digits[i]);
return e
}
},
306: function(t, e, i) {
"use strict";
Object.defineProperty(e, "__esModule", {
value: !0
}),
e.BarrettMu_powMod = e.BarrettMu_multiplyMod = e.BarrettMu_modulo = e.BarrettMu = void 0;
var n = i(228);
function s(t) {
var e = (0,
n.biDivideByRadixPower)(t, this.k - 1)
, i = (0,
n.biMultiply)(e, this.mu)
, s = (0,
n.biDivideByRadixPower)(i, this.k + 1)
, o = (0,
n.biModuloByRadixPower)(t, this.k + 1)
, a = (0,
n.biMultiply)(s, this.modulus)
, r = (0,
n.biModuloByRadixPower)(a, this.k + 1)
, l = (0,
n.biSubtract)(o, r);
l.isNeg && (l = biAdd(l, this.bkplus1));
for (var c = (0,
n.biCompare)(l, this.modulus) >= 0; c; )
l = (0,
n.biSubtract)(l, this.modulus),
c = (0,
n.biCompare)(l, this.modulus) >= 0;
return l
}
function o(t, e) {
var i = (0,
n.biMultiply)(t, e);
return this.modulo(i)
}
function a(t, e) {
var i = new n.BigInt;
i.digits[0] = 1;
for (var s = t, o = e; 0 != (1 & o.digits[0]) && (i = this.multiplyMod(i, s)),
0 != (o = (0,
n.biShiftRight)(o, 1)).digits[0] || 0 != (0,
n.biHighIndex)(o); )
s = this.multiplyMod(s, s);
return i
}
e.BarrettMu = function(t) {
this.modulus = (0,
n.biCopy)(t),
this.k = (0,
n.biHighIndex)(this.modulus) + 1;
var e = new n.BigInt;
e.digits[2 * this.k] = 1,
this.mu = (0,
n.biDivide)(e, this.modulus),
this.bkplus1 = new n.BigInt,
this.bkplus1.digits[this.k + 1] = 1,
this.modulo = s,
this.multiplyMod = o,
this.powMod = a
}
,
e.BarrettMu_modulo = s,
e.BarrettMu_multiplyMod = o,
e.BarrettMu_powMod = a
},
305: function (t, e, i) {
"use strict";
Object.defineProperty(e, "__esModule", {
value: !0
}),
e.encryptedString = e.RSAKeyPair = void 0;
var n = i(228)
, s = i(306)
, o = {};
o.NoPadding = "NoPadding",
o.PKCS1Padding = "PKCS1Padding",
o.RawEncoding = "RawEncoding",
o.NumericEncoding = "NumericEncoding",
e.RSAKeyPair = function (t, e, i, o) {
this.e = (0,
n.biFromHex)(t),
this.d = (0,
n.biFromHex)(e),
this.m = (0,
n.biFromHex)(i),
this.chunkSize = "number" != typeof o ? 2 * (0,
n.biHighIndex)(this.m) : o / 8,
this.radix = 16,
this.barrett = new s.BarrettMu(this.m)
}
,
e.encryptedString = function (t, e, i, s) {
var a, r, l, c, u, d, p, h, f, g = new Array, m = e.length, y = "";
for (c = "string" == typeof i ? i == o.NoPadding ? 1 : i == o.PKCS1Padding ? 2 : 0 : 0,
u = "string" == typeof s && s == o.RawEncoding ? 1 : 0,
1 == c ? m > t.chunkSize && (m = t.chunkSize) : 2 == c && m > t.chunkSize - 11 && (m = t.chunkSize - 11),
a = 0,
r = 2 == c ? m - 1 : t.chunkSize - 1; a < m;)
c ? g[r] = e.charCodeAt(a) : g[a] = e.charCodeAt(a),
a++,
r--;
for (1 == c && (a = 0),
r = t.chunkSize - m % t.chunkSize; r > 0;) {
if (2 == c) {
for (d = Math.floor(256 * Math.random()); !d;)
d = Math.floor(256 * Math.random());
g[a] = d
} else
g[a] = 0;
a++,
r--
}
for (2 == c && (g[m] = 0,
g[t.chunkSize - 2] = 2,
g[t.chunkSize - 1] = 0),
p = g.length,
a = 0; a < p; a += t.chunkSize) {
for (h = new n.BigInt,
r = 0,
l = a; l < a + t.chunkSize; ++r)
h.digits[r] = g[l++],
h.digits[r] += g[l++] << 8;
f = t.barrett.powMod(h, t.e),
y += 1 == u ? biToBytes(f) : 16 == t.radix ? (0,
n.biToHex)(f) : biToString(f, t.radix)
}
return y
}
}
})
function getPwdEncrypt(pwd) {
var r = webpack(305),
pubKey = 'BC087C7C00848CE8A349C9072C3229E0D595F817EDDE9ABF6FC72B41942A759E97956CE9CB7D1F2E99399EADBACC0531F16EAE8EFCB68553DE0E125B2231ED955ADBF5208E65DC804237C93EB23C83E7ECDA0B586ECF31839038EE6B640E0EEC5FF17D219FDEA33E730F287F0D384C74A53DFE1F91ACC63C7C92039A43AC6E97',
n = new r.RSAKeyPair("10001", "", pubKey),
s = r.encryptedString(n, pwd);
return s
}
console.log(getPwdEncrypt('asdadasdzc'))
这里在305
中可以很明显看到对其它模块的调用,因此一并将其复制进来(如果运行中报错缺少,同理将其对应的复制进来即可),并对外提供一个webpack
的变量便于后续调用
尝试运行,发现卡住了,迟迟没有结果,这是不正常的,再回到网页代码上
发现这段代码被先运行,抱着试试看的态度,跳转至代码处尝试扣下来,结果发现就是上面的228
,于是最终代码:
//前面webpack的内容省略,参考前面的代码
function getPwdEncrypt(pwd) {
webpack(228).setMaxDigits(129);
var r = webpack(305),
pubKey = 'BC087C7C00848CE8A349C9072C3229E0D595F817EDDE9ABF6FC72B41942A759E97956CE9CB7D1F2E99399EADBACC0531F16EAE8EFCB68553DE0E125B2231ED955ADBF5208E65DC804237C93EB23C83E7ECDA0B586ECF31839038EE6B640E0EEC5FF17D219FDEA33E730F287F0D384C74A53DFE1F91ACC63C7C92039A43AC6E97',
n = new r.RSAKeyPair("10001", "", pubKey),
s = r.encryptedString(n, pwd);
return s
}
console.log(getPwdEncrypt("asdadadadad"))
运行结果:
b1413c4d46483e93234a5ab062ff31277224e1a028cc1efa0b88f9f5f448a8dfd1daa9747f81ba4970740d06fc76e59b0af6cf96d420b7889aceb67eb71ef7051c89e886b4420ef0ff75c1f8b0eb7f23a7451cc6b8e80c0ba04cb49106dd4c67a7572c7147d815d64d90b31f2a083bbc7f8fab188c6f6226f6b756f7b727a7cc
对比结果一致,逆向成功