🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
![](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)) ```