吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3900|回复: 21
上一主题 下一主题
收起左侧

[Web逆向] 【js逆向】图书馆挠痒大作战

[复制链接]
跳转到指定楼层
楼主
hj170520 发表于 2025-8-14 03:21 回帖奖励
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
目标网址aHR0cHM6Ly94aWFvbW14LmNuL25vLXVzZS9saWJyYXJ5LWl0Y2g=
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


重拾js逆向,请多指教!网站有点简单。f12,输入网址后回车,点击xhr查看数据包:

三个加密参数,打开调用堆栈,直接跟栈,可以发现我们的参数在je()函数内部生成。

跟进函数内部,可以看到,是整个je()函数调用,

按顺序我们可以看到第一个参数o = Math.floor(Date.now() / 6e4)是生成了时间戳X-Timestamps


第二个参数是是X-Fingerprint$t()生成。我们跟进函数内部可以看到,它做了一个逻辑判断:判断是否本地localStorage存储了该数据,否则重新生成。然后返回数值。后面在控制台打印发现,这个数值和本地存储的数值一样,可以确认这个数值是个静态的数据,我们怎么简单怎么来!(后面我扒了一下生成函数t = new uo.ClientJS().getFingerprint().toString(),它需要做一个Webpack打包和补环境,相比较某红书及某马拉雅要简单一些!有想尝试的可以看我的JS源码)好啦!下面我们来到了最后一个参数X-Auth-Hash是由加密函数go(u, bo).toString()生成


跟进这个加密函数可以看到,他传入了(r, o) 两个参数给一个 new ft(t,o).finalize(r)


这个地方的难点在于ft()t都是一个class。按照补环境的思路,我们把class ftclass h 补完后慢慢补其他的class就行了!JS代码打包放在最后,可以复制后直接调用!最后我们把请求头的参数打印出来。

补完后我们发个包看一下!我们第一个请求成功了,第二个请求失败是因为网站做了请求session的加密处理,具体我还没找到应对方式,但肯定有大佬搞出来了!希望各位不吝赐教!

[JavaScript] 纯文本查看 复制代码
// 补环境部分用于获取 参数 X-Fingerprint ---------------------------------------------------
window = global;
document = {
    getElementsByTagName: function(res) {
            if (res == 'body') {
            // console.log('document.createElement:::', res)
            return {
                0:{appendChild: function (){},
                   removeChild: function (){}}
            }
            }
    },
    createElement: function(res){
            if (res == 'span') {
            // console.log('document.createElement:::', res)
            return {
                style:{fontSize:{}}
            }
            }
    }
};
window.screen = {
    "width":1728,
    "height":1117,
    "availWidth":1728,
    "availHeight":1085,
    "pixelRatio":2
};
navigator = {
    userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',
    plugins: {
    "0": {
        "0": {},
        "1": {}
    },
    "1": {
        "0": {},
        "1": {}
    },
    "2": {
        "0": {},
        "1": {}
    },
    "3": {
        "0": {},
        "1": {}
    },
    "4": {
        "0": {},
        "1": {}
    }
}
};
 
 
// 补Class部分用于获取 参数 X-Auth-Hash ----------------------------------------------------
const St = ((Je = typeof globalThis < "u" ? globalThis : void 0) === null || Je === void 0 ? void 0 : Je.crypto) || ((Ye = typeof global < "u" ? global : void 0) === null || Ye === void 0 ? void 0 : Ye.crypto) || ((Qe = typeof window < "u" ? window : void 0) === null || Qe === void 0 ? void 0 : Qe.crypto) || ((Ze = typeof self < "u" ? self : void 0) === null || Ze === void 0 ? void 0 : Ze.crypto) || ((tt = (et = typeof frames < "u" ? frames : void 0) === null || et === void 0 ? void 0 : et[0]) === null || tt === void 0 ? void 0 : tt.crypto);
 
let ct;
St ? ct = e => {
    const t = [];
    for (let r = 0; r < e; r += 4)
        t.push(St.getRandomValues(new Uint32Array(1))[0]);
    return new ge(t,e)
}
: ct = e => {
    const t = []
      , r = s => {
        let l = s
          , u = 987654321;
        const v = 4294967295;
        return () => {
            u = 36969 * (u & 65535) + (u >> 16) & v,
            l = 18e3 * (l & 65535) + (l >> 16) & v;
            let k = (u << 16) + l & v;
            return k /= 4294967296,
            k += .5,
            k * (Math.random() > .5 ? 1 : -1)
        }
    }
    ;
    let o;
    for (let s = 0; s < e; s += 4) {
        const l = r((o || Math.random()) * 4294967296);
        o = l() * 987654071,
        t.push(l() * 4294967296 | 0)
    }
    return new ge(t,e)
}
;
class ut {
    static create(...t) {
        return new this(...t)
    }
    mixIn(t) {
        return Object.assign(this, t)
    }
    clone() {
        const t = new this.constructor;
        return Object.assign(t, this),
        t
    }
}
class ge extends ut {
    constructor(t=[], r) {
        if (super(),
        t instanceof ArrayBuffer) {
            const o = new Uint8Array(t);
            this._initFromUint8Array(o);
            return
        }
        if (ArrayBuffer.isView(t)) {
            let o;
            t instanceof Uint8Array ? o = t : o = new Uint8Array(t.buffer,t.byteOffset,t.byteLength),
            this._initFromUint8Array(o);
            return
        }
        this.words = t,
        this.sigBytes = r !== void 0 ? r : this.words.length * 4
    }
    _initFromUint8Array(t) {
        const r = t.byteLength
          , o = [];
        for (let s = 0; s < r; s += 1)
            o[s >>> 2] |= t[s] << 24 - s % 4 * 8;
        this.words = o,
        this.sigBytes = r
    }
    toString(t=fo) {
        return t.stringify(this)
    }
    concat(t) {
        const r = this.words
          , o = t.words
          , s = this.sigBytes
          , l = t.sigBytes;
        if (this.clamp(),
        s % 4)
            for (let u = 0; u < l; u += 1) {
                const v = o[u >>> 2] >>> 24 - u % 4 * 8 & 255;
                r[s + u >>> 2] |= v << 24 - (s + u) % 4 * 8
            }
        else
            for (let u = 0; u < l; u += 4)
                r[s + u >>> 2] = o[u >>> 2];
        return this.sigBytes += l,
        this
    }
    clamp() {
        const {words: t, sigBytes: r} = this;
        t[r >>> 2] &= 4294967295 << 32 - r % 4 * 8,
        t.length = Math.ceil(r / 4)
    }
    clone() {
        const t = super.clone();
        return t.words = this.words.slice(0),
        t
    }
}
ge.random = ct;
const fo = {
    stringify(e) {
        const {words: t, sigBytes: r} = e
          , o = [];
        for (let s = 0; s < r; s += 1) {
            const l = t[s >>> 2] >>> 24 - s % 4 * 8 & 255;
            o.push((l >>> 4).toString(16)),
            o.push((l & 15).toString(16))
        }
        return o.join("")
    },
    parse(e) {
        const t = e.length
          , r = [];
        for (let o = 0; o < t; o += 2)
            r[o >>> 3] |= parseInt(e.substr(o, 2), 16) << 24 - o % 8 * 4;
        return new ge(r,t / 2)
    }
}
  , Tt = {
    stringify(e) {
        const {words: t, sigBytes: r} = e
          , o = [];
        for (let s = 0; s < r; s += 1) {
            const l = t[s >>> 2] >>> 24 - s % 4 * 8 & 255;
            o.push(String.fromCharCode(l))
        }
        return o.join("")
    },
    parse(e) {
        const t = e.length
          , r = [];
        for (let o = 0; o < t; o += 1)
            r[o >>> 2] |= (e.charCodeAt(o) & 255) << 24 - o % 4 * 8;
        return new ge(r,t)
    }
}
  , Ht = {
    stringify(e) {
        try {
            return decodeURIComponent(escape(Tt.stringify(e)))
        } catch {
            throw new Error("Malformed UTF-8 data")
        }
    },
    parse(e) {
        return Tt.parse(unescape(encodeURIComponent(e)))
    }
};
class mo extends ut {
    constructor() {
        super(),
        this._minBufferSize = 0
    }
    reset() {
        this._data = new ge,
        this._nDataBytes = 0
    }
    _append(t) {
        let r;
        typeof t == "string" ? r = Ht.parse(t) : r = t,
        this._data.concat(r),
        this._nDataBytes += r.sigBytes
    }
    _process(t) {
        let r;
        const o = this._data
          , s = o.words
          , l = o.sigBytes
          , u = this.blockSize * 4;
        let v = l / u;
        t ? v = Math.ceil(v) : v = Math.max((v | 0) - this._minBufferSize, 0);
        const k = v * this.blockSize
          , z = Math.min(k * 4, l);
        if (k) {
            for (let M = 0; M < k; M += this.blockSize)
                this._doProcessBlock(s, M);
            r = s.splice(0, k),
            o.sigBytes -= z
        }
        return new ge(r || [],z)
    }
    clone() {
        const t = super.clone();
        return t._data = this._data.clone(),
        t
    }
}
class Ut extends mo {
    constructor(t) {
        super(),
        this.blockSize = 512 / 32,
        this.cfg = Object.assign({}, t),
        this.reset()
    }
    static _createHelper(t) {
        return (r, o) => new t(o).finalize(r)
    }
    static _createHmacHelper(t) {
        return (r, o) => new ft(t,o).finalize(r)
    }
    reset() {
        super.reset(),
        this._doReset()
    }
    update(t) {
        return this._append(t),
        this._process(),
        this
    }
    finalize(t) {
        return t && this._append(t),
        this._doFinalize()
    }
}
class po extends Ut {
}
class ft extends ut {
    constructor(t, r) {
        super();
        const o = new t;
        this._hasher = o;
        let s;
        typeof r == "string" ? s = Ht.parse(r) : s = r;
        const l = o.blockSize
          , u = l * 4;
        s.sigBytes > u && (s = o.finalize(s)),
        s.clamp();
        const v = s.clone();
        this._oKey = v;
        const k = s.clone();
        this._iKey = k;
        const z = v.words
          , M = k.words;
        for (let C = 0; C < l; C += 1)
            z[C] ^= 1549556828,
            M[C] ^= 909522486;
        v.sigBytes = u,
        k.sigBytes = u,
        this.reset()
    }
    static create(...t) {
        const [r,o] = t;
        return new ft(r,o)
    }
    reset() {
        const t = this._hasher;
        t.reset(),
        t.update(this._iKey)
    }
    update(t) {
        return this._hasher.update(t),
        this
    }
    finalize(t) {
        const r = this._hasher
          , o = r.finalize(t);
        return r.reset(),
        r.finalize(this._oKey.clone().concat(o))
    }
}
const _ = [];
for (let e = 0; e < 64; e += 1)
    _[e] = Math.abs(Math.sin(e + 1)) * 4294967296 | 0;
