![](https://img.kancloud.cn/fb/68/fb6826645f85a181256c5538688765a1_1920x1080.png)
![](https://img.kancloud.cn/b2/5f/b25fca3fb285d046cb8b2a08ee952114_1920x942.png)
这篇主要是根据bilibili的up主python小丑鱼提供的视频教程来做的练习。
首先打开某准网的页面:
![](https://img.kancloud.cn/fb/f8/fbf87dd8923c56fa0621de8c856c0213_1920x942.png)
点击到某一公司的详情页面,按f12进入到开发者工具。
![](https://img.kancloud.cn/47/f7/47f7ecb31eb61e313b6893bc7fc995a5_1920x942.png)
通过网络的xhr请求发现也就3条请求,第一条是登录校验的,第二条是类似关键词的,那么就是第三条了,其实也可以根据我们平常开发的时候写接口的名称大概猜测出来位置。
![](https://img.kancloud.cn/52/75/527554cd7d80d89e7b68fcf2b7699cb7_1920x942.png)
两个加密参数,一个是kiv:,一个是b:。
找到了加密参数,第一步就是搜索,在来源这里按ctrl+shift+f键进行搜索。
![](https://img.kancloud.cn/94/c3/94c32811983c6034c7ab25d44069457f_1920x942.png)
只有一个文件有该关键词的,就不用用其他方法,比如下面这种,从请求里看调用js文件哪些位置的代码。
![](https://img.kancloud.cn/be/06/be06685cd233869ff7ec9cca9751a490_1920x942.png)
当我们知道哪一个是关键js文件,推荐把js文件放到本地进行hook与调试,这样的话可以极大的方便我们进行逆向加密参数。本地js的话路径需要文件夹对应。
![](https://img.kancloud.cn/f5/39/f539bb072ff4a0e577dc9dc53d4097bb_1920x942.png)
![](https://img.kancloud.cn/9f/e6/9fe62aae6c99367955cb0d491a323058_1920x942.png)
从上面这张图可以看到kiv的参数由s变量形成的,我们往上走,可以看到这句代码:
```
"string" == typeof a.data && a.data.indexOf("kiv") > -1 ? (n = (i = "string" == typeof a.data ? JSON.parse(a.data) : a.data).b,
s = i.kiv) : (s = Object(m.c)(),
```
这里面第一个"=="一般是真,三元的话执行第一个运算,但后面还有“&&”这个符号,这个一般是false(如果时 || 的话一般是真),所以的话执行是第二个运算符,那么这样的话上面这行代码最终只执行m方法:
```
s = Object(m.c)()
```
分析到这里之后我们就先打上断点进行调试看一下参数。
![](https://img.kancloud.cn/cb/a8/cba8ec2b2ee6bb5bf8f08c52cb33edc0_1920x942.png)
![](https://img.kancloud.cn/95/4a/954a5d81db4ec4f3a277a1aa3245cf31_1920x942.png)
可以看到s变量确实是生成加密参数的数值。
![](https://img.kancloud.cn/d2/2c/d22c008492debd61020c27a7b49c7709_1920x942.png)
我们也可以通过hook来查看s变量是不是要找的加密参数,这个对新手来说还是比较方便的。如果不扣代码的话,利用该方法直接进行rpc远程调用就可以了。
通过刚才的分析,我们可以试着在控制台将m函数打印出来。
![](https://img.kancloud.cn/f5/11/f511950cbe7beb5dc1ec221cbbc34da8_1920x942.png)
可以看到,m.c调用的common-2ef183.js:26035行的方法,我们点进去看一下。
![](https://img.kancloud.cn/cc/8b/cc8bc71bfdeba86c39ddb1f7a1605c49_605x237.png)
可以大概的估计到,kiv是由此方法随机生成的16位加密字符串,传进去的e值其实是e =undefined的,通过hook打印就可以知道。kiv的参数我们已经知道了,但是往上看,可以看到,这个其实分化器写法。
![](https://img.kancloud.cn/56/e4/56e465204c7b77a1b653344e8648c4bd_1920x942.png)
类似图片的样式,我们可以回到common这个js文件中往上看一下,m这个方法名是怎么定义的。
![](https://img.kancloud.cn/f6/0a/f60a39d675ffa39efc9a3e7648caeefd_1920x942.png)
很明显m = n("M0uz"),m就是这么定义得来的,打上断点,刷新查看一下这个执行的那里的方法。
由于打上断点后并没有刷新该方法出来,所以我们用另外一种方法来获取,因为我们现在还差b的加密参数没有搞定,所以来看一下这一句代码:
```
n = Object(m.b)(i, {
iv: s
}).replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~")));
```
可以看到,b这个加密参数同样是由m方法来生成的,后面这个replace的方法表示搜索相关字符并替换字符串。
![](https://img.kancloud.cn/ef/b7/efb7ee2da34b5d12a03fac9909f23ec9_1920x942.png)
我们可以将m.b方法进行打印出来,并点进所在的位置,可以看到这是一个c = 什么什么方法的函数,我们跟着进入c里面看一下就知道了。
![](https://img.kancloud.cn/3a/b5/3ab54bfa216a5a97e89a023326c08f52_1920x942.png)
我们只需要把这个文件里的代码全部扣下来就好了。
![](https://img.kancloud.cn/83/a3/83a377c57bfacc5cd59278610ebf31c9_1920x942.png)
直接全选复制到我们新建的js文件里
![](https://img.kancloud.cn/98/07/9807e06f17bf4caa3fb46fc6c0979f00_1459x653.png)
![](https://img.kancloud.cn/2d/8d/2d8dcb82015d3a84792840cf2b912a2b_1459x656.png)
在前面定义一个sign的变量,并补上window环境。
```
var sign;
window = global;
```
在最后那里中括号改成大括号,并将r()改成sign = S,为什么等于S呢。
![](https://img.kancloud.cn/09/3a/093acd1ab9758c17302240454d4541d9_613x226.png)
因为根据r()方法这里可以看到,最后返回的是e,那e往上看很明显是等于S。
![](https://img.kancloud.cn/68/3a/683a1a3c86939c88b5a4885f21e5bc05_1920x942.png)
还有另外一种原因就是我们从comm这个js文件跳过来的时候就看到是在使用S方法了。
![](https://img.kancloud.cn/8e/58/8e58369a3afead479b702b566e944d00_1459x362.png)
我们可以写一个0方法进行测试一下,运行时如果输出为ceshi那就说明没有问题。
好了,弄好这些之后我们接着扣代码。上面已经说过了,
```
m = n("M0uz")
```
而kiv与b加密参数都是调用的m方法形成的。所以我们需要在comm这个js文件找到 “ M0uz ” 这个方法名。
![](https://img.kancloud.cn/83/52/835245899d78034a479e7f29a066d38e_1920x942.png)
![](https://img.kancloud.cn/2f/11/2f11d5bcacb7793ef4582e4066e1fe94_1459x647.png)
将扣来的代码放在M0uz上,并看到里面还调用一些其他方法,我们需要一一把这些方法扣过来。
![](https://img.kancloud.cn/32/14/3214c0115d6a54883f375fa54573671d_1459x638.png)
0770这个方法里还调用了其他的,我们也需要扣回来,在补齐所有方法后,我们可以进行调用了。
```
var m = n('M0uz');
var s = Object(m.c)()
return s;
```
只需要模拟commjs文件里的kiv生成代码就可以了。b参数的话我们通过hook可以知道,只需要在里面加一些数据就能生成加密数据了。好了,目前这两个加密参数已经基本完成了,下面我们来看一下返回的加密数据如何进行解密成明文数据。
我们需要在返回来的启动器找到那里是解密方法,一般有几种,直接搜索的话可能会出来太多方法,一个个跟消耗我们很多时间,我们可以试着搜索这两个:response decrypt,然后跟一下,或者xhr断点一步步往下走。
![](https://img.kancloud.cn/19/b8/19b81f8f2478e6cd49673360298322c9_1091x236.png)
或者从get这里断点然后开始往下跟。
![](https://img.kancloud.cn/d5/f9/d5f9c07a0e2f7c218ac0ad3b61ceec75_1920x942.png)
我在找到response之后在它方法的下一行进行了断点,这样就可以找到它进来的参数是什么了,在跳过两次后,我们就可以看到进来一个跟我们需要解密数据差不多的data传了进来。如果还是不太确定的话可以在response最后返回那里打上断点就可以返回的是一个已经解密好的数据。
```
if (200 == t.status && t.config.crypto && "string" == typeof n && (n = Object(m.a)(t.data, {
iv: "string" == typeof i ? JSON.parse(i).kiv : i.kiv
}),
```
跟到这里的时候我们再往下就跳到另外的方法里,所以可以猜测解密应该是这里执行的,我们把它拿出来,i.kiv就是我们之前生成的加密参数,我们如果不太确定这个语句执行的是什么的话可以将他打印出来看一下。(JSON.parse(n)我们还看到这一句代码,有时候搜索查找的时候我们也可以就搜索上面一个说不定就可以找到了)
![](https://img.kancloud.cn/d4/2c/d42cc149e46fb035c234deadccace0bf_1239x904.png)
我们将iv: "string" == typeof i ? JSON.parse(i).kiv : i.kiv这句直接放到控制台运行,可以看到最后输出的就是我们之前生成的加密参数。那我们试着执行一下 Object(m.a)()这个方法。
![](https://img.kancloud.cn/ef/fd/effdaa122cc029887b05ea9d9a7e5625_566x319.png)
我们只要像这样就可以了。本章节也讲完了。。。。本教程仅供学习交流,请勿用作其他用途
![](https://img.kancloud.cn/fc/54/fc5477b570eea1e282ece853872865ca_1463x846.png)
![](https://img.kancloud.cn/9a/6c/9a6c536d73113ef3ea2a25e42090a5f7_1376x873.png)
```
window = global;
var e = "XY1Dp1iGHtF59tsGp3iBZO+i7uUe6C7+DwQryWckdInXAA1nurufhO2ISIh8bp7aeKJi5rdhX/VpwrIJHY3TSvxgoSiGEulupOZNydcN6xs/LvpwbnDXntdr0mvmKPj9s4HQ2AbQviBpGI7N+BD2uVo91d/zDJKV1aNYZ22ZIP1vw3xp0TY5x7V6RB2SqkQ1GjQvQZKvY9PXQiIPOeU/k2Afbmf4k5qHpdCA6OX/8sBx2/fmazL9dQE6v0zSXJZ55Ddv6zDjv4+prRSDaodsxFvVoXEp4crBzOBiMkwndVeyfc8XHlcohwWX2NaFEu5I09yJWaGhXEKruYYjmVh4woaplg3PJDnDsjrbaqhnUtDjazAKX3bLNEI2N6hEd7iAX5g/RNifhhxOvmghJjuKd3ozsznBcmgxbAY4ovrf7N+VwEpK8L6p21Y9MSvtvaAdF/3T9X0TNi7fBBDx+Xebu69R887ERa2e9TPqMjlFuBdEiNvuEFdYXDpmrKHLlvIh338T8ulf4KlW8afCW/XgTwiNzOOYLgjH2fVvLYXmM0qU7ho0JIe8Khr8tgfvYEG1";
var t = "NgYFhzTgIZSbgQnb";
var sign;
window = global;
! function(e) {
function n(n) {
for (var t, o, i = n\[0\], c = n\[1\], a = n\[2\], d = 0, s = \[\]; d < i.length; d++)
o = i\[d\],
Object.prototype.hasOwnProperty.call(A, o) && A\[o\] && s.push(A\[o\]\[0\]),
A\[o\] = 0;
for (t in c)
Object.prototype.hasOwnProperty.call(c, t) && (e\[t\] = c\[t\]);
for (J && J(n); s.length;)
s.shift()();
return M.push.apply(M, a || \[\]),
r()
}
function r() {
for (var e, n = 0; n < M.length; n++) {
for (var r = M\[n\], t = !0, o = 1; o < r.length; o++) {
var i = r\[o\];
0 !== A\[i\] && (t = !1)
}
t && (M.splice(n\--, 1),
e = S(S.s = r\[0\]))
}
return e
}
var t = window.webpackHotUpdate;
window.webpackHotUpdate = function(e, n) {
! function(e, n) {
if (!\_\[e\] || !g\[e\])
return;
for (var r in g\[e\] = !1,
n)
Object.prototype.hasOwnProperty.call(n, r) && (v\[r\] = n\[r\]);
0 == --w && 0 === O && P()
}(e, n),
t && t(e, n)
};
var o, i = !0,
c = "2ef183362af73dab273d",
a = {},
d = \[\],
s = \[\];
function p(n) {
var r = {
\_acceptedDependencies: {},
\_declinedDependencies: {},
\_selfAccepted: !1,
\_selfDeclined: !1,
\_selfInvalidated: !1,
\_disposeHandlers: \[\],
\_main: o !== n,
active: !0,
accept: function(e, n) {
if (void 0 === e)
r.\_selfAccepted = !0;
else if ("function" == typeof e)
r.\_selfAccepted = e;
else if ("object" == typeof e)
for (var t = 0; t < e.length; t++)
r.\_acceptedDependencies\[e\[t\]\] = n || function() {};
else
r.\_acceptedDependencies\[e\] = n || function() {}
},
decline: function(e) {
if (void 0 === e)
r.\_selfDeclined = !0;
else if ("object" == typeof e)
for (var n = 0; n < e.length; n++)
r.\_declinedDependencies\[e\[n\]\] = !0;
else
r.\_declinedDependencies\[e\] = !0
},
dispose: function(e) {
r.\_disposeHandlers.push(e)
},
addDisposeHandler: function(e) {
r.\_disposeHandlers.push(e)
},
removeDisposeHandler: function(e) {
var n = r.\_disposeHandlers.indexOf(e);
n >= 0 && r.\_disposeHandlers.splice(n, 1)
},
invalidate: function() {
switch (this.\_selfInvalidated = !0,
u) {
case "idle":
(v = {})\[n\] = e\[n\],
f("ready");
break;
case "ready":
x(n);
break;
case "prepare":
case "check":
case "dispose":
case "apply":
(b = b || \[\]).push(n)
}
},
check: D,
apply: I,
status: function(e) {
if (!e)
return u;
l.push(e)
},
addStatusHandler: function(e) {
l.push(e)
},
removeStatusHandler: function(e) {
var n = l.indexOf(e);
n >= 0 && l.splice(n, 1)
},
data: a\[n\]
};
return o = void 0,
r
}
var l = \[\],
u = "idle";
function f(e) {
u = e;
for (var n = 0; n < l.length; n++)
l\[n\].call(null, e)
}
var h, v, y, b, w = 0,
O = 0,
m = {},
g = {},
\_ = {};
function j(e) {
return +e + "" === e ? +e : e
}
function D(e) {
if ("idle" !== u)
throw new Error("check() is only allowed in idle status");
return i = e,
f("check"),
(n = 1e4,
n = n || 1e4,
new Promise((function(e, r) {
if ("undefined" == typeof XMLHttpRequest)
return r(new Error("No browser support"));
try {
var t = new XMLHttpRequest,
o = S.p + "" + c + ".hot-update.json";
t.open("GET", o, !0),
t.timeout = n,
t.send(null)
} catch (e) {
return r(e)
}
t.onreadystatechange = function() {
if (4 === t.readyState)
if (0 === t.status)
r(new Error("Manifest request to " + o + " timed out."));
else if (404 === t.status)
e();
else if (200 !== t.status && 304 !== t.status)
r(new Error("Manifest request to " + o + " failed."));
else {
try {
var n = JSON.parse(t.responseText)
} catch (e) {
return void r(e)
}
e(n)
}
}
}))).then((function(e) {
if (!e)
return f(k() ? "ready" : "idle"),
null;
g = {},
m = {},
\_ = e.c,
y = e.h,
f("prepare");
var n = new Promise((function(e, n) {
h = {
resolve: e,
reject: n
}
}));
for (var r in v = {},
A)
E(r);
return "prepare" === u && 0 === O && 0 === w && P(),
n
}));
var n
}
function E(e) {
\_\[e\] ? (g\[e\] = !0,
w++,
function(e) {
var n = document.createElement("script");
n.charset = "utf-8",
n.src = S.p + "" + e + "." + c + ".hot-update.js",
document.head.appendChild(n)
}(e)) : m\[e\] = !0
}
function P() {
f("ready");
var e = h;
if (h = null,
e)
if (i)
Promise.resolve().then((function() {
return I(i)
})).then((function(n) {
e.resolve(n)
}), (function(n) {
e.reject(n)
}));
else {
var n = \[\];
for (var r in v)
Object.prototype.hasOwnProperty.call(v, r) && n.push(j(r));
e.resolve(n)
}
}
function I(n) {
if ("ready" !== u)
throw new Error("apply() is only allowed in ready status");
return function n(r) {
var t, i, s, p, l;
function u(e) {
for (var n = \[e\], r = {}, t = n.map((function(e) {
return {
chain: \[e\],
id: e
}
})); t.length > 0;) {
var o = t.pop(),
i = o.id,
c = o.chain;
if ((p = H\[i\]) && (!p.hot.\_selfAccepted || p.hot.\_selfInvalidated)) {
if (p.hot.\_selfDeclined)
return {
type: "self-declined",
chain: c,
moduleId: i
};
if (p.hot.\_main)
return {
type: "unaccepted",
chain: c,
moduleId: i
};
for (var a = 0; a < p.parents.length; a++) {
var d = p.parents\[a\],
s = H\[d\];
if (s) {
if (s.hot.\_declinedDependencies\[i\])
return {
type: "declined",
chain: c.concat(\[d\]),
moduleId: i,
parentId: d
}; -
1 === n.indexOf(d) && (s.hot.\_acceptedDependencies\[i\] ? (r\[d\] || (r\[d\] = \[\]),
h(r\[d\], \[i\])) : (delete r\[d\],
n.push(d),
t.push({
chain: c.concat(\[d\]),
id: d
})))
}
}
}
}
return {
type: "accepted",
moduleId: e,
outdatedModules: n,
outdatedDependencies: r
}
}
function h(e, n) {
for (var r = 0; r < n.length; r++) {
var t = n\[r\]; -
1 === e.indexOf(t) && e.push(t)
}
}
k();
var w = {},
O = \[\],
m = {},
g = function() {};
for (var D in v)
if (Object.prototype.hasOwnProperty.call(v, D)) {
var E;
l = j(D),
E = v\[D\] ? u(l) : {
type: "disposed",
moduleId: D
};
var P = !1,
I = !1,
x = !1,
M = "";
switch (E.chain && (M = "\\nUpdate propagation: " + E.chain.join(" -> ")),
E.type) {
case "self-declined":
r.onDeclined && r.onDeclined(E),
r.ignoreDeclined || (P = new Error("Aborted because of self decline: " + E.moduleId + M));
break;
case "declined":
r.onDeclined && r.onDeclined(E),
r.ignoreDeclined || (P = new Error("Aborted because of declined dependency: " + E.moduleId + " in " + E.parentId + M));
break;
case "unaccepted":
r.onUnaccepted && r.onUnaccepted(E),
r.ignoreUnaccepted || (P = new Error("Aborted because " + l + " is not accepted" + M));
break;
case "accepted":
r.onAccepted && r.onAccepted(E),
I = !0;
break;
case "disposed":
r.onDisposed && r.onDisposed(E),
x = !0;
break;
default:
throw new Error("Unexception type " + E.type)
}
if (P)
return f("abort"),
Promise.reject(P);
if (I)
for (l in m\[l\] = v\[l\],
h(O, E.outdatedModules),
E.outdatedDependencies)
Object.prototype.hasOwnProperty.call(E.outdatedDependencies, l) && (w\[l\] || (w\[l\] = \[\]),
h(w\[l\], E.outdatedDependencies\[l\]));
x && (h(O, \[E.moduleId\]),
m\[l\] = g)
}
var U, q = \[\];
for (i = 0; i < O.length; i++)
l = O\[i\],
H\[l\] && H\[l\].hot.\_selfAccepted && m\[l\] !== g && !H\[l\].hot.\_selfInvalidated && q.push({
module: l,
parents: H\[l\].parents.slice(),
errorHandler: H\[l\].hot.\_selfAccepted
});
f("dispose"),
Object.keys(\_).forEach((function(e) {
!1 === \_\[e\] && function(e) {
delete A\[e\]
}(e)
}));
var T, J, L = O.slice();
for (; L.length > 0;)
if (l = L.pop(),
p = H\[l\]) {
var N = {},
R = p.hot.\_disposeHandlers;
for (s = 0; s < R.length; s++)
(t = R\[s\])(N);
for (a\[l\] = N,
p.hot.active = !1,
delete H\[l\],
delete w\[l\],
s = 0; s < p.children.length; s++) {
var X = H\[p.children\[s\]\];
X && ((U = X.parents.indexOf(l)) >= 0 && X.parents.splice(U, 1))
}
}
for (l in w)
if (Object.prototype.hasOwnProperty.call(w, l) && (p = H\[l\]))
for (J = w\[l\],
s = 0; s < J.length; s++)
T = J\[s\],
(U = p.children.indexOf(T)) >= 0 && p.children.splice(U, 1);
f("apply"),
void 0 !== y && (c = y,
y = void 0);
for (l in v = void 0,
m)
Object.prototype.hasOwnProperty.call(m, l) && (e\[l\] = m\[l\]);
var z = null;
for (l in w)
if (Object.prototype.hasOwnProperty.call(w, l) && (p = H\[l\])) {
J = w\[l\];
var C = \[\];
for (i = 0; i < J.length; i++)
if (T = J\[i\],
t = p.hot.\_acceptedDependencies\[T\]) {
if (-1 !== C.indexOf(t))
continue;
C.push(t)
}
for (i = 0; i < C.length; i++) {
t = C\[i\];
try {
t(J)
} catch (e) {
r.onErrored && r.onErrored({
type: "accept-errored",
moduleId: l,
dependencyId: J\[i\],
error: e
}),
r.ignoreErrored || z || (z = e)
}
}
}
for (i = 0; i < q.length; i++) {
var G = q\[i\];
l = G.module,
d = G.parents,
o = l;
try {
S(l)
} catch (e) {
if ("function" == typeof G.errorHandler)
try {
G.errorHandler(e)
} catch (n) {
r.onErrored && r.onErrored({
type: "self-accept-error-handler-errored",
moduleId: l,
error: n,
originalError: e
}),
r.ignoreErrored || z || (z = n),
z || (z = e)
}
else
r.onErrored && r.onErrored({
type: "self-accept-errored",
moduleId: l,
error: e
}),
r.ignoreErrored || z || (z = e)
}
}
if (z)
return f("fail"),
Promise.reject(z);
if (b)
return n(r).then((function(e) {
return O.forEach((function(n) {
e.indexOf(n) < 0 && e.push(n)
})),
e
}));
return f("idle"),
new Promise((function(e) {
e(O)
}))
}(n = n || {})
}
function k() {
if (b)
return v || (v = {}),
b.forEach(x),
b = void 0, !0
}
function x(n) {
Object.prototype.hasOwnProperty.call(v, n) || (v\[n\] = e\[n\])
}
var H = {},
A = {
2: 0
},
M = \[\];
function S(n) {
if (H\[n\])
return H\[n\].exports;
var r = H\[n\] = {
i: n,
l: !1,
exports: {},
hot: p(n),
parents: (s = d,
d = \[\],
s),
children: \[\]
};
return e\[n\].call(r.exports, r, r.exports, function(e) {
var n = H\[e\];
if (!n)
return S;
var r = function(r) {
return n.hot.active ? (H\[r\] ? -1 === H\[r\].parents.indexOf(e) && H\[r\].parents.push(e) : (d = \[e\],
o = r), -1 === n.children.indexOf(r) && n.children.push(r)) : d = \[\],
S(r)
},
t = function(e) {
return {
configurable: !0,
enumerable: !0,
get: function() {
return S\[e\]
},
set: function(n) {
S\[e\] = n
}
}
};
for (var i in S)
Object.prototype.hasOwnProperty.call(S, i) && "e" !== i && "t" !== i && Object.defineProperty(r, i, t(i));
return r.e = function(e) {
return "ready" === u && f("prepare"),
O++,
S.e(e).then(n, (function(e) {
throw n(),
e
}));
function n() {
O\--,
"prepare" === u && (m\[e\] || E(e),
0 === O && 0 === w && P())
}
},
r.t = function(e, n) {
return 1 & n && (e = r(e)),
S.t(e, -2 & n)
},
r
}(n)),
r.l = !0,
r.exports
}
S.m = e,
S.c = H,
S.d = function(e, n, r) {
S.o(e, n) || Object.defineProperty(e, n, {
enumerable: !0,
get: r
})
},
S.r = function(e) {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
value: "Module"
}),
Object.defineProperty(e, "\_\_esModule", {
value: !0
})
},
S.t = function(e, n) {
if (1 & n && (e = S(e)),
8 & n)
return e;
if (4 & n && "object" == typeof e && e && e.\_\_esModule)
return e;
var r = Object.create(null);
if (S.r(r),
Object.defineProperty(r, "default", {
enumerable: !0,
value: e
}),
2 & n && "string" != typeof e)
for (var t in e)
S.d(r, t, function(n) {
return e\[n\]
}
.bind(null, t));
return r
},
S.n = function(e) {
var n = e && e.\_\_esModule ? function() {
return e.default
} :
function() {
return e
};
return S.d(n, "a", n),
n
},
S.o = function(e, n) {
return Object.prototype.hasOwnProperty.call(e, n)
},
S.p = "https://static.kanzhun.com/assets/web/",
S.h = function() {
return c
};
var U = window.webpackJsonp = window.webpackJsonp || \[\],
q = U.push.bind(U);
U.push = n,
U = U.slice();
for (var T = 0; T < U.length; T++)
n(U\[T\]);
var J = q;
sign = S;
}({
n770: function(e, t, n) {
"use strict";
(function(e) {
function n(e, t) {
return e(t = {
exports: {}
}, t.exports),
t.exports
}
"undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : void 0 !== e || "undefined" != typeof self && self;
var r = n((function(e, t) {
var n;
e.exports = n = n || function(e, t) {
var n = Object.create || function() {
function e() {}
return function(t) {
var n;
return e.prototype = t,
n = new e,
e.prototype = null,
n
}
}(),
r = {},
i = r.lib = {},
a = i.Base = {
extend: function(e) {
var t = n(this);
return e && t.mixIn(e),
t.hasOwnProperty("init") && this.init !== t.init || (t.init = function() {
t.$super.init.apply(this, arguments)
}),
t.init.prototype = t,
t.$super = this,
t
},
create: function() {
var e = this.extend();
return e.init.apply(e, arguments),
e
},
init: function() {},
mixIn: function(e) {
for (var t in e)
e.hasOwnProperty(t) && (this\[t\] = e\[t\]);
l(this);
for (var e = this.cfg.drop; e > 0; e\--)
a.call(this)
}
});
e.RC4Drop = t.\_createHelper(o)
}(),
n.RC4)
})),
n((function(e, t) {
var n;
e.exports = (n = r,
function() {
var e = n,
t = e.lib.StreamCipher,
r = e.algo,
i = \[\],
a = \[\],
o = \[\],
s = r.Rabbit = t.extend({
\_doReset: function() {
for (var e = this.\_key.words, t = this.cfg.iv, n = 0; n < 4; n++)
e\[n\] = 16711935 & (e\[n\] >> 24) | 4278255360 & (e\[n\] >> 8);
var r = this.\_X = \[e\[0\], e\[3\] >> 16, e\[1\], e\[0\] >> 16, e\[2\], e\[1\] >> 16, e\[3\], e\[2\] >> 16\],
i = this.\_C = \[e\[2\] >> 16, 4294901760 & e\[0\] | 65535 & e\[1\], e\[3\] >> 16, 4294901760 & e\[1\] | 65535 & e\[2\], e\[0\] >> 16, 4294901760 & e\[2\] | 65535 & e\[3\], e\[1\] >> 16, 4294901760 & e\[3\] | 65535 & e\[0\]\];
for (this.\_b = 0,
n = 0; n < 4; n++)
u.call(this);
for (n = 0; n < 8; n++)
i\[n\] ^= r\[n + 4 & 7\];
if (t) {
var a = t.words,
o = a\[0\],
s = a\[1\],
c = 16711935 & (o >> 24) | 4278255360 & (o >> 8),
l = 16711935 & (s >> 24) | 4278255360 & (s >> 8),
d = c >>> 16 | 4294901760 & l,
f = l << 16 | 65535 & c;
for (i\[0\] ^= c,
i\[1\] ^= d,
i\[2\] ^= l,
i\[3\] ^= f,
i\[4\] ^= c,
i\[5\] ^= d,
i\[6\] ^= l,
i\[7\] ^= f,
n = 0; n < 4; n++)
u.call(this)
}
},
\_doProcessBlock: function(e, t) {
var n = this.\_X;
u.call(this),
i\[0\] = n\[0\] ^ n\[5\] >>> 16 ^ n\[3\] << 16,
i\[1\] = n\[2\] ^ n\[7\] >>> 16 ^ n\[5\] << 16,
i\[2\] = n\[4\] ^ n\[1\] >>> 16 ^ n\[7\] << 16,
i\[3\] = n\[6\] ^ n\[3\] >>> 16 ^ n\[1\] << 16;
for (var r = 0; r < 4; r++)
i\[r\] = 16711935 & (i\[r\] >> 24) | 4278255360 & (i\[r\] >> 8),
e\[t + r\] ^= i\[r\]
},
blockSize: 4,
ivSize: 2
});
function u() {
for (var e = this.\_X, t = this.\_C, n = 0; n < 8; n++)
a\[n\] = t\[n\];
for (t\[0\] = t\[0\] + 1295307597 + this.\_b | 0,
t\[1\] = t\[1\] + 3545052371 + (t\[0\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[2\] = t\[2\] + 886263092 + (t\[1\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[3\] = t\[3\] + 1295307597 + (t\[2\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[4\] = t\[4\] + 3545052371 + (t\[3\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[5\] = t\[5\] + 886263092 + (t\[4\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[6\] = t\[6\] + 1295307597 + (t\[5\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[7\] = t\[7\] + 3545052371 + (t\[6\] >>> 0 >> 0 ? 1 : 0) | 0,
this.\_b = t\[7\] >>> 0 >> 0 ? 1 : 0,
n = 0; n < 8; n++) {
var r = e\[n\] + t\[n\],
i = 65535 & r,
s = r >>> 16,
u = ((i \* i >>> 17) + i \* s >>> 15) + s \* s,
c = ((4294901760 & r) \* r | 0) + ((65535 & r) \* r | 0);
o\[n\] = u ^ c
}
e\[0\] = o\[0\] + (o\[7\] >> 16) + (o\[6\] >> 16) | 0,
e\[1\] = o\[1\] + (o\[0\] >> 24) + o\[7\] | 0,
e\[2\] = o\[2\] + (o\[1\] >> 16) + (o\[0\] >> 16) | 0,
e\[3\] = o\[3\] + (o\[2\] >> 24) + o\[1\] | 0,
e\[4\] = o\[4\] + (o\[3\] >> 16) + (o\[2\] >> 16) | 0,
e\[5\] = o\[5\] + (o\[4\] >> 24) + o\[3\] | 0,
e\[6\] = o\[6\] + (o\[5\] >> 16) + (o\[4\] >> 16) | 0,
e\[7\] = o\[7\] + (o\[6\] >> 24) + o\[5\] | 0
}
e.Rabbit = t.\_createHelper(s)
}(),
n.Rabbit)
})),
n((function(e, t) {
var n;
e.exports = (n = r,
function() {
var e = n,
t = e.lib.StreamCipher,
r = e.algo,
i = \[\],
a = \[\],
o = \[\],
s = r.RabbitLegacy = t.extend({
\_doReset: function() {
var e = this.\_key.words,
t = this.cfg.iv,
n = this.\_X = \[e\[0\], e\[3\] >> 16, e\[1\], e\[0\] >> 16, e\[2\], e\[1\] >> 16, e\[3\], e\[2\] >> 16\],
r = this.\_C = \[e\[2\] >> 16, 4294901760 & e\[0\] | 65535 & e\[1\], e\[3\] >> 16, 4294901760 & e\[1\] | 65535 & e\[2\], e\[0\] >> 16, 4294901760 & e\[2\] | 65535 & e\[3\], e\[1\] >> 16, 4294901760 & e\[3\] | 65535 & e\[0\]\];
this.\_b = 0;
for (var i = 0; i < 4; i++)
u.call(this);
for (i = 0; i < 8; i++)
r\[i\] ^= n\[i + 4 & 7\];
if (t) {
var a = t.words,
o = a\[0\],
s = a\[1\],
c = 16711935 & (o >> 24) | 4278255360 & (o >> 8),
l = 16711935 & (s >> 24) | 4278255360 & (s >> 8),
d = c >>> 16 | 4294901760 & l,
f = l << 16 | 65535 & c;
for (r\[0\] ^= c,
r\[1\] ^= d,
r\[2\] ^= l,
r\[3\] ^= f,
r\[4\] ^= c,
r\[5\] ^= d,
r\[6\] ^= l,
r\[7\] ^= f,
i = 0; i < 4; i++)
u.call(this)
}
},
\_doProcessBlock: function(e, t) {
var n = this.\_X;
u.call(this),
i\[0\] = n\[0\] ^ n\[5\] >>> 16 ^ n\[3\] << 16,
i\[1\] = n\[2\] ^ n\[7\] >>> 16 ^ n\[5\] << 16,
i\[2\] = n\[4\] ^ n\[1\] >>> 16 ^ n\[7\] << 16,
i\[3\] = n\[6\] ^ n\[3\] >>> 16 ^ n\[1\] << 16;
for (var r = 0; r < 4; r++)
i\[r\] = 16711935 & (i\[r\] >> 24) | 4278255360 & (i\[r\] >> 8),
e\[t + r\] ^= i\[r\]
},
blockSize: 4,
ivSize: 2
});
function u() {
for (var e = this.\_X, t = this.\_C, n = 0; n < 8; n++)
a\[n\] = t\[n\];
for (t\[0\] = t\[0\] + 1295307597 + this.\_b | 0,
t\[1\] = t\[1\] + 3545052371 + (t\[0\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[2\] = t\[2\] + 886263092 + (t\[1\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[3\] = t\[3\] + 1295307597 + (t\[2\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[4\] = t\[4\] + 3545052371 + (t\[3\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[5\] = t\[5\] + 886263092 + (t\[4\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[6\] = t\[6\] + 1295307597 + (t\[5\] >>> 0 >> 0 ? 1 : 0) | 0,
t\[7\] = t\[7\] + 3545052371 + (t\[6\] >>> 0 >> 0 ? 1 : 0) | 0,
this.\_b = t\[7\] >>> 0 >> 0 ? 1 : 0,
n = 0; n < 8; n++) {
var r = e\[n\] + t\[n\],
i = 65535 & r,
s = r >>> 16,
u = ((i \* i >>> 17) + i \* s >>> 15) + s \* s,
c = ((4294901760 & r) \* r | 0) + ((65535 & r) \* r | 0);
o\[n\] = u ^ c
}
e\[0\] = o\[0\] + (o\[7\] >> 16) + (o\[6\] >> 16) | 0,
e\[1\] = o\[1\] + (o\[0\] >> 24) + o\[7\] | 0,
e\[2\] = o\[2\] + (o\[1\] >> 16) + (o\[0\] >> 16) | 0,
e\[3\] = o\[3\] + (o\[2\] >> 24) + o\[1\] | 0,
e\[4\] = o\[4\] + (o\[3\] >> 16) + (o\[2\] >> 16) | 0,
e\[5\] = o\[5\] + (o\[4\] >> 24) + o\[3\] | 0,
e\[6\] = o\[6\] + (o\[5\] >> 16) + (o\[4\] >> 16) | 0,
e\[7\] = o\[7\] + (o\[6\] >> 24) + o\[5\] | 0
}
e.RabbitLegacy = t.\_createHelper(s)
}(),
n.RabbitLegacy)
})),
n((function(e, t) {
e.exports = r
})));
t.a = i
}).call(this, n("JAn9"))
},
JAn9: function(e, t) {
var n;
n = function() {
return this
}();
try {
n = n || new Function("return this")()
} catch (e) {
"object" == typeof window && (n = window)
}
e.exports = n
}
});
var r = sign("n770");
function jiemi(e, t) {
void 0 === e && (e = ""),
void 0 === t && (t = "");
var n = a(),
i = r.a.AES.decrypt(e.toString(), n.key, {
iv: r.a.enc.Utf8.parse(t),
mode: n.mode,
padding: n.pad
});
return i = i.toString(r.a.enc.Utf8)
}
function a() {
var e, t, n, a, o;
var i = null;
return i || ((o = null) || (t = new RegExp("\\\\u200c", "g"),
n = new RegExp("\\\\u200d", "g"),
a = new RegExp(".{8}", "g"),
e = "".replace(a, (function(e) {
return String.fromCharCode(parseInt(e.replace(t, 1).replace(n, 0), 2))
})),
o = {
key: r.a.enc.Utf8.parse(e),
mode: r.a.mode.CBC,
pad: r.a.pad.Pkcs7
}),
i = o),
i
}
function o(e, t) {
void 0 === e && (e = ""),
void 0 === t && (t = "");
var n = a(),
i = r.a.AES.encrypt(e.toString(), n.key, {
iv: r.a.enc.Utf8.parse(t),
mode: n.mode,
padding: n.pad
});
return i = i.toString()
}
console.log(jiemi(e, t))
```