const BASE64_CHARS = 'ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe'; function customBase64Encode33(input) { let base64Chars = BASE64_CHARS; let output = ""; let chr1, chr2, chr3, enc1, enc2, enc3, enc4; let i = 0; while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + base64Chars.charAt(enc1) + base64Chars.charAt(enc2) + base64Chars.charAt(enc3) + base64Chars.charAt(enc4); } return output; } function get_arr(t, a) { reg = { "chunk": [], "reg": [1937774191, 1226093241, 388252375, 3666478592, 2842636476, 372324522, 3817729613, 2969243214], "size": 0, "write": function (e) { var o = typeof e === "string" ? function (e) { var n = encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, function (e, t) { return String.fromCharCode("0x" + t); }), o = new Array(n.length); return Array.prototype.forEach.call(n, function (e, t) { o[t] = e.charCodeAt(0); }), o; }(e) : e; this.size += o.length; var i = 64 - this.chunk.length; if (o.length < i) this.chunk = this.chunk.concat(o); else for (this.chunk = this.chunk.concat(o.slice(0, i)); this.chunk.length >= 64;) this._compress(this.chunk), i < o.length ? this.chunk = o.slice(i, Math.min(i + 64, o.length)) : this.chunk = [], i += 64; }, "sum": function (r, n) { r && (this.reset(), this.write(r)), this._fill(); for (var a = 0; a < this.chunk.length; a += 64) this._compress(this.chunk.slice(a, a + 64)); var c = null; if (n == "hex") { c = ""; for (a = 0; a < 8; a++) c += gt(this.reg[a].toString(16), 8, "0"); } else for (c = new Array(32), a = 0; a < 8; a++) { var f = this.reg[a]; c[4 * a + 3] = (255 & f) >>> 0, f >>>= 8, c[4 * a + 2] = (255 & f) >>> 0, f >>>= 8, c[4 * a + 1] = (255 & f) >>> 0, f >>>= 8, c[4 * a] = (255 & f) >>> 0; } return this.reset(), c; }, "_compress": function (r) { if (r < 64) console.error("compress error: not enough data"); else { for (var o = function (e) { for (var t = new Array(132), r = 0; r < 16; r++) t[r] = e[4 * r] << 24, t[r] |= e[4 * r + 1] << 16, t[r] |= e[4 * r + 2] << 8, t[r] |= e[4 * r + 3], t[r] >>>= 0; for (var n = 16; n < 68; n++) { var o = t[n - 16] ^ t[n - 9] ^ Ct(t[n - 3], 15); o = o ^ Ct(o, 15) ^ Ct(o, 23), t[n] = (o ^ Ct(t[n - 13], 7) ^ t[n - 6]) >>> 0; } for (n = 0; n < 64; n++) t[n + 68] = (t[n] ^ t[n + 4]) >>> 0; return t; }(r), i = this.reg.slice(0), a = 0; a < 64; a++) { var c = Ct(i[0], 12) + i[4] + Ct(St(a), a), f = ((c = Ct(c = (4294967295 & c) >>> 0, 7)) ^ Ct(i[0], 12)) >>> 0, u = kt(a, i[0], i[1], i[2]); u = (4294967295 & (u = u + i[3] + f + o[a + 68])) >>> 0; var s = xt(a, i[4], i[5], i[6]); s = (4294967295 & (s = s + i[7] + c + o[a])) >>> 0, i[3] = i[2], i[2] = Ct(i[1], 9), i[1] = i[0], i[0] = u, i[7] = i[6], i[6] = Ct(i[5], 19), i[5] = i[4], i[4] = (s ^ Ct(s, 9) ^ Ct(s, 17)) >>> 0; } for (var l = 0; l < 8; l++) this.reg[l] = (this.reg[l] ^ i[l]) >>> 0; } }, "_fill": function () { var o = 8 * this.size, i = this.chunk.push(128) % 64; for (64 - i < 8 && (i -= 64); i < 56; i++) this.chunk.push(0); for (var a = 0; a < 4; a++) { var c = Math.floor(o / 4294967296); this.chunk.push(c >>> 8 * (3 - a) & 255); } for (a = 0; a < 4; a++) this.chunk.push(o >>> 8 * (3 - a) & 255); } } reg.write(t) reg._fill(); function Ct(e, t) { return (e << (t %= 32) | e >>> 32 - t) >>> 0; } function St(e) { return 0 <= e && e < 16 ? 2043430169 : 16 <= e && e < 64 ? 2055708042 : void console.error("invalid j for constant Tj"); } function kt(e, t, r, n) { return 0 <= e && e < 16 ? (t ^ r ^ n) >>> 0 : 16 <= e && e < 64 ? (t & r | t & n | r & n) >>> 0 : (console.error("invalid j for bool function FF"), 0); } function xt(e, t, r, n) { return 0 <= e && e < 16 ? (t ^ r ^ n) >>> 0 : 16 <= e && e < 64 ? (t & r | ~t & n) >>> 0 : (console.error("invalid j for bool function GG"), 0); } for (var i = 0; i < reg["chunk"]["length"]; i += 64) { reg["_compress"](reg["chunk"]["slice"](i, i + 64)); } var o = null; if (a == "hex") { o = ""; for (i = 0; i < 8; i++) o += oe(reg["reg"][i]["toString"](16), 8, "0") } else { for (o = new Array(32), i = 0; i < 8; i++) { var c = reg.reg[i]; o[4 * i + 3] = (255 & c) >>> 0, c >>>= 8, o[4 * i + 2] = (255 & c) >>> 0, c >>>= 8, o[4 * i + 1] = (255 & c) >>> 0, c >>>= 8, o[4 * i] = (255 & c) >>> 0 } } return o; } function enc(url, data, userAgent) { // 生成乱码字符串 var params = url.slice(url.indexOf("?") + 1) + "dhzx"; data += "dhzx"; var garbledString = getGarbledString(params, data, userAgent); var short_str = "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe" var ABogus = ""; // 依次生成七组字符串 let j = 0 for (var i = 0; i <= garbledString.length; i += 3) { if ((i + 3) <= garbledString.length) { var charCodeAtNum0 = garbledString.charCodeAt(i); var charCodeAtNum1 = garbledString.charCodeAt(i + 1); var charCodeAtNum2 = garbledString.charCodeAt(i + 2); var baseNum = charCodeAtNum2 | charCodeAtNum1 << 8 | charCodeAtNum0 << 16; var str1 = short_str[(baseNum & 16515072) >> 18]; var str2 = short_str[(baseNum & 258048) >> 12]; var str3 = short_str[(baseNum & 4032) >> 6]; var str4 = short_str[baseNum & 63]; ABogus += str1 + str2 + str3 + str4; } if (i + 3 > garbledString.length) { let u = garbledString.length - j if (u === 2) { var charCodeAtNum0 = garbledString.charCodeAt(j); var charCodeAtNum1 = garbledString.charCodeAt(j + 1); var baseNum = charCodeAtNum1 << 8 | charCodeAtNum0 << 16; var str1 = short_str[(baseNum & 16515072) >> 18]; var str2 = short_str[(baseNum & 258048) >> 12]; var str3 = short_str[(baseNum & 4032) >> 6]; ABogus += str1 + str2 + str3 + '='; } if (u === 1) { var charCodeAtNum0 = garbledString.charCodeAt(j); var baseNum = 0 | charCodeAtNum0 << 16; var str1 = short_str[(baseNum & 16515072) >> 18]; var str2 = short_str[(baseNum & 258048) >> 12]; ABogus += str1 + str2 + '=' + '='; } } j += 3 } return ABogus; } function _0x46fa4c(a, c) { let e, b = [], d = 0, f = ""; for (let a = 0; a < 256; a++) { b[a] = a; } for (let c = 0; c < 256; c++) { d = (d + b[c] + a.charCodeAt(c % a.length)) % 256, e = b[c], b[c] = b[d], b[d] = e; } let t = 0; d = 0; for (let a = 0; a < c.length; a++) { t = (t + 1) % 256, d = (d + b[t]) % 256, e = b[t], b[t] = b[d], b[d] = e, f += String.fromCharCode(c.charCodeAt(a) ^ b[(b[t] + b[d]) % 256]); } return f; } function getGarbledString(params, data, userAgent) { let timestamp1 = Date.now(), timestamp2 = timestamp1 - Math.floor(Math.random() * 10); let arr_29 = get_arr29(timestamp1, timestamp2, params, data, userAgent) // let a = get_fromCharCodeStr1(); let a = topHeaderRandomGarbledCharacters(); let b = abGarbledCharacters(String.fromCharCode.apply(null, arr_29)) return a + b; } function abGarbledCharacters(userAgent) { let arr_256 = ab_arr_256(); let n4 = 0; let ans = ""; for (let i = 0; i < userAgent.length; i++) { let n2 = (i + 1) % 256; let n3 = n4 + arr_256[n2] n4 = n3 % 256 let old_arr_n2 = arr_256[n2] arr_256[n2] = arr_256[n4] arr_256[n4] = old_arr_n2 let n5 = userAgent.charCodeAt(i); let n6 = arr_256[n2] + old_arr_n2; let n7 = n6 % 256 let n8 = n5 ^ arr_256[n7] ans += String.fromCharCode(n8) } return ans; } function ab_arr_256() { let nums = [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] let previousValue = 0; let lm = String.fromCharCode(211); for (let i = 0; i < nums.length; i++) { let num1 = previousValue * nums[i]; previousValue = (num1 + previousValue + lm.charCodeAt(0)) % 256 let tmp = nums[i]; nums[i] = nums[previousValue] nums[previousValue] = tmp } return nums; } function get_arr29(dateTime1, dateTime2, params, data, userAgent) { let parArr = get_arr(get_arr(params)) let dataArr = get_arr(get_arr(data)) let ua_salt; switch (userAgent.indexOf('Win')) { case -1: ua_salt = 0; break; default: ua_salt = 0; } var browser_arr = get_arr(encryptionUa(uaGarbledCharacters(userAgent, ua_salt))); let arr = [] let arr2 = [] let num = get_arr2(userAgent) let dateTime3 = (parseFloat(Date.now()) - 1721836800000) / 1000 / 60 / 60 / 24 / 14 >> 0 let arr0 = randomGarbledCharactersArrayList(); arr[0] = 41; arr[1] = dateTime3; arr[2] = 5 arr[3] = (parseFloat(dateTime1) - parseFloat(dateTime2)) + 3 & 255; arr[4] = dateTime1 >> 0 & 255; arr[5] = dateTime1 >> 8 & 255; arr[6] = dateTime1 >> 16 & 255; arr[7] = dateTime1 >> 24 & 255; arr[8] = dateTime1 / 256 / 256 / 256 / 256 & 255; arr[9] = dateTime1 / 256 / 256 / 256 / 256 / 256 & 255; arr[10] = 1 % 256 & 255; arr[11] = 1 / 256 & 255; arr[12] = 1 & 255; arr[13] = 1 >> 8 & 255; // arr[14] = 602 % 401 % 256 & 255; arr[14] = 1; arr[15] = 0 % 101 % 256 & 255; arr[16] = 0 % 201 % 256 & 255; arr[17] = 0 % 101 % 256 & 255; arr[18] = ua_salt & 255; arr[19] = ua_salt >> 8 & 255; arr[20] = ua_salt >> 16 & 255; arr[21] = ua_salt >> 24 & 255; arr[22] = parArr[9]; arr[23] = parArr[18]; arr[24] = 3; arr[25] = parArr[3]; ; arr[26] = dataArr[10]; arr[27] = dataArr[19]; arr[28] = 4; arr[29] = dataArr[4]; arr[30] = browser_arr[11]; arr[31] = browser_arr[21]; arr[32] = 5; arr[33] = browser_arr[5]; arr[34] = dateTime2 >> 0 & 255; arr[35] = dateTime2 >> 8 & 255; arr[36] = dateTime2 >> 16 & 255; arr[37] = dateTime2 >> 24 & 255; arr[38] = dateTime2 / 256 / 256 / 256 / 256 & 255; arr[39] = dateTime2 / 256 / 256 / 256 / 256 / 256 & 255; arr[40] = 3; let arr32 = 6241; arr[41] = arr32 >> 0 & 255; arr[42] = arr32 >> 8 & 255; arr[43] = arr32 >> 16 & 255; arr[44] = arr32 >> 24 & 255; let arr36 = 6383; arr[45] = arr36 & 255; arr[46] = arr36 >> 8 & 255; arr[47] = arr36 >> 16 & 255; arr[48] = arr36 >> 24 & 255; let last_num_one = getLast_3Num(dateTime1) arr[49] = num.length arr[50] = num.length & 255 arr[51] = num.length >> 8 & 255 arr[52] = last_num_one.length arr[53] = last_num_one.length & 255 arr[54] = last_num_one.length >> 8 & 255 let last_num = getLastNum2(arr0, arr) arr2[0] = arr[9] arr2[1] = arr[18] arr2[2] = arr[30] arr2[3] = arr[35] arr2[4] = arr[47] arr2[5] = arr[4] arr2[6] = arr[44] arr2[7] = arr[19] arr2[8] = arr[10] arr2[9] = arr[23] arr2[10] = arr[12] arr2[11] = arr[40]; arr2[12] = arr[25]; arr2[13] = arr[42]; arr2[14] = arr[3]; arr2[15] = arr[22]; arr2[16] = arr[38]; arr2[17] = arr[21]; arr2[18] = arr[5]; arr2[19] = arr[45]; arr2[20] = arr[1]; arr2[21] = arr[29]; arr2[22] = arr[6]; arr2[23] = arr[43]; arr2[24] = arr[33]; arr2[25] = arr[14]; arr2[26] = arr[36]; arr2[27] = arr[37]; arr2[28] = arr[2]; arr2[29] = arr[46]; arr2[30] = arr[15]; arr2[31] = arr[48]; arr2[32] = arr[31]; arr2[33] = arr[26]; arr2[34] = arr[16]; arr2[35] = arr[13]; arr2[36] = arr[8]; arr2[37] = arr[41]; arr2[38] = arr[27]; arr2[39] = arr[17]; arr2[40] = arr[39] arr2[41] = arr[20] arr2[42] = arr[11] arr2[43] = arr[0] arr2[44] = arr[34] arr2[45] = arr[7] arr2[46] = arr[50] arr2[47] = arr[51] arr2[48] = arr[53] arr2[49] = arr[54] let newArr = [...arr2, ...num] let newArr2 = [...newArr, ...last_num_one] newArr2.push(last_num) return getNumList(arr0, newArr2); } function getLast_3Num(dateTime1) { let intStr = parseFloat(dateTime1) intStr += 3 let timestamp1 = (intStr & 255) + "," let num = [] for (let i = 0; i < timestamp1.length; i++) { num.push(timestamp1.charCodeAt(i)) } return num; } function get_arr2(userAgent) { let data = ''; switch (userAgent.indexOf('Win')) { case -1: // data = '2056|390|2056|1202|0|44|0|0|2056|1203|2056|1329|2056|2815|30|30|MacIntel'; data = '2056|1080|2056|1201|2056|1201|2056|1329|MacIntel'; break; default: data = '2056|1080|2056|1201|2056|1201|2056|1329|Win32'; } // let data = '2056|1087|2056|1208|0|44|0|0|2056|1209|2056|1329|2056|1087|30|30|MacIntel' let sum = [] for (let i = 0; i < data.length; i++) { sum.push(data.charCodeAt(i)) } return sum } function getLastNum2(arr1, arr) { const xorResult = arr1[0] ^ arr1[1] ^ arr1[2] ^ arr1[3] ^ arr1[4] ^ arr1[5] ^ arr1[6] ^ arr1[7] ^ arr[0] ^ arr[1] ^ arr[2] ^ arr[3] ^ arr[4] ^ arr[5] ^ arr[6] ^ arr[7] ^ arr[8] ^ arr[9] ^ arr[10] ^ arr[11] ^ arr[12] ^ arr[13] ^ arr[14] ^ arr[15] ^ arr[16] ^ arr[17] ^ arr[18] ^ arr[19] ^ arr[20] ^ arr[21] ^ arr[22] ^ arr[23] ^ arr[25] ^ arr[26] ^ arr[27] ^ arr[29] ^ arr[30] ^ arr[31] ^ arr[33] ^ arr[34] ^ arr[35] ^ arr[36] ^ arr[37] ^ arr[38] ^ arr[39] ^ arr[40] ^ arr[41] ^ arr[42] ^ arr[43] ^ arr[44] ^ arr[45] ^ arr[46] ^ arr[47] ^ arr[48] ^ arr[50] ^ arr[51] ^ arr[53] ^ arr[54] return xorResult } function getNumList(arr0, arrAr) { let numList = [] // 传入 102 位数组 for (let i = 0; i < arrAr.length; i += 3) { if (i + 2 >= arrAr.length) { if (i + 1 >= arrAr.length) { let num1 = arrAr[i] numList.push(num1) } else { let num1 = arrAr[i] let num2 = arrAr[i + 1] numList.push(num1) numList.push(num2) } } else { let random = Math.random() * 1000 & 255 let num1 = (random & 145) | (arrAr[i] & 110) let num2 = (random & 66) | (arrAr[i + 1] & 189) let num3 = (random & 44) | (arrAr[i + 2] & 211) let num4 = ((arrAr[i] & 145) | (arrAr[i + 1] & 66)) | (arrAr[i + 2] & 44) numList.push(num1) numList.push(num2) numList.push(num3) numList.push(num4) } } return [...arr0, ...numList]; } function topHeaderRandomGarbledCharacters() { let arr = [] let random = Math.random() * 65535 // let num1 = random & 255 let num1 = random & 255 let num2 = Math.random() * 40 >> 0 arr.push((num1 & 170) | (3 & 85)) arr.push((num1 & 85) | (3 & 170)) arr.push((num2 & 170) | (82 & 85)) arr.push((num2 & 85) | (82 & 170)) return String.fromCharCode.apply(null, arr); } function randomGarbledCharactersArrayList() { function randomGarbledCharactersArray1() { let arr = [] random = Math.random() * 65535 num1 = random & 255 num2 = random >> 8 & 255 arr.push((num1 & 170) | (1 & 85)) arr.push((num1 & 85) | (1 & 170)) arr.push((num2 & 170) | (0 & 85)) arr.push((num2 & 85) | (0 & 170)) return arr; } function randomGarbledCharactersArray2() { let arr = [] let num1 = Math.random() * 240 >> 0 let num2 = (Math.random() * 255 >> 0) & 77 | 2 | 16 | 32 | 128 arr.push((num1 & 170) | (1 & 85)) arr.push((num1 & 85) | (1 & 170)) arr.push((num2 & 170) | (0 & 85)) arr.push((num2 & 85) | (0 & 170)) return arr; } return [...randomGarbledCharactersArray1(), ...randomGarbledCharactersArray2()] } function encryptionUa(ss) { const date = Date.now(); let str; str = "ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe" let uaEncryption = ""; let j = 0 for (let i = 0; i < ss.length; i += 3) { if (i + 3 <= ss.length) { let number = (((ss.charCodeAt(i) & 255) << 16) | ((ss.charCodeAt(i + 1) & 255) << 8)) | ((ss.charCodeAt(i + 2) & 255) << 0); uaEncryption += str.charAt((number & 16515072) >> 18); uaEncryption += str.charAt((number & 258048) >> 12); uaEncryption += str.charAt((number & 4032) >> 6); uaEncryption += str.charAt((number & 63) >> 0); } if (i + 3 > ss.length) { let u = ss.length - j if (u === 2) { var charCodeAtNum0 = ss.charCodeAt(j); var charCodeAtNum1 = ss.charCodeAt(j + 1); var baseNum = charCodeAtNum1 << 8 | charCodeAtNum0 << 16; var str1 = str[(baseNum & 16515072) >> 18]; var str2 = str[(baseNum & 258048) >> 12]; var str3 = str[(baseNum & 4032) >> 6]; uaEncryption += str1 + str2 + str3 + '='; } if (u === 1) { var charCodeAtNum0 = ss.charCodeAt(j); var baseNum = 0 | charCodeAtNum0 << 16; var str1 = str[(baseNum & 16515072) >> 18]; var str2 = str[(baseNum & 258048) >> 12]; uaEncryption += str1 + str2 + '=' + '='; } } j += 3 } return uaEncryption } function uaGarbledCharacters(userAgent, ua_salt) { let arr_256 = ua_arr_256(userAgent, ua_salt); let n4 = 0; let ans = ""; for (let i = 0; i < userAgent.length; i++) { let n2 = (i + 1) % 256; let n3 = n4 + arr_256[n2] n4 = n3 % 256 let old_arr_n2 = arr_256[n2] arr_256[n2] = arr_256[n4] arr_256[n4] = old_arr_n2 let n5 = userAgent.charCodeAt(i); let n6 = arr_256[n2] + old_arr_n2; let n7 = n6 % 256 let n8 = n5 ^ arr_256[n7] ans += String.fromCharCode(n8) } return ans; } function ua_arr_256(userAgent, ua_salt) { let nums = [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] let previousValue = 0; let lm = String.fromCharCode(0.00390625, 1, ua_salt); for (let i = 0; i < nums.length; i++) { let num1 = previousValue * nums[i]; previousValue = (num1 + previousValue + lm.charCodeAt(i % 3)) % 256 let tmp = nums[i]; nums[i] = nums[previousValue] nums[previousValue] = tmp } return nums; } function encryptAbogus(userAgent, query, body = '') { function parse(lmStr, dataStr) { let retStr = '' let arr256 = [...Array(256).keys()].map(i => 255 - i); for (var s = 0, swapIdx = 0; s < arr256.length; s++) { swapIdx = ((swapIdx * arr256[s] + swapIdx) + lmStr.charCodeAt(s % lmStr.length)) % 256; let tmp = arr256[s]; arr256[s] = arr256[swapIdx]; arr256[swapIdx] = tmp; } for (let i = 0, bak = 0; i < dataStr.length; i++) { let idx = (i + 1) % 256; let idx2 = (bak + arr256[idx]) % 256; let idx3 = (arr256[idx2] + arr256[idx]) % 256; bak = idx2 // 位置交换 let tmp2 = arr256[idx]; arr256[idx] = arr256[idx2]; arr256[idx2] = tmp2; let num = dataStr.charCodeAt(i) ^ arr256[idx3]; retStr += String.fromCharCode(num); } return retStr } function lmStrEncode(lmArr, table) { let dataStr = ''; let groupNum = lmArr.length / 3; for (let i = 0; i < groupNum; i++) { lmCha1 = lmArr[3 * i] lmCha2 = lmArr[3 * i + 1] lmCha3 = lmArr[3 * i + 2] bigNum = (lmCha1 & 255) << 16 | ((lmCha2 & 255) << 8) | (lmCha3 & 255) chr1 = table.charAt((bigNum & 16515072) >> 18); chr2 = table.charAt((bigNum & 258048) >> 12); chr3 = table.charAt((bigNum & 4032) >> 6); chr4 = table.charAt(bigNum & 63); dataStr += `${chr1}${chr2}${chr3}${chr4}` } // 填充逻辑 const remainder = lmArr.length % 3; if (remainder === 1) { dataStr = dataStr.substring(0, dataStr.length - 2); dataStr += '=='; } else if (remainder === 2) { dataStr = dataStr.substring(0, dataStr.length - 1); dataStr += '='; } // 填充逻辑 3字符 -> 4编码 return dataStr } function getaBogusLmArr4() { // aBogus 拼接乱码4位数组 aBogus乱码前缀 - 两个随机数相关 let randomVal1 = (Math.random() * 65535) & 255; let randomVal2 = Math.random() * 40; return [ (randomVal1 & 170) | 1, (randomVal1 & 85) | 2, ((randomVal2 >> 0) & 170) | 80, ((randomVal2 >> 0) & 85) | 2 ] } function getTmArr(tm) { // 时间戳 构造数组 tm和arr50 - 索引 4 5 6 7 8 9 tmNum = (tm + 3) & 255; tmStr = `${tmNum},` let tmArr = []; for (let i = 0; i < tmStr.length; i++) { tmArr.push(tmStr.charCodeAt(i)); } return tmArr; } function getFpArr() { // 浏览器指纹收集 环境检测 宽度-高度 芯片类型... let fpArr = []; let fpStr = '1920|366|1918|1048|1920|1050|1920|1080|Win32' for (let i = 0; i < fpStr.length; i++) { fpArr.push(fpStr.charCodeAt(i)); } return fpArr; } function sumEncrypt(data) { function be(t, e, r, n) { return 0 <= t && t < 16 ? (e ^ r ^ n) >>> 0 : 16 <= t && t < 64 ? (e & r | ~e & n) >>> 0 : (console.error("invalid j for bool function GG"), 0) } function me(t, e, r, n) { return 0 <= t && t < 16 ? (e ^ r ^ n) >>> 0 : 16 <= t && t < 64 ? (e & r | e & n | r & n) >>> 0 : (console.error("invalid j for bool function FF"), 0) } function de(t) { return 0 <= t && t < 16 ? 2043430169 : 16 <= t && t < 64 ? 2055708042 : void console.error("invalid j for constant Tj") } function ye(t, e) { return (t << (e %= 32) | t >>> 32 - e) >>> 0 } function t() { if (function (t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") }(this, t), !(this instanceof t)) return new t; this.reg = new Array(8), this.chunk = [], this.size = 0, this.reset() } function reset() { // sm3 this.reg[0] = 1937774191, this.reg[1] = 1226093241, this.reg[2] = 388252375, this.reg[3] = 3666478592, this.reg[4] = 2842636476, this.reg[5] = 372324522, this.reg[6] = 3817729613, this.reg[7] = 2969243214, this.chunk = [], this.size = 0 } function write(t) { var e = "string" == typeof t ? function (t) { var e = encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, (function (t, e) { return String.fromCharCode("0x" + e) } )) , r = new Array(e.length); return Array.prototype.forEach.call(e, (function (t, e) { r[e] = t.charCodeAt(0) } )), r }(t) : t; this.size += e.length; var r = 64 - this.chunk.length; if (e.length < r) this.chunk = this.chunk.concat(e); else for (this.chunk = this.chunk.concat(e.slice(0, r)); this.chunk.length >= 64;) this._compress(this.chunk), r < e.length ? this.chunk = e.slice(r, Math.min(r + 64, e.length)) : this.chunk = [], r += 64 } function _compress(t) { if (t < 64) console.error("compress error: not enough data"); else { for (var e = function (t) { for (var e = new Array(132), r = 0; r < 16; r++) e[r] = t[4 * r] << 24, e[r] |= t[4 * r + 1] << 16, e[r] |= t[4 * r + 2] << 8, e[r] |= t[4 * r + 3], e[r] >>>= 0; for (var n = 16; n < 68; n++) { var o = e[n - 16] ^ e[n - 9] ^ ye(e[n - 3], 15); o = o ^ ye(o, 15) ^ ye(o, 23), e[n] = (o ^ ye(e[n - 13], 7) ^ e[n - 6]) >>> 0 } for (n = 0; n < 64; n++) e[n + 68] = (e[n] ^ e[n + 4]) >>> 0; return e }(t), r = this.reg.slice(0), n = 0; n < 64; n++) { var o = ye(r[0], 12) + r[4] + ye(de(n), n) , i = ((o = ye(o = (4294967295 & o) >>> 0, 7)) ^ ye(r[0], 12)) >>> 0 , u = me(n, r[0], r[1], r[2]); u = (4294967295 & (u = u + r[3] + i + e[n + 68])) >>> 0; var c = be(n, r[4], r[5], r[6]); c = (4294967295 & (c = c + r[7] + o + e[n])) >>> 0, r[3] = r[2], r[2] = ye(r[1], 9), r[1] = r[0], r[0] = u, r[7] = r[6], r[6] = ye(r[5], 19), r[5] = r[4], r[4] = (c ^ ye(c, 9) ^ ye(c, 17)) >>> 0 } for (var a = 0; a < 8; a++) this.reg[a] = (this.reg[a] ^ r[a]) >>> 0 } } function _fill() { var t = 8 * this.size , e = this.chunk.push(128) % 64; for (64 - e < 8 && (e -= 64); e < 56; e++) this.chunk.push(0); for (var r = 0; r < 4; r++) { var n = Math.floor(t / 4294967296); this.chunk.push(n >>> 8 * (3 - r) & 255) } for (r = 0; r < 4; r++) this.chunk.push(t >>> 8 * (3 - r) & 255) } function sum(t, e) { t && (this.reset(), this.write(t)), this._fill(); for (var r = 0; r < this.chunk.length; r += 64) this._compress(this.chunk.slice(r, r + 64)); var n, o, i, u = null; if ("hex" == e) { u = ""; for (r = 0; r < 8; r++) u += (n = this.reg[r].toString(16), o = 8, i = "0", n.length >= o ? n : i.repeat(o - n.length) + n) } else for (u = new Array(32), r = 0; r < 8; r++) { var c = this.reg[r]; u[4 * r + 3] = (255 & c) >>> 0, c >>>= 8, u[4 * r + 2] = (255 & c) >>> 0, c >>>= 8, u[4 * r + 1] = (255 & c) >>> 0, c >>>= 8, u[4 * r] = (255 & c) >>> 0 } return this.reset(), u } t.prototype.reset = reset; t.prototype.write = write; t.prototype._compress = _compress; t.prototype._fill = _fill; t.prototype.sum = sum; obj = new t(); return obj.sum(data); } function getXorRandomArr8() { //[3, 85, 34, 1, 43, 4, 162, 85 // 异或计算58数组前8位随机生成 参与前8位异或运算 randomVal1 = Math.random() * 65535 tmpVal1 = (randomVal1 & 255) & 255 tmpVal2 = (randomVal1 >> 8) & 255 num1 = (tmpVal1 & 170) | 1 num2 = (tmpVal1 & 85) | 0 num3 = (tmpVal2 & 170) | 0 num4 = (tmpVal2 & 85) | 0 // 随机算法不一致 randomVal = Math.random() * 255; randomVal2 = Math.random() * 240; isEven = (randomVal2 >> 0) + 110; isEven = isEven % 2 === 0 ? isEven : ++isEven; num5 = (isEven & 170) | 1; num6 = (isEven & 85) | 0; num7 = (((((((randomVal >> 0) & 77) | 2) | 16) | 32) | 128) & 170) | 16 num8 = (((((((randomVal >> 0)) & 77) | 16) | 32) | 128) & 85) | 2; return [num1, num2, num3, num4, num5, num6, num7, num8]; } function getNewArr50(arr50) { // 排序arr50 提取和真实后续传参不一致 orderedArr50 = new Array(50) orderedArr50[0] = arr50[9] orderedArr50[1] = arr50[18] orderedArr50[2] = arr50[28] orderedArr50[3] = arr50[32] orderedArr50[4] = arr50[11] orderedArr50[5] = arr50[4] orderedArr50[6] = arr50[11] orderedArr50[7] = arr50[11] orderedArr50[8] = arr50[9] orderedArr50[9] = arr50[23] orderedArr50[10] = arr50[12] orderedArr50[11] = arr50[37] orderedArr50[12] = arr50[24] orderedArr50[13] = arr50[39] orderedArr50[14] = arr50[3] orderedArr50[15] = arr50[22] orderedArr50[16] = arr50[35] orderedArr50[17] = arr50[11] orderedArr50[18] = arr50[5] orderedArr50[19] = arr50[42] orderedArr50[20] = arr50[1] orderedArr50[21] = arr50[27] orderedArr50[22] = arr50[33] orderedArr50[23] = arr50[11] orderedArr50[24] = arr50[30] orderedArr50[25] = arr50[14] orderedArr50[26] = arr50[6] orderedArr50[27] = arr50[7] orderedArr50[28] = arr50[2] orderedArr50[29] = arr50[43] orderedArr50[30] = arr50[15] orderedArr50[31] = arr50[11] orderedArr50[32] = arr50[29] orderedArr50[33] = arr50[25] orderedArr50[34] = arr50[16] orderedArr50[35] = arr50[11] orderedArr50[36] = arr50[8] orderedArr50[37] = arr50[38] orderedArr50[38] = arr50[26] orderedArr50[39] = arr50[17] orderedArr50[40] = arr50[9] orderedArr50[41] = arr50[11] orderedArr50[42] = arr50[11] orderedArr50[43] = arr50[0] orderedArr50[44] = arr50[31] orderedArr50[45] = arr50[7] orderedArr50[46] = arr50[46] orderedArr50[47] = arr50[47] orderedArr50[48] = arr50[48] orderedArr50[49] = arr50[49] return orderedArr50 } function getXorArray(arr) { let xorResult = 0; for (let i = 0; i < arr.length; i++) { xorResult ^= arr[i]; // 使用 ^= 运算符进行异或 } return [xorResult]; } function strToIntArr(dataStr) { // 字符串转位字节数组 return Array.from(dataStr).map((char, index) => { return char.charCodeAt(0); }); } // web端验签 -> a_bogus V 1.0.1.20 from bdms.js const tableObj = { "s0": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // 标准 "s1": "Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=", "s2": "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=", // xb "s3": "ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe", // ua "s4": "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe" // ab } const salt = 'dhzx' const constVal1 = 22740 const constVal2 = 2631 const keyVal = 0 const tm2 = new Date().getTime() - 1 const tm1Before = new Date().getTime() const fpArr = getFpArr(); const queryArr32 = sumEncrypt(sumEncrypt(`${query}${salt}`)) const dataArr32 = sumEncrypt(sumEncrypt(`${body}${salt}`)) const userAgentLmStr = parse(String.fromCharCode(...[0.00390625, 1, keyVal]), userAgent) const userAgentArr32 = sumEncrypt(lmStrEncode(strToIntArr(userAgentLmStr), tableObj.s3)) const tm1 = new Date().getTime() let arr50 = [ // arr50相关 - 时间戳 query data ua 鼠标轨迹 41, 9, 6, ((tm1 - tm1Before) + 3) & 255, (tm1 >> 0) & 255, (tm1 >> 8) & 255, (tm1 >> 16) & 255, (tm1 >> 24) & 255, ((((tm1 / 256) / 256) / 256) / 256) & 255, (((((tm1 / 256) / 256) / 256) / 256) / 256) & 255, (1 % 256) & 255, (1 / 256) & 255, 129, (129 >> 8) & 255, // 鼠标轨迹相关 // 102, 12, 12, 14, 0, 0, 0, 0, (keyVal >> 0) & 255, (keyVal >> 8) & 255, (keyVal >> 16) & 255, (keyVal >> 24) & 255, // 索引23 queryArr32[9], queryArr32[18], queryArr32[3], dataArr32[10], dataArr32[19], dataArr32[4], userAgentArr32[11], userAgentArr32[21], userAgentArr32[5], // 索引31 (tm2 >> 0) & 255, (tm2 >> 8) & 255, (tm2 >> 16) & 255, (tm2 >> 24) & 255, ((((tm2 / 256) / 256) / 256) / 256) & 255, (((((tm2 / 256) / 256) / 256) / 256) / 256) & 255, 3, // 常量值运算 (constVal1 >> 0) & 255, (constVal1 >> 8) & 255, (constVal1 >> 16) & 255, (constVal1 >> 24) & 255, (constVal2 >> 0) & 255, (constVal2 >> 8) & 255, (constVal2 >> 16) & 255, (constVal2 >> 24) & 255, 44, 0, 4, 0 ] const newArr50 = getNewArr50(arr50) // 暂时一致 const xorRandomArr8 = getXorRandomArr8() const arr58 = [...xorRandomArr8, ...arr50] const xorArray = getXorArray(arr58) const arr4Merge = [...newArr50, ...fpArr, ...getTmArr(tm1), ...xorArray] let aBogusLmStr = String.fromCharCode(...getaBogusLmArr4()) // ok let mergeArr = []; // ok for (let i = 0; i < arr4Merge.length / 3; i++) { // 遍历数组 每次取3位 然后计算 let val1 = arr4Merge[3 * i] let val2 = arr4Merge[3 * i + 1] let val3 = arr4Merge[3 * i + 2] const randomVal = (Math.random() * 1000) & 255; mergeArr.push( (randomVal & 145) | (val1 & 110), (randomVal & 66) | (val2 & 189), (randomVal & 44) | (val3 & 211), ((val1 & 145) | (val2 & 66)) | (val3 & 44) ) } let bigArr = xorRandomArr8.concat( mergeArr, xorArray ) aBogusLmStr += parse(String.fromCharCode(...[211]), String.fromCharCode(...bigArr)) return lmStrEncode(strToIntArr(aBogusLmStr), tableObj.s4); } url = "aid=6383&browser_language=zh-CN&browser_name=Chrome&browser_online=true&browser_platform=Win32&browser_version=86.0.4240.198&channel=channel_pc_web&cookie_enabled=true&count=10&cpu_core_num=16&device_memory=8&device_platform=webapp&downlink=1.6&effective_type=4g&enable_history=1&engine_name=Blink&engine_version=86.0.4240.198&from_group_id=7408552145152232704&is_filter_search=0&keyword=%E5%AF%BB%E9%81%93%E5%A4%A7%E5%8D%83&list_type=multi&need_filter_settings=1&offset=0&os_name=Windows&os_version=10&pc_client_type=1&pc_libra_divert=Windows&platform=PC&query_correct_type=1&round_trip_time=100&screen_height=1080&screen_width=1920&search_channel=aweme_general&search_source=search_history&support_dash=1&support_h265=1&uifid=6a8253199192b669ecb5c608c1e1200542a2d66d943f26f79f1de78af50d7a1a9ee9a3bc1df4ffb3980b959cc862e14b52f4549c58429f43ca59338b8b01345f94d2d343bdd0902bf930cbf3c1480b21b01553e18ee5ef1d30f0b6ecd65115e8af41254b2e747238ac7520501223bf1a341b48ee1b819e5807a5cf1bfdf2de84704909c6006e17c3ee6b499a4028aaa1cefe825ce763005ce7b308aea90e12c3&version_code=190600&version_name=19.6.0&webid=7478320717131761204&msToken=RQlbb_R8L-IY14cJdDiPnNQUjPFsEtJxCkLGkNzHT5dxWi9m05XFx6kinjTO9_IrG0oZX6vuKjP4wapItn3avtRtkRJIa8JhJTgGnDSfqKv6VcBZsAZUsV2K0VaZnuMv79_u-B16c_6hW-eE5GbIvYNgAXhT_CADFCsZQzYFx4Y%3D" // data = '{"scene":"PCSquareFeed","size":30,"search_text":"","cursor":0,"extra":{"new_session_strategy":"1","search_id":"24eb6b82c01bf539ae7ea2d83b1501a2977e00811b9cf35ff526a25cb83bfc8eb14b20dc1eba350e937bf5ead59d7cbbf9b1c7653501dfe8ed77d888911abdc525ef1292b65df2e0a48529320c56207a","session_id":"2240ef2d8a855155c5a83bb0482ffccf197cd99dd99017347d914442b8d79bf1940d42ecbc787b1e2f49d8d2d5403d5704aa99c1450f453c6aa40bd9c265e340fef543c222f6dd22a34ff8b6f108f736"},"filters":{"Price":{"value":["R:200,-"]}}}' userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' console.log(enc(url, null, userAgent)) // console.log(getABogus(url, data, userAgent).length)