const X = (e, t, r, o, s, l, u) => {
    const v = e + (t & r | ~t & o) + s + u;
    return (v << l | v >>> 32 - l) + t
}
  , J = (e, t, r, o, s, l, u) => {
    const v = e + (t & o | r & ~o) + s + u;
    return (v << l | v >>> 32 - l) + t
}
  , Y = (e, t, r, o, s, l, u) => {
    const v = e + (t ^ r ^ o) + s + u;
    return (v << l | v >>> 32 - l) + t
}
  , Q = (e, t, r, o, s, l, u) => {
    const v = e + (r ^ (t | ~o)) + s + u;
    return (v << l | v >>> 32 - l) + t
}
;
class ho extends po {
    _doReset() {
        this._hash = new ge([1732584193, 4023233417, 2562383102, 271733878])
    }
    _doProcessBlock(t, r) {
        const o = t;
        for (let Z = 0; Z < 16; Z += 1) {
            const be = r + Z
              , ne = t[be];
            o[be] = (ne << 8 | ne >>> 24) & 16711935 | (ne << 24 | ne >>> 8) & 4278255360
        }
        const s = this._hash.words
          , l = o[r + 0]
          , u = o[r + 1]
          , v = o[r + 2]
          , k = o[r + 3]
          , z = o[r + 4]
          , M = o[r + 5]
          , C = o[r + 6]
          , H = o[r + 7]
          , F = o[r + 8]
          , L = o[r + 9]
          , P = o[r + 10]
          , W = o[r + 11]
          , G = o[r + 12]
          , ee = o[r + 13]
          , te = o[r + 14]
          , re = o[r + 15];
        let g = s[0]
          , b = s[1]
          , w = s[2]
          , i = s[3];
        g = X(g, b, w, i, l, 7, _[0]),
        i = X(i, g, b, w, u, 12, _[1]),
        w = X(w, i, g, b, v, 17, _[2]),
        b = X(b, w, i, g, k, 22, _[3]),
        g = X(g, b, w, i, z, 7, _[4]),
        i = X(i, g, b, w, M, 12, _[5]),
        w = X(w, i, g, b, C, 17, _[6]),
        b = X(b, w, i, g, H, 22, _[7]),
        g = X(g, b, w, i, F, 7, _[8]),
        i = X(i, g, b, w, L, 12, _[9]),
        w = X(w, i, g, b, P, 17, _[10]),
        b = X(b, w, i, g, W, 22, _[11]),
        g = X(g, b, w, i, G, 7, _[12]),
        i = X(i, g, b, w, ee, 12, _[13]),
        w = X(w, i, g, b, te, 17, _[14]),
        b = X(b, w, i, g, re, 22, _[15]),
        g = J(g, b, w, i, u, 5, _[16]),
        i = J(i, g, b, w, C, 9, _[17]),
        w = J(w, i, g, b, W, 14, _[18]),
        b = J(b, w, i, g, l, 20, _[19]),
        g = J(g, b, w, i, M, 5, _[20]),
        i = J(i, g, b, w, P, 9, _[21]),
        w = J(w, i, g, b, re, 14, _[22]),
        b = J(b, w, i, g, z, 20, _[23]),
        g = J(g, b, w, i, L, 5, _[24]),
        i = J(i, g, b, w, te, 9, _[25]),
        w = J(w, i, g, b, k, 14, _[26]),
        b = J(b, w, i, g, F, 20, _[27]),
        g = J(g, b, w, i, ee, 5, _[28]),
        i = J(i, g, b, w, v, 9, _[29]),
        w = J(w, i, g, b, H, 14, _[30]),
        b = J(b, w, i, g, G, 20, _[31]),
        g = Y(g, b, w, i, M, 4, _[32]),
        i = Y(i, g, b, w, F, 11, _[33]),
        w = Y(w, i, g, b, W, 16, _[34]),
        b = Y(b, w, i, g, te, 23, _[35]),
        g = Y(g, b, w, i, u, 4, _[36]),
        i = Y(i, g, b, w, z, 11, _[37]),
        w = Y(w, i, g, b, H, 16, _[38]),
        b = Y(b, w, i, g, P, 23, _[39]),
        g = Y(g, b, w, i, ee, 4, _[40]),
        i = Y(i, g, b, w, l, 11, _[41]),
        w = Y(w, i, g, b, k, 16, _[42]),
        b = Y(b, w, i, g, C, 23, _[43]),
        g = Y(g, b, w, i, L, 4, _[44]),
        i = Y(i, g, b, w, G, 11, _[45]),
        w = Y(w, i, g, b, re, 16, _[46]),
        b = Y(b, w, i, g, v, 23, _[47]),
        g = Q(g, b, w, i, l, 6, _[48]),
        i = Q(i, g, b, w, H, 10, _[49]),
        w = Q(w, i, g, b, te, 15, _[50]),
        b = Q(b, w, i, g, M, 21, _[51]),
        g = Q(g, b, w, i, G, 6, _[52]),
        i = Q(i, g, b, w, k, 10, _[53]),
        w = Q(w, i, g, b, P, 15, _[54]),
        b = Q(b, w, i, g, u, 21, _[55]),
        g = Q(g, b, w, i, F, 6, _[56]),
        i = Q(i, g, b, w, re, 10, _[57]),
        w = Q(w, i, g, b, C, 15, _[58]),
        b = Q(b, w, i, g, ee, 21, _[59]),
        g = Q(g, b, w, i, z, 6, _[60]),
        i = Q(i, g, b, w, W, 10, _[61]),
        w = Q(w, i, g, b, v, 15, _[62]),
        b = Q(b, w, i, g, L, 21, _[63]),
        s[0] = s[0] + g | 0,
        s[1] = s[1] + b | 0,
        s[2] = s[2] + w | 0,
        s[3] = s[3] + i | 0
    }
    _doFinalize() {
        const t = this._data
          , r = t.words
          , o = this._nDataBytes * 8
          , s = t.sigBytes * 8;
        r[s >>> 5] |= 128 << 24 - s % 32;
        const l = Math.floor(o / 4294967296)
          , u = o;
        r[(s + 64 >>> 9 << 4) + 15] = (l << 8 | l >>> 24) & 16711935 | (l << 24 | l >>> 8) & 4278255360,
        r[(s + 64 >>> 9 << 4) + 14] = (u << 8 | u >>> 24) & 16711935 | (u << 24 | u >>> 8) & 4278255360,
        t.sigBytes = (r.length + 1) * 4,
        this._process();
        const v = this._hash
          , k = v.words;
        for (let z = 0; z < 4; z += 1) {
            const M = k[z];
            k[z] = (M << 8 | M >>> 24) & 16711935 | (M << 24 | M >>> 8) & 4278255360
        }
        return v
    }
    clone() {
        const t = super.clone.call(this);
        return t._hash = this._hash.clone(),
        t
    }
}
 
