免责声明:
本篇博文的初衷是分享自己学习逆向分析时的个人感悟,所涉及的内容仅供学习、交流,请勿将其用于非法用途!!!任何由此引发的法律纠纷均与作者本人无关,请自行负责!!!
推荐文章:
https://app.yinxiang.com/fx/970ae39c-9964-4aae-aa96-7e81fee4ef8f
WebPack
webpack是JavaScript应用程序的模块备份器,可以把开发中的所有资源(图片、js文件、css文件等)都看成模块,通过loader(加载器)和plugins(插件)对资源进行处理,备份成符合生产环境部署的前端资源。所有的资源都是通过JavaScript渲染出来的。
常见的形式
// 数组形式
!function(形参){
加载器}([模块])
// 字典形式
!function(形参){
加载器}({
模块})
扣取代码
抓包发现每次请求都需要先请求一个public包,可以发现这个请求的内容是一个公钥。第二次的加密参数需要这个值。

需要的加密参数:param,cookie未加密,可以多抓几个包看一下
进行参数的搜索

我们进去之后发现这个参数比较多,但是我们需要的事请求公钥之后的那个加密的内容,所以我们可以直接搜索这个公钥的请求地址,这样可以快速帮助我们定位到需要的内容

打上断点进行调试

我们断点调试输出这个内容,为什么说我直接就输出r和这个s呢?这边我们直接看 s 是返回的,那么这个值肯定是需要传递的价值比较大,这个r 是在 t.setPublicKey®, 这个位置见名知意,setPublicKey 那么我们可以看一下。最终结束调试看一下请求参数。

可以知道就是这个位置进行了调用公钥,但是这个参数s是不是最终的结果呢?这个需要我们继续调试进行验证

这个加密是一个变化的值,我们进行值验证也无法进行,所以我们直接进行xhr断点调试然后向上找就行。

断到最后发送的位置,这个时候向上找看一下这个s是否是最终需要的参数,我们发现最终发的加密在p中,那么找到p的赋值位置。

执行了一个异步,我们发现p是通过e进行赋值的。e是一个参数。

一直找可以找到这个参数传递的位置是在这个地方

大个断点,然后重新调试,发现传递参数后面经过 这个位置

并且这个位置并不是执行的加密逻辑。

但是当释放上面断点的时候,发现第二次来到这个位置,输出的值就是加密后的内容。

向上跟栈,追到这个位置

单步调试进入这个参数中,这个内容是t生成的,那么这个时候我们直接断到t进行跟栈
调试发现,t生成的事通过这个位置进行生成的,可以知道最终需要的事在这边地方。

需要的事这个s的值
s = t.encryptLong(JSON.stringify(a)),
我们依次进行代码扣取,

t = d【“a”】
我们需要先找到d[“a”]的生成

可以看到d是一个模块,那么这个时候开始扣取代码,然后补一下就行。
扣去加载器,然后进行模块的填充。