// 补环境部分用于获取 参数 X-Fingerprint ---------------------------------------------------
// 这个部分放在前面会报错。
(function(a) {
                var l = {};
                function s(o) {
                    if (l[o])
                        return l[o].exports;
                    var u = l[o] = {
                        i: o,
                        l: !1,
                        exports: {}
                    };
                    return a[o].call(u.exports, u, u.exports, s),
                    u.l = !0,
                    u.exports
                }
                global.s = s;
                return s.m = a,
                s.c = l,
                s.d = function(o, u, d) {
                    s.o(o, u) || Object.defineProperty(o, u, {
                        enumerable: !0,
                        get: d
                    })
                }
                ,
                s.r = function(o) {
                    typeof Symbol < "u" && Symbol.toStringTag && Object.defineProperty(o, Symbol.toStringTag, {
                        value: "Module"
                    }),
                    Object.defineProperty(o, "__esModule", {
                        value: !0
                    })
                }
                ,
                s.t = function(o, u) {
                    if (1 & u && (o = s(o)),
                    8 & u || 4 & u && typeof o == "object" && o && o.__esModule)
                        return o;
                    var d = Object.create(null);
                    if (s.r(d),
                    Object.defineProperty(d, "default", {
                        enumerable: !0,
                        value: o
                    }),
                    2 & u && typeof o != "string")
                        for (var w in o)
                            s.d(d, w, (function(m) {
                                return o[m]
                            }
                            ).bind(null, w));
                    return d
                }
                ,
                s.n = function(o) {
                    var u = o && o.__esModule ? function() {
                        return o.default
                    }
                    : function() {
                        return o
                    }
                    ;
                    return s.d(u, "a", u),
                    u
                }
                ,
                s.o = function(o, u) {
                    return Object.prototype.hasOwnProperty.call(o, u)
                }
                ,
                s.p = "",
                s(s.s = 0)
            })([function(a, l, s) {
                var o, u, d = s(1)(), w = s(3), m = s(4), g = s(6), h = function() {
                    var i = new m;
                    return o = i.getResult(),
                    u = new g,
                    this
                };
                h.prototype = {
                    getSoftwareVersion: function() {
                        return "0.1.11"
                    },
                    getBrowserData: function() {
                        return o
                    },
                    getFingerprint: function() {
                        var i = "|"
                          , n = o.ua
                          , t = this.getScreenPrint()
                          , r = this.getPlugins()
                          , c = this.getFonts()
                          , C = this.isLocalStorage()
                          , x = this.isSessionStorage()
                          , p = this.getTimeZone()
                          , b = this.getLanguage()
                          , A = this.getSystemLanguage()
                          , L = this.isCookie()
                          , k = this.getCanvasPrint();
                        return w(n + i + t + i + r + i + c + i + C + i + x + i + p + i + b + i + A + i + L + i + k, 256)
                    },
                    getCustomFingerprint: function() {
                        for (var i = "|", n = "", t = 0; t < arguments.length; t++)
                            n += arguments[t] + i;
                        return w(n, 256)
                    },
                    getUserAgent: function() {
                        return o.ua
                    },
                    getUserAgentLowerCase: function() {
                        return o.ua.toLowerCase()
                    },
                    getBrowser: function() {
                        return o.browser.name
                    },
                    getBrowserVersion: function() {
                        return o.browser.version
                    },
                    getBrowserMajorVersion: function() {
                        return o.browser.major
                    },
                    isIE: function() {
                        return /IE/i.test(o.browser.name)
                    },
                    isChrome: function() {
                        return /Chrome/i.test(o.browser.name)
                    },
                    isFirefox: function() {
                        return /Firefox/i.test(o.browser.name)
                    },
                    isSafari: function() {
                        return /Safari/i.test(o.browser.name)
                    },
                    isMobileSafari: function() {
                        return /Mobile\sSafari/i.test(o.browser.name)
                    },
                    isOpera: function() {
                        return /Opera/i.test(o.browser.name)
                    },
                    getEngine: function() {
                        return o.engine.name
                    },
                    getEngineVersion: function() {
                        return o.engine.version
                    },
                    getOS: function() {
                        return o.os.name
                    },
                    getOSVersion: function() {
                        return o.os.version
                    },
                    isWindows: function() {
                        return /Windows/i.test(o.os.name)
                    },
                    isMac: function() {
                        return /Mac/i.test(o.os.name)
                    },
                    isLinux: function() {
                        return /Linux/i.test(o.os.name)
                    },
                    isUbuntu: function() {
                        return /Ubuntu/i.test(o.os.name)
                    },
                    isSolaris: function() {
                        return /Solaris/i.test(o.os.name)
                    },
                    getDevice: function() {
                        return o.device.model
                    },
                    getDeviceType: function() {
                        return o.device.type
                    },
                    getDeviceVendor: function() {
                        return o.device.vendor
                    },
                    getCPU: function() {
                        return o.cpu.architecture
                    },
                    isMobile: function() {
                        var i = o.ua || navigator.vendor || window.opera;
                        return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(i) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(i.substr(0, 4))
                    },
                    isMobileMajor: function() {
                        return this.isMobileAndroid() || this.isMobileBlackBerry() || this.isMobileIOS() || this.isMobileOpera() || this.isMobileWindows()
                    },
                    isMobileAndroid: function() {
                        return !!o.ua.match(/Android/i)
                    },
                    isMobileOpera: function() {
                        return !!o.ua.match(/Opera Mini/i)
                    },
                    isMobileWindows: function() {
                        return !!o.ua.match(/IEMobile/i)
                    },
                    isMobileBlackBerry: function() {
                        return !!o.ua.match(/BlackBerry/i)
                    },
                    isMobileIOS: function() {
                        return !!o.ua.match(/iPhone|iPad|iPod/i)
                    },
                    isIphone: function() {
                        return !!o.ua.match(/iPhone/i)
                    },
                    isIpad: function() {
                        return !!o.ua.match(/iPad/i)
                    },
                    isIpod: function() {
                        return !!o.ua.match(/iPod/i)
                    },
                    getScreenPrint: function() {
                        return "Current Resolution: " + this.getCurrentResolution() + ", Available Resolution: " + this.getAvailableResolution() + ", Color Depth: " + this.getColorDepth() + ", Device XDPI: " + this.getDeviceXDPI() + ", Device YDPI: " + this.getDeviceYDPI()
                    },
                    getColorDepth: function() {
                        return screen.colorDepth
                    },
                    getCurrentResolution: function() {
                        return screen.width + "x" + screen.height
                    },
                    getAvailableResolution: function() {
                        return screen.availWidth + "x" + screen.availHeight
                    },
                    getDeviceXDPI: function() {
                        return screen.deviceXDPI
                    },
                    getDeviceYDPI: function() {
                        return screen.deviceYDPI
                    },
                    getPlugins: function() {
                        for (var i = "", n = 0; n < navigator.plugins.length; n++)
                            n == navigator.plugins.length - 1 ? i += navigator.plugins[n].name : i += navigator.plugins[n].name + ", ";
                        return i
                    },
                    isJava: function() {
                        return navigator.javaEnabled()
                    },
                    getJavaVersion: function() {
                        throw new Error("Please use client.java.js or client.js if you need this functionality!")
                    },
                    isFlash: function() {
                        return !!navigator.plugins["Shockwave Flash"]
                    },
                    getFlashVersion: function() {
                        throw new Error("Please use client.flash.js or client.js if you need this functionality!")
                    },
                    isSilverlight: function() {
                        return !!navigator.plugins["Silverlight Plug-In"]
                    },
                    getSilverlightVersion: function() {
                        return this.isSilverlight() ? navigator.plugins["Silverlight Plug-In"].description : ""
                    },
                    isMimeTypes: function() {
                        return !(!navigator.mimeTypes || !navigator.mimeTypes.length)
                    },
                    getMimeTypes: function() {
                        var i = "";
                        if (navigator.mimeTypes)
                            for (var n = 0; n < navigator.mimeTypes.length; n++)
                                n == navigator.mimeTypes.length - 1 ? i += navigator.mimeTypes[n].description : i += navigator.mimeTypes[n].description + ", ";
                        return i
                    },
                    isFont: function(i) {
                        return u.detect(i)
                    },
                    getFonts: function() {
                        for (var i = ["Abadi MT Condensed Light", "Adobe Fangsong Std", "Adobe Hebrew", "Adobe Ming Std", "Agency FB", "Aharoni", "Andalus", "Angsana New", "AngsanaUPC", "Aparajita", "Arab", "Arabic Transparent", "Arabic Typesetting", "Arial Baltic", "Arial Black", "Arial CE", "Arial CYR", "Arial Greek", "Arial TUR", "Arial", "Batang", "BatangChe", "Bauhaus 93", "Bell MT", "Bitstream Vera Serif", "Bodoni MT", "Bookman Old Style", "Braggadocio", "Broadway", "Browallia New", "BrowalliaUPC", "Calibri Light", "Calibri", "Californian FB", "Cambria Math", "Cambria", "Candara", "Castellar", "Casual", "Centaur", "Century Gothic", "Chalkduster", "Colonna MT", "Comic Sans MS", "Consolas", "Constantia", "Copperplate Gothic Light", "Corbel", "Cordia New", "CordiaUPC", "Courier New Baltic", "Courier New CE", "Courier New CYR", "Courier New Greek", "Courier New TUR", "Courier New", "DFKai-SB", "DaunPenh", "David", "DejaVu LGC Sans Mono", "Desdemona", "DilleniaUPC", "DokChampa", "Dotum", "DotumChe", "Ebrima", "Engravers MT", "Eras Bold ITC", "Estrangelo Edessa", "EucrosiaUPC", "Euphemia", "Eurostile", "FangSong", "Forte", "FrankRuehl", "Franklin Gothic Heavy", "Franklin Gothic Medium", "FreesiaUPC", "French Script MT", "Gabriola", "Gautami", "Georgia", "Gigi", "Gisha", "Goudy Old Style", "Gulim", "GulimChe", "GungSeo", "Gungsuh", "GungsuhChe", "Haettenschweiler", "Harrington", "Hei S", "HeiT", "Heisei Kaku Gothic", "Hiragino Sans GB", "Impact", "Informal Roman", "IrisUPC", "Iskoola Pota", "JasmineUPC", "KacstOne", "KaiTi", "Kalinga", "Kartika", "Khmer UI", "Kino MT", "KodchiangUPC", "Kokila", "Kozuka Gothic Pr6N", "Lao UI", "Latha", "Leelawadee", "Levenim MT", "LilyUPC", "Lohit Gujarati", "Loma", "Lucida Bright", "Lucida Console", "Lucida Fax", "Lucida Sans Unicode", "MS Gothic", "MS Mincho", "MS PGothic", "MS PMincho", "MS Reference Sans Serif", "MS UI Gothic", "MV Boli", "Magneto", "Malgun Gothic", "Mangal", "Marlett", "Matura MT Script Capitals", "Meiryo UI", "Meiryo", "Menlo", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft Uighur", "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU", "MingLiU-ExtB", "MingLiU_HKSCS", "MingLiU_HKSCS-ExtB", "Miriam Fixed", "Miriam", "Mongolian Baiti", "MoolBoran", "NSimSun", "Narkisim", "News Gothic MT", "Niagara Solid", "Nyala", "PMingLiU", "PMingLiU-ExtB", "Palace Script MT", "Palatino Linotype", "Papyrus", "Perpetua", "Plantagenet Cherokee", "Playbill", "Prelude Bold", "Prelude Condensed Bold", "Prelude Condensed Medium", "Prelude Medium", "PreludeCompressedWGL Black", "PreludeCompressedWGL Bold", "PreludeCompressedWGL Light", "PreludeCompressedWGL Medium", "PreludeCondensedWGL Black", "PreludeCondensedWGL Bold", "PreludeCondensedWGL Light", "PreludeCondensedWGL Medium", "PreludeWGL Black", "PreludeWGL Bold", "PreludeWGL Light", "PreludeWGL Medium", "Raavi", "Rachana", "Rockwell", "Rod", "Sakkal Majalla", "Sawasdee", "Script MT Bold", "Segoe Print", "Segoe Script", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Symbol", "Segoe UI", "Shonar Bangla", "Showcard Gothic", "Shruti", "SimHei", "SimSun", "SimSun-ExtB", "Simplified Arabic Fixed", "Simplified Arabic", "Snap ITC", "Sylfaen", "Symbol", "Tahoma", "Times New Roman Baltic", "Times New Roman CE", "Times New Roman CYR", "Times New Roman Greek", "Times New Roman TUR", "Times New Roman", "TlwgMono", "Traditional Arabic", "Trebuchet MS", "Tunga", "Tw Cen MT Condensed Extra Bold", "Ubuntu", "Umpush", "Univers", "Utopia", "Utsaah", "Vani", "Verdana", "Vijaya", "Vladimir Script", "Vrinda", "Webdings", "Wide Latin", "Wingdings"], n = "", t = 0; t < i.length; t++)
                            u.detect(i[t]) && (n += t == i.length - 1 ? i[t] : i[t] + ", ");
                        return n
                    },
                    isLocalStorage: function() {
                        try {
                            return !!d.localStorage
                        } catch {
                            return !0
                        }
                    },
                    isSessionStorage: function() {
                        try {
                            return !!d.sessionStorage
                        } catch {
                            return !0
                        }
                    },
                    isCookie: function() {
                        return navigator.cookieEnabled
                    },
                    getTimeZone: function() {
                        var i, n;
                        return i = new Date,
                        (n = String(-i.getTimezoneOffset() / 60)) < 0 ? "-" + ("0" + (n *= -1)).slice(-2) : "+" + ("0" + n).slice(-2)
                    },
                    getLanguage: function() {
                        return navigator.language
                    },
                    getSystemLanguage: function() {
                        return navigator.systemLanguage || window.navigator.language
                    },
                    isCanvas: function() {
                        var i = document.createElement("canvas");
                        try {
                            return !(!i.getContext || !i.getContext("2d"))
                        } catch {
                            return !1
                        }
                    },
                    getCanvasPrint: function() {
                        var i, n = document.createElement("canvas");
                        try {
                            i = n.getContext("2d")
                        } catch {
                            return ""
                        }
                        var t = "ClientJS,org <canvas> 1.0";
                        return i.textBaseline = "top",
                        i.font = "14px 'Arial'",
                        i.textBaseline = "alphabetic",
                        i.fillStyle = "#f60",
                        i.fillRect(125, 1, 62, 20),
                        i.fillStyle = "#069",
                        i.fillText(t, 2, 15),
                        i.fillStyle = "rgba(102, 204, 0, 0.7)",
                        i.fillText(t, 4, 17),
                        n.toDataURL()
                    }
                },
                l.ClientJS = h;
                global.uo = l
            }
            , function(a, l, s) {
                var o = s(2);
                a.exports = function() {
                    return typeof J == "object" && J && J.Math === Math && J.Array === Array ? J : o
                }
            }
            , function(a, l, s) {
                typeof self < "u" ? a.exports = self : typeof window < "u" ? a.exports = window : a.exports = Function("return this")()
            }
            , function(a, l, s) {
                a.exports = function(o, u) {
                    var d, w, m, g, h, i, n, t;
                    for (d = 3 & o.length,
                    w = o.length - d,
                    m = u,
                    h = 3432918353,
                    i = 461845907,
                    t = 0; t < w; )
                        n = 255 & o.charCodeAt(t) | (255 & o.charCodeAt(++t)) << 8 | (255 & o.charCodeAt(++t)) << 16 | (255 & o.charCodeAt(++t)) << 24,
                        ++t,
                        m = 27492 + (65535 & (g = 5 * (65535 & (m = (m ^= n = (65535 & (n = (n = (65535 & n) * h + (((n >>> 16) * h & 65535) << 16) & 4294967295) << 15 | n >>> 17)) * i + (((n >>> 16) * i & 65535) << 16) & 4294967295) << 13 | m >>> 19)) + ((5 * (m >>> 16) & 65535) << 16) & 4294967295)) + ((58964 + (g >>> 16) & 65535) << 16);
                    switch (n = 0,
                    d) {
                    case 3:
                        n ^= (255 & o.charCodeAt(t + 2)) << 16;
                    case 2:
                        n ^= (255 & o.charCodeAt(t + 1)) << 8;
                    case 1:
                        m ^= n = (65535 & (n = (n = (65535 & (n ^= 255 & o.charCodeAt(t))) * h + (((n >>> 16) * h & 65535) << 16) & 4294967295) << 15 | n >>> 17)) * i + (((n >>> 16) * i & 65535) << 16) & 4294967295
                    }
                    return m ^= o.length,
                    m = 2246822507 * (65535 & (m ^= m >>> 16)) + ((2246822507 * (m >>> 16) & 65535) << 16) & 4294967295,
                    m = 3266489909 * (65535 & (m ^= m >>> 13)) + ((3266489909 * (m >>> 16) & 65535) << 16) & 4294967295,
                    (m ^= m >>> 16) >>> 0
                }
            }
            , function(a, l, s) {
                var o;
                (function(u, d) {
                    var w = "function"
                      , m = "undefined"
                      , g = "object"
                      , h = "string"
                      , i = "model"
                      , n = "name"
                      , t = "type"
                      , r = "vendor"
                      , c = "version"
                      , C = "architecture"
                      , x = "console"
                      , p = "mobile"
                      , b = "tablet"
                      , A = "smarttv"
                      , L = "wearable"
                      , k = "embedded"
                      , B = "Amazon"
                      , z = "Apple"
                      , G = "ASUS"
                      , W = "BlackBerry"
                      , R = "Firefox"
                      , D = "Google"
                      , y = "Huawei"
                      , _ = "LG"
                      , O = "Microsoft"
                      , ge = "Motorola"
                      , He = "Opera"
                      , ae = "Samsung"
                      , se = "Sony"
                      , he = "Xiaomi"
                      , le = "Zebra"
                      , ve = "Facebook"
                      , $ = function(M) {
                        var P = {};
                        for (var T in M)
                            P[M[T].toUpperCase()] = M[T];
                        return P
                    }
                      , ye = function(M, P) {
                        return typeof M === h && Y(P).indexOf(Y(M)) !== -1
                    }
                      , Y = function(M) {
                        return M.toLowerCase()
                    }
                      , ue = function(M, P) {
                        if (typeof M === h)
                            return M = M.replace(/^\s\s*/, "").replace(/\s\s*$/, ""),
                            typeof P === m ? M : M.substring(0, 255)
                    }
                      , X = function(M, P) {
                        for (var T, U, v, S, q, E, Q = 0; Q < P.length && !q; ) {
                            var ke = P[Q]
                              , Ce = P[Q + 1];
                            for (T = U = 0; T < ke.length && !q; )
                                if (q = ke[T++].exec(M))
                                    for (v = 0; v < Ce.length; v++)
                                        E = q[++U],
                                        typeof (S = Ce[v]) === g && S.length > 0 ? S.length == 2 ? typeof S[1] == w ? this[S[0]] = S[1].call(this, E) : this[S[0]] = S[1] : S.length == 3 ? typeof S[1] !== w || S[1].exec && S[1].test ? this[S[0]] = E ? E.replace(S[1], S[2]) : d : this[S[0]] = E ? S[1].call(this, E, S[2]) : d : S.length == 4 && (this[S[0]] = E ? S[3].call(this, E.replace(S[1], S[2])) : d) : this[S] = E || d;
                            Q += 2
                        }
                    }
                      , ce = function(M, P) {
                        for (var T in P)
                            if (typeof P[T] === g && P[T].length > 0) {
                                for (var U = 0; U < P[T].length; U++)
                                    if (ye(P[T][U], M))
                                        return T === "?" ? d : T
                            } else if (ye(P[T], M))
                                return T === "?" ? d : T;
                        return M
                    }
                      , Se = {
                        ME: "4.90",
                        "NT 3.11": "NT3.51",
                        "NT 4.0": "NT4.0",
                        2e3: "NT 5.0",
                        XP: ["NT 5.1", "NT 5.2"],
                        Vista: "NT 6.0",
                        7: "NT 6.1",
                        8: "NT 6.2",
                        8.1: "NT 6.3",
                        10: ["NT 6.4", "NT 10.0"],
                        RT: "ARM"
                    }
                      , xe = {
                        browser: [[/\b(?:crmo|crios)\/([\w\.]+)/i], [c, [n, "Chrome"]], [/edg(?:e|ios|a)?\/([\w\.]+)/i], [c, [n, "Edge"]], [/(opera mini)\/([-\w\.]+)/i, /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i], [n, c], [/opios[\/ ]+([\w\.]+)/i], [c, [n, "Opera Mini"]], [/\bopr\/([\w\.]+)/i], [c, [n, He]], [/(kindle)\/([\w\.]+)/i, /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i, /(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i, /(ba?idubrowser)[\/ ]?([\w\.]+)/i, /(?:ms|\()(ie) ([\w\.]+)/i, /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([-\w\.]+)/i, /(weibo)__([\d\.]+)/i], [n, c], [/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i], [c, [n, "UCBrowser"]], [/\bqbcore\/([\w\.]+)/i], [c, [n, "WeChat(Win) Desktop"]], [/micromessenger\/([\w\.]+)/i], [c, [n, "WeChat"]], [/konqueror\/([\w\.]+)/i], [c, [n, "Konqueror"]], [/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i], [c, [n, "IE"]], [/yabrowser\/([\w\.]+)/i], [c, [n, "Yandex"]], [/(avast|avg)\/([\w\.]+)/i], [[n, /(.+)/, "$1 Secure Browser"], c], [/\bfocus\/([\w\.]+)/i], [c, [n, "Firefox Focus"]], [/\bopt\/([\w\.]+)/i], [c, [n, "Opera Touch"]], [/coc_coc\w+\/([\w\.]+)/i], [c, [n, "Coc Coc"]], [/dolfin\/([\w\.]+)/i], [c, [n, "Dolphin"]], [/coast\/([\w\.]+)/i], [c, [n, "Opera Coast"]], [/miuibrowser\/([\w\.]+)/i], [c, [n, "MIUI Browser"]], [/fxios\/([-\w\.]+)/i], [c, [n, R]], [/\bqihu|(qi?ho?o?|360)browser/i], [[n, "360 Browser"]], [/(oculus|samsung|sailfish)browser\/([\w\.]+)/i], [[n, /(.+)/, "$1 Browser"], c], [/(comodo_dragon)\/([\w\.]+)/i], [[n, /_/g, " "], c], [/(electron)\/([\w\.]+) safari/i, /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i], [n, c], [/(metasr)[\/ ]?([\w\.]+)/i, /(lbbrowser)/i], [n], [/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i], [[n, ve], c], [/safari (line)\/([\w\.]+)/i, /\b(line)\/([\w\.]+)\/iab/i, /(chromium|instagram)[\/ ]([-\w\.]+)/i], [n, c], [/\bgsa\/([\w\.]+) .*safari\//i], [c, [n, "GSA"]], [/headlesschrome(?:\/([\w\.]+)| )/i], [c, [n, "Chrome Headless"]], [/ wv\).+(chrome)\/([\w\.]+)/i], [[n, "Chrome WebView"], c], [/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i], [c, [n, "Android Browser"]], [/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i], [n, c], [/version\/([\w\.]+) .*mobile\/\w+ (safari)/i], [c, [n, "Mobile Safari"]], [/version\/([\w\.]+) .*(mobile ?safari|safari)/i], [c, n], [/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i], [n, [c, ce, {
                            "1.0": "/8",
                            1.2: "/1",
                            1.3: "/3",
                            "2.0": "/412",
                            "2.0.2": "/416",
                            "2.0.3": "/417",
                            "2.0.4": "/419",
                            "?": "/"
                        }]], [/(webkit|khtml)\/([\w\.]+)/i], [n, c], [/(navigator|netscape\d?)\/([-\w\.]+)/i], [[n, "Netscape"], c], [/mobile vr; rv:([\w\.]+)\).+firefox/i], [c, [n, "Firefox Reality"]], [/ekiohf.+(flow)\/([\w\.]+)/i, /(swiftfox)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i, /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i, /(firefox)\/([\w\.]+)/i, /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i, /(links) \(([\w\.]+)/i], [n, c]],
                        cpu: [[/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i], [[C, "amd64"]], [/(ia32(?=;))/i], [[C, Y]], [/((?:i[346]|x)86)[;\)]/i], [[C, "ia32"]], [/\b(aarch64|arm(v?8e?l?|_?64))\b/i], [[C, "arm64"]], [/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i], [[C, "armhf"]], [/windows (ce|mobile); ppc;/i], [[C, "arm"]], [/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i], [[C, /ower/, "", Y]], [/(sun4\w)[;\)]/i], [[C, "sparc"]], [/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i], [[C, Y]]],
                        device: [[/\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i], [i, [r, ae], [t, b]], [/\b((?:s[cgp]h|gt|sm)-\w+|galaxy nexus)/i, /samsung[- ]([-\w]+)/i, /sec-(sgh\w+)/i], [i, [r, ae], [t, p]], [/\((ip(?:hone|od)[\w ]*);/i], [i, [r, z], [t, p]], [/\((ipad);[-\w\),; ]+apple/i, /applecoremedia\/[\w\.]+ \((ipad)/i, /\b(ipad)\d\d?,\d\d?[;\]].+ios/i], [i, [r, z], [t, b]], [/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i], [i, [r, y], [t, b]], [/(?:huawei|honor)([-\w ]+)[;\)]/i, /\b(nexus 6p|\w{2,4}-[atu]?[ln][01259x][012359][an]?)\b(?!.+d\/s)/i], [i, [r, y], [t, p]], [/\b(poco[\w ]+)(?: bui|\))/i, /\b; (\w+) build\/hm\1/i, /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i], [[i, /_/g, " "], [r, he], [t, p]], [/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i], [[i, /_/g, " "], [r, he], [t, b]], [/; (\w+) bui.+ oppo/i, /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i], [i, [r, "OPPO"], [t, p]], [/vivo (\w+)(?: bui|\))/i, /\b(v[12]\d{3}\w?[at])(?: bui|;)/i], [i, [r, "Vivo"], [t, p]], [/\b(rmx[12]\d{3})(?: bui|;|\))/i], [i, [r, "Realme"], [t, p]], [/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i, /\bmot(?:orola)?[- ](\w*)/i, /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i], [i, [r, ge], [t, p]], [/\b(mz60\d|xoom[2 ]{0,2}) build\//i], [i, [r, ge], [t, b]], [/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i], [i, [r, _], [t, b]], [/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i, /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i, /\blg-?([\d\w]+) bui/i], [i, [r, _], [t, p]], [/(ideatab[-\w ]+)/i, /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i], [i, [r, "Lenovo"], [t, b]], [/(?:maemo|nokia).*(n900|lumia \d+)/i, /nokia[-_ ]?([-\w\.]*)/i], [[i, /_/g, " "], [r, "Nokia"], [t, p]], [/(pixel c)\b/i], [i, [r, D], [t, b]], [/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i], [i, [r, D], [t, p]], [/droid.+ ([c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i], [i, [r, se], [t, p]], [/sony tablet [ps]/i, /\b(?:sony)?sgp\w+(?: bui|\))/i], [[i, "Xperia Tablet"], [r, se], [t, b]], [/ (kb2005|in20[12]5|be20[12][59])\b/i, /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i], [i, [r, "OnePlus"], [t, p]], [/(alexa)webm/i, /(kf[a-z]{2}wi)( bui|\))/i, /(kf[a-z]+)( bui|\)).+silk\//i], [i, [r, B], [t, b]], [/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i], [[i, /(.+)/g, "Fire Phone $1"], [r, B], [t, p]], [/(playbook);[-\w\),; ]+(rim)/i], [i, r, [t, b]], [/\b((?:bb[a-f]|st[hv])100-\d)/i, /\(bb10; (\w+)/i], [i, [r, W], [t, p]], [/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i], [i, [r, G], [t, b]], [/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i], [i, [r, G], [t, p]], [/(nexus 9)/i], [i, [r, "HTC"], [t, b]], [/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i, /(alcatel|geeksphone|nexian|panasonic|sony)[-_ ]?([-\w]*)/i], [r, [i, /_/g, " "], [t, p]], [/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i], [i, [r, "Acer"], [t, b]], [/droid.+; (m[1-5] note) bui/i, /\bmz-([-\w]{2,})/i], [i, [r, "Meizu"], [t, p]], [/\b(sh-?[altvz]?\d\d[a-ekm]?)/i], [i, [r, "Sharp"], [t, p]], [/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i, /(hp) ([\w ]+\w)/i, /(asus)-?(\w+)/i, /(microsoft); (lumia[\w ]+)/i, /(lenovo)[-_ ]?([-\w]+)/i, /(jolla)/i, /(oppo) ?([\w ]+) bui/i], [r, i, [t, p]], [/(archos) (gamepad2?)/i, /(hp).+(touchpad(?!.+tablet)|tablet)/i, /(kindle)\/([\w\.]+)/i, /(nook)[\w ]+build\/(\w+)/i, /(dell) (strea[kpr\d ]*[\dko])/i, /(le[- ]+pan)[- ]+(\w{1,9}) bui/i, /(trinity)[- ]*(t\d{3}) bui/i, /(gigaset)[- ]+(q\w{1,9}) bui/i, /(vodafone) ([\w ]+)(?:\)| bui)/i], [r, i, [t, b]], [/(surface duo)/i], [i, [r, O], [t, b]], [/droid [\d\.]+; (fp\du?)(?: b|\))/i], [i, [r, "Fairphone"], [t, p]], [/(u304aa)/i], [i, [r, "AT&T"], [t, p]], [/\bsie-(\w*)/i], [i, [r, "Siemens"], [t, p]], [/\b(rct\w+) b/i], [i, [r, "RCA"], [t, b]], [/\b(venue[\d ]{2,7}) b/i], [i, [r, "Dell"], [t, b]], [/\b(q(?:mv|ta)\w+) b/i], [i, [r, "Verizon"], [t, b]], [/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i], [i, [r, "Barnes & Noble"], [t, b]], [/\b(tm\d{3}\w+) b/i], [i, [r, "NuVision"], [t, b]], [/\b(k88) b/i], [i, [r, "ZTE"], [t, b]], [/\b(nx\d{3}j) b/i], [i, [r, "ZTE"], [t, p]], [/\b(gen\d{3}) b.+49h/i], [i, [r, "Swiss"], [t, p]], [/\b(zur\d{3}) b/i], [i, [r, "Swiss"], [t, b]], [/\b((zeki)?tb.*\b) b/i], [i, [r, "Zeki"], [t, b]], [/\b([yr]\d{2}) b/i, /\b(dragon[- ]+touch |dt)(\w{5}) b/i], [[r, "Dragon Touch"], i, [t, b]], [/\b(ns-?\w{0,9}) b/i], [i, [r, "Insignia"], [t, b]], [/\b((nxa|next)-?\w{0,9}) b/i], [i, [r, "NextBook"], [t, b]], [/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i], [[r, "Voice"], i, [t, p]], [/\b(lvtel\-)?(v1[12]) b/i], [[r, "LvTel"], i, [t, p]], [/\b(ph-1) /i], [i, [r, "Essential"], [t, p]], [/\b(v(100md|700na|7011|917g).*\b) b/i], [i, [r, "Envizen"], [t, b]], [/\b(trio[-\w\. ]+) b/i], [i, [r, "MachSpeed"], [t, b]], [/\btu_(1491) b/i], [i, [r, "Rotor"], [t, b]], [/(shield[\w ]+) b/i], [i, [r, "Nvidia"], [t, b]], [/(sprint) (\w+)/i], [r, i, [t, p]], [/(kin\.[onetw]{3})/i], [[i, /\./g, " "], [r, O], [t, p]], [/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i], [i, [r, le], [t, b]], [/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i], [i, [r, le], [t, p]], [/(ouya)/i, /(nintendo) ([wids3utch]+)/i], [r, i, [t, x]], [/droid.+; (shield) bui/i], [i, [r, "Nvidia"], [t, x]], [/(playstation [345portablevi]+)/i], [i, [r, se], [t, x]], [/\b(xbox(?: one)?(?!; xbox))[\); ]/i], [i, [r, O], [t, x]], [/smart-tv.+(samsung)/i], [r, [t, A]], [/hbbtv.+maple;(\d+)/i], [[i, /^/, "SmartTV"], [r, ae], [t, A]], [/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i], [[r, _], [t, A]], [/(apple) ?tv/i], [r, [i, "Apple TV"], [t, A]], [/crkey/i], [[i, "Chromecast"], [r, D], [t, A]], [/droid.+aft(\w)( bui|\))/i], [i, [r, B], [t, A]], [/\(dtv[\);].+(aquos)/i], [i, [r, "Sharp"], [t, A]], [/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, /hbbtv\/\d+\.\d+\.\d+ +\([\w ]*; *(\w[^;]*);([^;]*)/i], [[r, ue], [i, ue], [t, A]], [/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i], [[t, A]], [/((pebble))app/i], [r, i, [t, L]], [/droid.+; (glass) \d/i], [i, [r, D], [t, L]], [/droid.+; (wt63?0{2,3})\)/i], [i, [r, le], [t, L]], [/(quest( 2)?)/i], [i, [r, ve], [t, L]], [/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i], [r, [t, k]], [/droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i], [i, [t, p]], [/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i], [i, [t, b]], [/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i], [[t, b]], [/(phone|mobile(?:[;\/]| safari)|pda(?=.+windows ce))/i], [[t, p]], [/(android[-\w\. ]{0,9});.+buil/i], [i, [r, "Generic"]]],
                        engine: [[/windows.+ edge\/([\w\.]+)/i], [c, [n, "EdgeHTML"]], [/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i], [c, [n, "Blink"]], [/(presto)\/([\w\.]+)/i, /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, /ekioh(flow)\/([\w\.]+)/i, /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, /(icab)[\/ ]([23]\.[\d\.]+)/i], [n, c], [/rv\:([\w\.]{1,9})\b.+(gecko)/i], [c, n]],
                        os: [[/microsoft (windows) (vista|xp)/i], [n, c], [/(windows) nt 6\.2; (arm)/i, /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i, /(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i], [n, [c, ce, Se]], [/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i], [[n, "Windows"], [c, ce, Se]], [/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, /cfnetwork\/.+darwin/i], [[c, /_/g, "."], [n, "iOS"]], [/(mac os x) ?([\w\. ]*)/i, /(macintosh|mac_powerpc\b)(?!.+haiku)/i], [[n, "Mac OS"], [c, /_/g, "."]], [/droid ([\w\.]+)\b.+(android[- ]x86)/i], [c, n], [/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i, /(blackberry)\w*\/([\w\.]*)/i, /(tizen|kaios)[\/ ]([\w\.]+)/i, /\((series40);/i], [n, c], [/\(bb(10);/i], [c, [n, W]], [/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i], [c, [n, "Symbian"]], [/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i], [c, [n, "Firefox OS"]], [/web0s;.+rt(tv)/i, /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i], [c, [n, "webOS"]], [/crkey\/([\d\.]+)/i], [c, [n, "Chromecast"]], [/(cros) [\w]+ ([\w\.]+\w)/i], [[n, "Chromium OS"], c], [/(nintendo|playstation) ([wids345portablevuch]+)/i, /(xbox); +xbox ([^\);]+)/i, /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, /(mint)[\/\(\) ]?(\w*)/i, /(mageia|vectorlinux)[; ]/i, /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i, /(hurd|linux) ?([\w\.]*)/i, /(gnu) ?([\w\.]*)/i, /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, /(haiku) (\w+)/i], [n, c], [/(sunos) ?([\w\.\d]*)/i], [[n, "Solaris"], c], [/((?:open)?solaris)[-\/ ]?([\w\.]*)/i, /(aix) ((\d)(?=\.|\)| )[\w\.])*/i, /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, /(unix) ?([\w\.]*)/i], [n, c]]
                    }
                      , j = function(M, P) {
                        if (typeof M === g && (P = M,
                        M = d),
                        !(this instanceof j))
                            return new j(M,P).getResult();
                        var T = M || (typeof u !== m && u.navigator && u.navigator.userAgent ? u.navigator.userAgent : "")
                          , U = P ? function(v, S) {
                            var q = {};
                            for (var E in v)
                                S[E] && S[E].length % 2 == 0 ? q[E] = S[E].concat(v[E]) : q[E] = v[E];
                            return q
                        }(xe, P) : xe;
                        return this.getBrowser = function() {
                            var v, S = {};
                            return S.name = d,
                            S.version = d,
                            X.call(S, T, U.browser),
                            S.major = typeof (v = S.version) === h ? v.replace(/[^\d\.]/g, "").split(".")[0] : d,
                            S
                        }
                        ,
                        this.getCPU = function() {
                            var v = {};
                            return v.architecture = d,
                            X.call(v, T, U.cpu),
                            v
                        }
                        ,
                        this.getDevice = function() {
                            var v = {};
                            return v.vendor = d,
                            v.model = d,
                            v.type = d,
                            X.call(v, T, U.device),
                            v
                        }
                        ,
                        this.getEngine = function() {
                            var v = {};
                            return v.name = d,
                            v.version = d,
                            X.call(v, T, U.engine),
                            v
                        }
                        ,
                        this.getOS = function() {
                            var v = {};
                            return v.name = d,
                            v.version = d,
                            X.call(v, T, U.os),
                            v
                        }
                        ,
                        this.getResult = function() {
                            return {
                                ua: this.getUA(),
                                browser: this.getBrowser(),
                                engine: this.getEngine(),
                                os: this.getOS(),
                                device: this.getDevice(),
                                cpu: this.getCPU()
                            }
                        }
                        ,
                        this.getUA = function() {
                            return T
                        }
                        ,
                        this.setUA = function(v) {
                            return T = typeof v === h && v.length > 255 ? ue(v, 255) : v,
                            this
                        }
                        ,
                        this.setUA(T),
                        this
                    };
                    j.VERSION = "0.7.30",
                    j.BROWSER = $([n, c, "major"]),
                    j.CPU = $([C]),
                    j.DEVICE = $([i, r, t, x, p, A, b, L, k]),
                    j.ENGINE = j.OS = $([n, c]),
                    typeof l !== m ? (typeof a !== m && a.exports && (l = a.exports = j),
                    l.UAParser = j) : s(5) ? (o = (function() {
                        return j
                    }
                    ).call(l, s, l, a)) === d || (a.exports = o) : typeof u !== m && (u.UAParser = j);
                    var K = typeof u !== m && (u.jQuery || u.Zepto);
                    if (K && !K.ua) {
                        var Z = new j;
                        K.ua = Z.getResult(),
                        K.ua.get = function() {
                            return Z.getUA()
                        }
                        ,
                        K.ua.set = function(M) {
                            Z.setUA(M);
                            var P = Z.getResult();
                            for (var T in P)
                                K.ua[T] = P[T]
                        }
                    }
                }
                )(typeof window == "object" ? window : this)
            }
            , function(a, l) {
                (function(s) {
                    a.exports = s
                }
                ).call(this, {})
            }
            , function(a, l) {
                a.exports = function() {
                    var s = ["monospace", "sans-serif", "serif"]
                      , o = document.getElementsByTagName("body")[0]
                      , u = document.createElement("span");
                    u.style.fontSize = "72px",
                    u.innerHTML = "mmmmmmmmmmlli";
                    var d = {}
                      , w = {};
                    for (var m in s)
                        u.style.fontFamily = s[m],
                        o.appendChild(u),
                        d[s[m]] = u.offsetWidth,
                        w[s[m]] = u.offsetHeight,
                        o.removeChild(u);
                    this.detect = function(g) {
                        var h = !1;
                        for (var i in s) {
                            u.style.fontFamily = g + "," + s[i],
                            o.appendChild(u);
                            var n = u.offsetWidth != d[s[i]] || u.offsetHeight != w[s[i]];
                            o.removeChild(u),
                            h = h || n
                        }
                        return h
                    }
                }
            }
            ])
 
// 分割线 -------------------------------------------------------------------------------
 
// 参数2: X-Fingerprint 生成代码 ---------------------------------------------------------
function $t() {
    let t = new uo.ClientJS().getFingerprint().toString()
    return t
}
// 参数3: X-Auth-Hash 生成代码 -----------------------------------------------------------
function go(r, o) {
        return new ft(ho,o).finalize(r)
 }
 
// 封装je()函数 生成代码 ------------------------------------------------------------------
function je(e, t, r) {
    const o = Math.floor(Date.now() / 6e4)
      , s = $t()
      , l = r ? JSON.stringify(r) : ""
      , u = `${e}|${t}|${o}|${s}|${l}`;
    return {
        "X-Auth-Hash": go(u, 'x').toString(),
        "x-fingerprint": s,
        "X-Timestamp": o.toString()
    }
}
 
console.log(je('POST', '/stats/visit'))












免费评分

参与人数 11威望 +1 吾爱币 +29 热心值 +11 收起 理由
allspark + 1 + 1 用心讨论,共获提升!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
122s + 1 + 1 用心讨论,共获提升!
roadroller + 1 我很赞同!
腰围两尺99 + 1 + 1 用心讨论,共获提升!
xiaochenke + 1 + 1 我很赞同!
icefuture1013 + 1 + 1 我很赞同!
杨辣子 + 1 + 1 谢谢@Thanks!
gblw + 1 + 1 我很赞同!
唐小样儿 + 1 + 1 我很赞同!
helian147 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
a454635280 发表于 2025-8-14 15:37
gblw 发表于 2025-8-14 14:23
佬,为啥我开f12 就跳转原神了。。。