那么现在就只需要扣取代码就行,中间有一个A[e].call 我们可以在上面进行输出,看一下缺少什么,这样的话会更加容易,直接在nodejs中输出这个异常就行。剩下的就是不断调试了
var scream;
var window = global;
(function (A) {
function e(e) {
for (var n, r, i = e[0], o = e[1], c = e[2], g = 0, C = []; g < i.length; g++)
r = i[g],
Object.prototype.hasOwnProperty.call(a, r) && a[r] && C.push(a[r][0]),
a[r] = 0;
for (n in o)
Object.prototype.hasOwnProperty.call(o, n) && (A[n] = o[n]);
l && l(e);
while (C.length)
C.shift()();
return s.push.apply(s, c || []),
t()
}
function t() {
for (var A, e = 0; e < s.length; e++) {
for (var t = s[e], n = !0, r = 1; r < t.length; r++) {
var i = t[r];
0 !== a[i] && (n = !1)
}
n && (s.splice(e--, 1),
A = o(o.s = t[0]))
}
return A
}
var n = {
}
, r = {
index: 0
}
, a = {
index: 0
}
, s = [];
function i(A) {
return o.p + "js/" + ({
}[A] || A) + ".js"
}
function o(e) {
if (n[e])
return n[e].exports;
var t = n[e] = {
i: e,
l: !1,
exports: {
}
};
return A[e].call(t.exports, t, t.exports, o),
t.l = !0,
t.exports
}
o.e = function (A) {
var e = []
, t = {
"chunk-014f8c76": 1,
"chunk-022d1a1e": 1,
"chunk-08dfb5f4": 1,
"chunk-0e71e1ec": 1,
"chunk-1ea9c550": 1,
"chunk-27c6c980": 1,
"chunk-292fc281": 1,
"chunk-36ad665a": 1,
"chunk-37d3c79c": 1,
"chunk-3a8e87b2": 1,
"chunk-3ae95355": 1,
"chunk-564fa90c": 1,
"chunk-6038e544": 1,
"chunk-65aa7b64": 1,
"chunk-69a5ffe2": 1,
"chunk-6a6e0a4d": 1,
"chunk-6b845cb2": 1,
"chunk-6ced383c": 1,
"chunk-6dc29283": 1,
"chunk-6f9084b2": 1,
"chunk-72c3d136": 1,
"chunk-73322c15": 1,
"chunk-79490809": 1,
"chunk-79fda34d": 1,
"chunk-7ddeb4f7": 1,
"chunk-84f3bc8a": 1,
"chunk-87c5890c": 1,
"chunk-90be71c6": 1,
"chunk-b702925a": 1,
"chunk-b8947556": 1,
"chunk-be76fe62": 1,
"chunk-c6a7f81c": 1,
"chunk-d055d7ec": 1,
"chunk-fda268a2": 1
};
r[A] ? e.push(r[A]) : 0 !== r[A] && t[A] && e.push(r[A] = new Promise((function (e, t) {
for (var n = "css/" + ({
}[A] || A) + ".css", a = o.p + n, s = document.getElementsByTagName("link"), i = 0; i < s.length; i++) {
var c = s[i]
, g = c.getAttribute("data-href") || c.getAttribute("href");
if ("stylesheet" === c.rel && (g === n || g === a))
return e()
}
var C = document.getElementsByTagName("style");
for (i = 0; i < C.length; i++) {
c = C[i],
g = c.getAttribute("data-href");
if (g === n || g === a)
return e()
}
var l = document.createElement("link");
l.rel = "stylesheet",
l.type = "text/css",
l.onload = e,
l.onerror = function (e) {
var n = e && e.target && e.target.src || a
, s = new Error("Loading CSS chunk " + A + " failed.\n(" + n + ")");
s.code = "CSS_CHUNK_LOAD_FAILED",
s.request = n,
delete r[A],
l.parentNode.removeChild(l),
t(s)
}
,
l.href = a;
var I = document.getElementsByTagName("head")[0];
I.appendChild(l)
}
)).then((function () {
r[A] = 0
}
)));
var n = a[A];
if (0 !== n)
if (n)
e.push(n[2]);
else {
var s = new Promise((function (e, t) {
n = a[A] = [e, t]
}
));
e.push(n[2] = s);
var c, g = document.createElement("script");
g.charset = "utf-8",
g.timeout = 120,
o.nc && g.setAttribute("nonce", o.nc),
g.src = i(A);
var C = new Error;
c = function (e) {
g.onerror = g.onload = null,
clearTimeout(l);
var t = a[A];
if (0 !== t) {
if (t) {
var n = e && ("load" === e.type ? "missing" : e.type)
, r = e && e.target && e.target.src;
C.message = "Loading chunk " + A + " failed.\n(" + n + ": " + r + ")",
C.name = "ChunkLoadError",
C.type = n,
C.request = r,
t[1](C)
}
a[A] = void 0
}
}
;
var l = setTimeout((function () {
c({
type: "timeout",
target: g
})
}
), 12e4);
g.onerror = g.onload = c,
document.head.appendChild(g)
}
return Promise.all(e)
}
,
o.m = A,
o.c = n,
o.d = function (A, e, t) {
o.o(A, e) || Object.defineProperty(A, e, {
enumerable: !0,
get: t
})
}
,
o.r = function (A) {
"undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(A, Symbol.toStringTag, {
value: "Module"
}),
Object.defineProperty(A, "__esModule", {
value: !0
})
}
,
o.t = function (A, e) {
if (1 & e && (A = o(A)),
8 & e)
return A;
if (4 & e && "object" === typeof A && A && A.__esModule)
return A;
var t = Object.create(null);
if (o.r(t),
Object.defineProperty(t, "default", {
enumerable: !0,
value: A
}),
2 & e && "string" != typeof A)
for (var n in A)
o.d(t, n, function (e) {
return A[e]
}
.bind(null, n));
return t
}
,
o.n = function (A) {
var e = A && A.__esModule ? function () {
return A["default"]
}
: function () {
return A
}
;
return o.d(e, "a", e),
e
}
,
o.o = function (A, e) {
return Object.prototype.hasOwnProperty.call(A, e)
}
,
o.p = "/common/gikam/",
o.oe = function (A) {
throw console.error(A),
A
}
;
var c = window["webpackJsonp"] = window["webpackJsonp"] || []
, g = c.push.bind(c);
c.push = e,
c = c.slice();
for (var C = 0; C < c.length; C++)
e(c[C]);
var l = g;
s.push([4, "chunk-vendors"]),
t()
scream = o
}
)({
9816: function(e, t, n) {
"use strict";
var r = "0123456789abcdefghijklmnopqrstuvwxyz";
function o(e) {
return r.charAt(e)
}
function i(e, t) {
return e & t
}
function a(e, t) {
return e | t
}
function s(e, t) {
return e ^ t
}
function l(e, t) {
return e & ~t
}
function c(e) {
if (0 == e)
return -1;
var t = 0;
return 0 == (65535 & e) && (e >>= 16,
t += 16),
0 == (255 & e) && (e >>= 8,
t += 8),
0 == (15 & e) && (e >>= 4,
t += 4),
0 == (3 & e) && (e >>= 2,
t += 2),
0 == (1 & e) && ++t,
t
}
function u(e) {
var t = 0;
while (0 != e)
e &= e - 1,
++t;
return t
}
var d, h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", f = "=";
function p(e) {
var t, n, r = "";
for (t = 0; t + 3 <= e.length; t += 3)
n = parseInt(e.substring(t, t + 3), 16),
r += h.charAt(n >> 6) + h.charAt(63 & n);
t + 1 == e.length ? (n = parseInt(e.substring(t, t + 1), 16),
r += h.charAt(n << 2)) : t + 2 == e.length && (n = parseInt(e.substring(t, t + 2), 16),
r += h.charAt(n >> 2) + h.charAt((3 & n) << 4));
while ((3 & r.length) > 0)
r += f;
return r
}
function m(e) {
var t, n = "", r = 0, i = 0;
for (t = 0; t < e.length; ++t) {
if (e.charAt(t) == f)
break;
var a = h.indexOf(e.charAt(t));
a < 0 || (0 == r ? (n += o(a >> 2),
i = 3 & a,
r = 1) : 1 == r ? (n += o(i << 2 | a >> 4),
i = 15 & a,
r = 2) : 2 == r ? (n += o(i),
n += o(a >> 2),
i = 3 & a,
r = 3) : (n += o(i << 2 | a >> 4),
n += o(15 & a),
r = 0))
}
return 1 == r && (n += o(i << 2)),
n
}
var v, g = {
decode: function(e) {
var t;
if (void 0 === d) {
var n = "0123456789ABCDEF"
, r = " \f\n\r\t \u2028\u2029";
for (d = {
},
t = 0; t < 16; ++t)
d[n.charAt(t)] = t;
for (n = n.toLowerCase(),
t = 10; t < 16; ++t)
d[n.charAt(t)] = t;
for (t = 0; t < r.length; ++t)
d[r.charAt(t)] = -1
}
var o = []
, i = 0
, a = 0;
for (t = 0; t < e.length; ++t) {
var s = e.charAt(t);
if ("=" == s)
break;
if (s = d[s],
-1 != s) {
if (void 0 === s)
throw new Error("Illegal character at offset " + t);
i |= s,
++a >= 2 ? (o[o.length] = i,
i = 0,
a = 0) : i <<= 4
}
}
if (a)
throw new Error("Hex encoding incomplete: 4 bits missing");
return o
}
}, b = {
decode: function(e) {
var t;
if (void 0 === v) {
var n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
, r = "= \f\n\r\t \u2028\u2029";
for (v = Object.create(null),
t = 0; t < 64; ++t)
v[n.charAt(t)] = t;
for (v["-"] = 62,
v["_"] = 63,
t = 0; t < r.length; ++t)
v[r.charAt(t)] = -1
}
var o = []
, i = 0
, a = 0;
for (t = 0; t < e.length; ++t) {
var s = e.charAt(t);
if ("=" == s)
break;
if (s = v[s],
-1 != s) {
if (void 0 === s)
throw new Error("Illegal character at offset " + t);
i |= s,
++a >= 4 ? (o[o.length] = i >> 16,
o[o.length] = i >> 8 & 255,
o[o.length] = 255 & i,
i = 0,
a = 0) : i <<= 6
}
}
switch (a) {
case 1:
throw new Error("Base64 encoding incomplete: at least 2 bits missing");
case 2:
o[o.length] = i >> 10;
break;
case 3:
o[o.length] = i >> 16,
o[o.length] = i >> 8 & 255;
break
}
return o
},
re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,
unarmor: function(e) {
var t = b.re.exec(e);
if (t)
if (t[1])
e = t[1];
else {
if (!t[2])
throw new Error("RegExp out of sync");
e = t[2]
}
return b.decode(e)
}
}, y = 1e13, _ = function() {
function e(e) {
this.buf = [+e || 0]
}
return e.prototype.mulAdd = function(e, t) {
var n, r, o = this.buf, i = o.length;
for (n = 0; n < i; ++n)
r = o[n] * e + t,
r < y ? t = 0 : (t = 0 | r / y,
r -= t * y),
o[n] = r;
t > 0 && (o[n] = t)
}
,
e.prototype.sub = function(e) {
var t, n, r = this.buf, o = r.length;
for (t = 0; t < o; ++t)
n = r[t] - e,
n < 0 ? (n += y,
e = 1) : e = 0,
r[t] = n;
while (0 === r[r.length - 1])
r.pop()
}
,
e.prototype.toString = function(e) {
if (10 != (e || 10))
throw new Error("only base 10 is supported");
for (var t = this.buf, n = t[t.length - 1].toString(), r = t.length - 2; r >= 0; --r)
n += (y + t[r]).toString().substring(1);
return n
}
,
e.prototype.valueOf = function() {
for (var e = this.buf, t = 0, n = e.length - 1; n >= 0; --n)
t = t * y + e[n];
return t
}
,
e.prototype.simplify = function() {
var e = this.buf;
return 1 == e.length ? e[0] : this
}
,
e
}(), x = "…", w = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/, C = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
function S(e, t) {
return e.length > t && (e = e.substring(0, t) + x),
e
}
var j, k = function() {
function e(t, n) {
this.hexDigits = "0123456789ABCDEF",
t instanceof e ? (this.enc = t.enc,
this.pos = t.pos) : (this.enc = t,
this.pos = n)
}
return e.prototype.get = function(e) {
if (void 0 === e && (e = this.pos++),
e >= this.enc.length)
throw new Error("Requesting byte offset " + e + " on a stream of length " + this.enc.length);
return "string" === typeof this.enc ? this.enc.charCodeAt(e) : this.enc[e]
}
,
e.prototype.hexByte = function(e) {
return this.hexDigits.charAt(e >> 4 & 15) + this.hexDigits.charAt(15 & e)
}
,
e.prototype.hexDump = function(e, t, n) {
for (var r = "", o = e; o < t; ++o)
if (r += this.hexByte(this.get(o)),
!0 !== n)
switch (15 & o) {
case 7:
r += " ";
break;
case 15:
r += "\n";
break;
default:
r += " "
}
return r
}
,
e.prototype.isASCII = function(e, t) {
for (var n = e; n < t; ++n) {
var r = this.get(n);
if (r < 32 || r > 176)
return !1
}
return !0
}
,
e.prototype.parseStringISO = function(e, t) {
for (var n = "", r = e; r < t; ++r)
n += String.fromCharCode(this.get(r));
return n
}
,
e.prototype.parseStringUTF = function(e, t) {
for (var n = "", r = e; r < t; ) {
var o = this.get(r++);
n += o < 128 ? String.fromCharCode(o) : o > 191 && o < 224 ? String.fromCharCode((31 & o) << 6 | 63 & this.get(r++)) : String.fromCharCode((15 & o) << 12 | (63 & this.get(r++)) << 6 | 63 & this.get(r++))
}
return n
}
,
e.prototype.parseStringBMP = function(e, t) {
for (var n, r, o = "", i = e; i < t; )
n = this.get(i++),
r = this.get(i++),
o += String.fromCharCode(n << 8 | r);
return o
}
,
e.prototype.parseTime = function(e, t, n) {
var r = this.parseStringISO(e, t)
, o = (n ? w : C).exec(r);
return o ? (n && (o[1] = +o[1],
o[1] += +o[1] < 70 ? 2e3 : 1900),
r = o[1] + "-" + o[2] + "-" + o[3] + " " + o[4],
o[5] && (r += ":" + o[5],
o[6] && (r += ":" + o[6],
o[7] && (r += "." + o[7]))),
o[8] && (r += " UTC",
"Z" != o[8] && (r += o[8],
o[9] && (r += ":" + o[9]))),
r) : "Unrecognized time: " + r
}
,
e.prototype.parseInteger = function(e, t) {
var n, r = this.get(e), o = r > 127, i = o ? 255 : 0, a = "";
while (r == i && ++e < t)
r = this.get(e);
if (n = t - e,
0 === n)
return o ? -1 : 0;
if (n > 4) {
a = r,
n <<= 3;
while (0 == (128 & (+a ^ i)))
a = +a << 1,
--n;
a = "(" + n + " bit)\n"
}
o && (r -= 256);
for (var s = new _(r), l = e + 1; l < t; ++l)
s.mulAdd(256, this.get(l));
return a + s.toString()
}
,
e.prototype.parseBitString = function(e, t, n) {
for (var r = this.get(e), o = (t - e - 1 << 3) - r, i = "(" + o + " bit)\n", a = "", s = e + 1; s < t; ++s) {
for (var l = this.get(s), c = s == t - 1 ? r : 0, u = 7; u >= c; --u)
a += l >> u & 1 ? "1" : "0";
if (a.length > n)
return i + S(a, n)
}
return i + a
}
,
e.prototype.parseOctetString = function(e, t, n) {
if (this.isASCII(e, t))
return S(this.parseStringISO(e, t), n);
var r = t - e
, o = "(" + r + " byte)\n";
n /= 2,
r > n && (t = e + n);
for (var i = e; i < t; ++i)
o += this.hexByte(this.get(i));
return r > n && (o += x),
o
}
,
e.prototype.parseOID = function(e, t, n) {
for (var r = "", o = new _, i = 0, a = e; a < t; ++a) {
var s = this.get(a);
if (o.mulAdd(128, 127 & s),
i += 7,
!(128 & s)) {
if ("" === r)
if (o = o.simplify(),
o instanceof _)
o.sub(80),
r = "2." + o.toString();
else {
var l = o < 80 ? o < 40 ? 0 : 1 : 2;
r = l + "." + (o - 40 * l)
}
else
r += "." + o.toString();
if (r.length > n)
return S(r, n);
o = new _,
i = 0
}
}
return i > 0 && (r += ".incomplete"),
r
}
,
e
}(), O = function() {
function e(e, t, n, r, o) {
if (!(r instanceof M))
throw new Error("Invalid tag value.");
this.stream = e,
this.header = t,
this.length = n,
this.tag = r,
this.sub = o
}
return e.prototype.typeName = function() {
switch (this.tag.tagClass) {
case 0:
switch (this.tag.tagNumber) {
case 0:
return "EOC";
case 1:
return "BOOLEAN";
case 2:
return "INTEGER";
case 3:
return "BIT_STRING";
case 4:
return "OCTET_STRING";
case 5:
return "NULL";
case 6:
return "OBJECT_IDENTIFIER";
case 7:
return "ObjectDescriptor";
case 8:
return "EXTERNAL";
case 9:
return "REAL";
case 10:
return "ENUMERATED";
case 11:
return "EMBEDDED_PDV";
case 12:
return "UTF8String";
case 16:
return "SEQUENCE";
case 17:
return "SET";
case 18:
return "NumericString";
case 19:
return "PrintableString";
case 20:
return "TeletexString";
case 21:
return "VideotexString";
case 22:
return "IA5String";
case 23:
return "UTCTime";
case 24:
return "GeneralizedTime";
case 25:
return "GraphicString";
case 26:
return "VisibleString";
case 27:
return "GeneralString";
case 28:
return "UniversalString";
case 30:
return "BMPString"
}
return "Universal_" + this.tag.tagNumber.toString();
case 1:
return "Application_" + this.tag.tagNumber.toString();
case 2:
return "[" + this.tag.tagNumber.toString() + "]";
case 3:
return "Private_" + this.tag.tagNumber.toString()
}
}
,
e.prototype.content = function(e) {
if (void 0 === this.tag)
return null;
void 0 === e && (e = 1 / 0);
var t = this.posContent()
, n = Math.abs(this.length);
if (!this.tag.isUniversal())
return null !== this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(t, t + n, e);
switch (this.tag.tagNumber) {
case 1:
return 0 === this.stream.get(t) ? "false" : "true";
case 2:
return this.stream.parseInteger(t, t + n);
case 3:
return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(t, t + n, e);
case 4:
return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(t, t + n, e);
case 6:
return this.stream.parseOID(t, t + n, e);
case 16:
case 17:
return null !== this.sub ? "(" + this.sub.length + " elem)" : "(no elem)";
case 12:
return S(this.stream.parseStringUTF(t, t + n), e);
case 18:
case 19:
case 20:
case 21:
case 22:
case 26:
return S(this.stream.parseStringISO(t, t + n), e);
case 30:
return S(this.stream.parseStringBMP(t, t + n), e);
case 23:
case 24:
return this.stream.parseTime(t, t + n, 23 == this.tag.tagNumber)
}
return null
}
,
e.prototype.toString = function() {
return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length +

最低0.47元/天 解锁文章
2145

被折叠的 条评论
为什么被折叠?