作者做了防御
推荐
zhang0101 发表于 2025-8-27 13:31
采用HMAC加密,分二步
ev-fbmlgocvf57s=175619XXXX(时间戳)
ly-ueqqvpudbna3mm=15223XXXXX(本地取回)
第一步:
Key=‘_0x’,data=ev-fbmlgocvf57s+ly-ueqqvpudbna3mm

通过HMAC一顿操作后得到gg=“b84968c8c71575df03b0a396d87b405cXXXXXXXX”这么一串
第二步:
Key=‘x0_’,data=gg+ly-ueqqvpudbna3mm.split("").reverse().join("")
再HMAC一顿操作后得到zk-bcid-rrqm0kb参数
async function hmacSHA1(key, data) {
    const keyBuffer = new TextEncoder().encode(key);
    const cryptoKey = await crypto.subtle.importKey(
        'raw',  
        keyBuffer,
        { name: 'HMAC', hash: 'SHA-1' },  
        false,
        ['sign']
    );
    const dataBuffer = new TextEncoder().encode(data);
    const signatureBuffer = await crypto.subtle.sign('HMAC', cryptoKey, dataBuffer);
      let n = Array.from(new Uint8Array(signatureBuffer), t => t.toString(16).padStart(2, "0")).join("");
  //第一步算法
       let nm = (n.match(/.{8}/g) || []).map(t=>{        
          let _0x1b3168 = parseInt(t, 0x10);
          _0x1b3168 ^= 0x5a3c;
         _0x1b3168 =((_0x1b3168<<???) | (_0x1b3168>>>???))>>> 0x0;
          let mm=_0x1b3168.toString(16).padStart(8, "0")  ;
         return mm
        }).join("");  
  //第二步算法
       // nm = (n.match(/.{2}/g) || []).map( (t, h) => ((parseInt(t, 16) ^ h + 63) & 255).toString(16).padStart(2, "0")).join("");
  return nm
}
《???》处有兴趣小伙伴找找看
3#
gblw 发表于 2025-8-14 14:23
4#
李玉风我爱你 发表于 2025-8-14 19:33
不太理解逆向这个的目的是什么?
5#
Liya808 发表于 2025-8-14 22:41
作者不是说按F12自动打开原神吗
6#
wooailein 发表于 2025-8-15 09:03
gblw 发表于 2025-8-14 14:23
佬,为啥我开f12 就跳转原神了。。。

bug  ha哈哈
7#
wooailein 发表于 2025-8-15 09:04
刚好昨天B站刷到过原作者的视频,你该不会就是up说的那个高中的逆向大佬吧
8#
ZeLin99 发表于 2025-8-15 09:12
谢谢大佬分享,顺便问一句,逆向课程是在哪儿找的哦
9#
walykyy 发表于 2025-8-15 14:23
确实厉害,刚准备最近学一下js基础知识
10#
zhai0122 发表于 2025-8-15 15:16
yuanshen怎么跳过?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-14 09:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表