123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- // All the content in this article is only for learning and communication use, not for any other purpose, strictly prohibited for commercial use and illegal use, otherwise all the consequences are irrelevant to the author!
- function rc4_encrypt(plaintext, key) {
- var s = [];
- for (var i = 0; i < 256; i++) {
- s[i] = i;
- }
- var j = 0;
- for (var i = 0; i < 256; i++) {
- j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
- var temp = s[i];
- s[i] = s[j];
- s[j] = temp;
- }
- var i = 0;
- var j = 0;
- var cipher = [];
- for (var k = 0; k < plaintext.length; k++) {
- i = (i + 1) % 256;
- j = (j + s[i]) % 256;
- var temp = s[i];
- s[i] = s[j];
- s[j] = temp;
- var t = (s[i] + s[j]) % 256;
- cipher.push(String.fromCharCode(s[t] ^ plaintext.charCodeAt(k)));
- }
- return cipher.join('');
- }
- function le(e, r) {
- return (e << (r %= 32) | e >>> 32 - r) >>> 0
- }
- function de(e) {
- return 0 <= e && e < 16 ? 2043430169 : 16 <= e && e < 64 ? 2055708042 : void console['error']("invalid j for constant Tj")
- }
- function pe(e, r, t, n) {
- return 0 <= e && e < 16 ? (r ^ t ^ n) >>> 0 : 16 <= e && e < 64 ? (r & t | r & n | t & n) >>> 0 : (console['error']('invalid j for bool function FF'),
- 0)
- }
- function he(e, r, t, n) {
- return 0 <= e && e < 16 ? (r ^ t ^ n) >>> 0 : 16 <= e && e < 64 ? (r & t | ~r & n) >>> 0 : (console['error']('invalid j for bool function GG'),
- 0)
- }
- function reset() {
- 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(e) {
- var a = "string" == typeof e ? function (e) {
- n = encodeURIComponent(e)['replace'](/%([0-9A-F]{2})/g, (function (e, r) {
- return String['fromCharCode']("0x" + r)
- }
- ))
- , a = new Array(n['length']);
- return Array['prototype']['forEach']['call'](n, (function (e, r) {
- a[r] = e.charCodeAt(0)
- }
- )),
- a
- }(e) : e;
- this.size += a.length;
- var f = 64 - this['chunk']['length'];
- if (a['length'] < f)
- this['chunk'] = this['chunk'].concat(a);
- else
- for (this['chunk'] = this['chunk'].concat(a.slice(0, f)); this['chunk'].length >= 64;)
- this['_compress'](this['chunk']),
- f < a['length'] ? this['chunk'] = a['slice'](f, Math['min'](f + 64, a['length'])) : this['chunk'] = [],
- f += 64
- }
- function sum(e, t) {
- e && (this['reset'](),
- this['write'](e)),
- this['_fill']();
- for (var f = 0; f < this.chunk['length']; f += 64)
- this._compress(this['chunk']['slice'](f, f + 64));
- var i = null;
- if (t == 'hex') {
- i = "";
- for (f = 0; f < 8; f++)
- i += se(this['reg'][f]['toString'](16), 8, "0")
- } else
- for (i = new Array(32),
- f = 0; f < 8; f++) {
- var c = this.reg[f];
- i[4 * f + 3] = (255 & c) >>> 0,
- c >>>= 8,
- i[4 * f + 2] = (255 & c) >>> 0,
- c >>>= 8,
- i[4 * f + 1] = (255 & c) >>> 0,
- c >>>= 8,
- i[4 * f] = (255 & c) >>> 0
- }
- return this['reset'](),
- i
- }
- function _compress(t) {
- if (t < 64)
- console.error("compress error: not enough data");
- else {
- for (var f = function (e) {
- for (var r = new Array(132), t = 0; t < 16; t++)
- r[t] = e[4 * t] << 24,
- r[t] |= e[4 * t + 1] << 16,
- r[t] |= e[4 * t + 2] << 8,
- r[t] |= e[4 * t + 3],
- r[t] >>>= 0;
- for (var n = 16; n < 68; n++) {
- var a = r[n - 16] ^ r[n - 9] ^ le(r[n - 3], 15);
- a = a ^ le(a, 15) ^ le(a, 23),
- r[n] = (a ^ le(r[n - 13], 7) ^ r[n - 6]) >>> 0
- }
- for (n = 0; n < 64; n++)
- r[n + 68] = (r[n] ^ r[n + 4]) >>> 0;
- return r
- }(t), i = this['reg'].slice(0), c = 0; c < 64; c++) {
- var o = le(i[0], 12) + i[4] + le(de(c), c)
- , s = ((o = le(o = (4294967295 & o) >>> 0, 7)) ^ le(i[0], 12)) >>> 0
- , u = pe(c, i[0], i[1], i[2]);
- u = (4294967295 & (u = u + i[3] + s + f[c + 68])) >>> 0;
- var b = he(c, i[4], i[5], i[6]);
- b = (4294967295 & (b = b + i[7] + o + f[c])) >>> 0,
- i[3] = i[2],
- i[2] = le(i[1], 9),
- i[1] = i[0],
- i[0] = u,
- i[7] = i[6],
- i[6] = le(i[5], 19),
- i[5] = i[4],
- i[4] = (b ^ le(b, 9) ^ le(b, 17)) >>> 0
- }
- for (var l = 0; l < 8; l++)
- this['reg'][l] = (this['reg'][l] ^ i[l]) >>> 0
- }
- }
- function _fill() {
- var a = 8 * this['size']
- , f = this['chunk']['push'](128) % 64;
- for (64 - f < 8 && (f -= 64); f < 56; f++)
- this.chunk['push'](0);
- for (var i = 0; i < 4; i++) {
- var c = Math['floor'](a / 4294967296);
- this['chunk'].push(c >>> 8 * (3 - i) & 255)
- }
- for (i = 0; i < 4; i++)
- this['chunk']['push'](a >>> 8 * (3 - i) & 255)
- }
- function SM3() {
- this.reg = [];
- this.chunk = [];
- this.size = 0;
- this.reset()
- }
- SM3.prototype.reset = reset;
- SM3.prototype.write = write;
- SM3.prototype.sum = sum;
- SM3.prototype._compress = _compress;
- SM3.prototype._fill = _fill;
- function result_encrypt(long_str, num = null) {
- let s_obj = {
- "s0": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
- "s1": "Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
- "s2": "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
- "s3": "ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe",
- "s4": "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe"
- }
- let constant = {
- "0": 16515072,
- "1": 258048,
- "2": 4032,
- "str": s_obj[num],
- }
- let result = "";
- let lound = 0;
- let long_int = get_long_int(lound, long_str);
- for (let i = 0; i < long_str.length / 3 * 4; i++) {
- if (Math.floor(i / 4) !== lound) {
- lound += 1;
- long_int = get_long_int(lound, long_str);
- }
- let key = i % 4;
- switch (key) {
- case 0:
- temp_int = (long_int & constant["0"]) >> 18;
- result += constant["str"].charAt(temp_int);
- break;
- case 1:
- temp_int = (long_int & constant["1"]) >> 12;
- result += constant["str"].charAt(temp_int);
- break;
- case 2:
- temp_int = (long_int & constant["2"]) >> 6;
- result += constant["str"].charAt(temp_int);
- break;
- case 3:
- temp_int = long_int & 63;
- result += constant["str"].charAt(temp_int);
- break;
- default:
- break;
- }
- }
- return result;
- }
- function get_long_int(round, long_str) {
- round = round * 3;
- return (long_str.charCodeAt(round) << 16) | (long_str.charCodeAt(round + 1) << 8) | (long_str.charCodeAt(round + 2));
- }
- function gener_random(random, option) {
- return [
- (random & 255 & 170) | option[0] & 85, // 163
- (random & 255 & 85) | option[0] & 170, //87
- (random >> 8 & 255 & 170) | option[1] & 85, //37
- (random >> 8 & 255 & 85) | option[1] & 170, //41
- ]
- }
- //////////////////////////////////////////////
- function generate_rc4_bb_str(url_search_params, user_agent, window_env_str, suffix = "cus", Arguments = [0, 1, 14]) {
- let sm3 = new SM3()
- let start_time = Date.now()
- /**
- * 进行3次加密处理
- * 1: url_search_params两次sm3之的结果
- * 2: 对后缀两次sm3之的结果
- * 3: 对ua处理之后的结果
- */
- // url_search_params两次sm3之的结果
- let url_search_params_list = sm3.sum(sm3.sum(url_search_params + suffix))
- // 对后缀两次sm3之的结果
- let cus = sm3.sum(sm3.sum(suffix))
- // 对ua处理之后的结果
- let ua = sm3.sum(result_encrypt(rc4_encrypt(user_agent, String.fromCharCode.apply(null, [0.00390625, 1, 14])), "s3"))
- //
- let end_time = Date.now()
- // b
- let b = {
- 8: 3, // 固定
- 10: end_time, //3次加密结束时间
- 15: {
- "aid": 6383,
- "pageId": 6241,
- "boe": false,
- "ddrt": 7,
- "paths": {
- "include": [
- {},
- {},
- {},
- {},
- {},
- {},
- {}
- ],
- "exclude": []
- },
- "track": {
- "mode": 0,
- "delay": 300,
- "paths": []
- },
- "dump": true,
- "rpU": ""
- },
- 16: start_time, //3次加密开始时间
- 18: 44, //固定
- 19: [1, 0, 1, 5],
- }
- //3次加密开始时间
- b[20] = (b[16] >> 24) & 255
- b[21] = (b[16] >> 16) & 255
- b[22] = (b[16] >> 8) & 255
- b[23] = b[16] & 255
- b[24] = (b[16] / 256 / 256 / 256 / 256) >> 0
- b[25] = (b[16] / 256 / 256 / 256 / 256 / 256) >> 0
- // 参数Arguments [0, 1, 14, ...]
- // let Arguments = [0, 1, 14]
- b[26] = (Arguments[0] >> 24) & 255
- b[27] = (Arguments[0] >> 16) & 255
- b[28] = (Arguments[0] >> 8) & 255
- b[29] = Arguments[0] & 255
- b[30] = (Arguments[1] / 256) & 255
- b[31] = (Arguments[1] % 256) & 255
- b[32] = (Arguments[1] >> 24) & 255
- b[33] = (Arguments[1] >> 16) & 255
- b[34] = (Arguments[2] >> 24) & 255
- b[35] = (Arguments[2] >> 16) & 255
- b[36] = (Arguments[2] >> 8) & 255
- b[37] = Arguments[2] & 255
- // (url_search_params + "cus") 两次sm3之的结果
- /**let url_search_params_list = [
- 91, 186, 35, 86, 143, 253, 6, 76,
- 34, 21, 167, 148, 7, 42, 192, 219,
- 188, 20, 182, 85, 213, 74, 213, 147,
- 37, 155, 93, 139, 85, 118, 228, 213
- ]*/
- b[38] = url_search_params_list[21]
- b[39] = url_search_params_list[22]
- // ("cus") 对后缀两次sm3之的结果
- /**
- * let cus = [
- 136, 101, 114, 147, 58, 77, 207, 201,
- 215, 162, 154, 93, 248, 13, 142, 160,
- 105, 73, 215, 241, 83, 58, 51, 43,
- 255, 38, 168, 141, 216, 194, 35, 236
- ]*/
- b[40] = cus[21]
- b[41] = cus[22]
- // 对ua处理之后的结果
- /**
- * let ua = [
- 129, 190, 70, 186, 86, 196, 199, 53,
- 99, 38, 29, 209, 243, 17, 157, 69,
- 147, 104, 53, 23, 114, 126, 66, 228,
- 135, 30, 168, 185, 109, 156, 251, 88
- ]*/
- b[42] = ua[23]
- b[43] = ua[24]
- //3次加密结束时间
- b[44] = (b[10] >> 24) & 255
- b[45] = (b[10] >> 16) & 255
- b[46] = (b[10] >> 8) & 255
- b[47] = b[10] & 255
- b[48] = b[8]
- b[49] = (b[10] / 256 / 256 / 256 / 256) >> 0
- b[50] = (b[10] / 256 / 256 / 256 / 256 / 256) >> 0
- // object配置项
- b[51] = b[15]['pageId']
- b[52] = (b[15]['pageId'] >> 24) & 255
- b[53] = (b[15]['pageId'] >> 16) & 255
- b[54] = (b[15]['pageId'] >> 8) & 255
- b[55] = b[15]['pageId'] & 255
- b[56] = b[15]['aid']
- b[57] = b[15]['aid'] & 255
- b[58] = (b[15]['aid'] >> 8) & 255
- b[59] = (b[15]['aid'] >> 16) & 255
- b[60] = (b[15]['aid'] >> 24) & 255
- // 中间进行了环境检测
- // 代码索引: 2496 索引值: 17 (索引64关键条件)
- // '1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32'.charCodeAt()得到65位数组
- /**
- * let window_env_list = [49, 53, 51, 54, 124, 55, 52, 55, 124, 49, 53, 51, 54, 124, 56, 51, 52, 124, 48, 124, 51,
- * 48, 124, 48, 124, 48, 124, 49, 53, 51, 54, 124, 56, 51, 52, 124, 49, 53, 51, 54, 124, 56,
- * 54, 52, 124, 49, 53, 50, 53, 124, 55, 52, 55, 124, 50, 52, 124, 50, 52, 124, 87, 105, 110,
- * 51, 50]
- */
- let window_env_list = [];
- for (let index = 0; index < window_env_str.length; index++) {
- window_env_list.push(window_env_str.charCodeAt(index))
- }
- b[64] = window_env_list.length
- b[65] = b[64] & 255
- b[66] = (b[64] >> 8) & 255
- b[69] = [].length
- b[70] = b[69] & 255
- b[71] = (b[69] >> 8) & 255
- b[72] = b[18] ^ b[20] ^ b[26] ^ b[30] ^ b[38] ^ b[40] ^ b[42] ^ b[21] ^ b[27] ^ b[31] ^ b[35] ^ b[39] ^ b[41] ^ b[43] ^ b[22] ^
- b[28] ^ b[32] ^ b[36] ^ b[23] ^ b[29] ^ b[33] ^ b[37] ^ b[44] ^ b[45] ^ b[46] ^ b[47] ^ b[48] ^ b[49] ^ b[50] ^ b[24] ^
- b[25] ^ b[52] ^ b[53] ^ b[54] ^ b[55] ^ b[57] ^ b[58] ^ b[59] ^ b[60] ^ b[65] ^ b[66] ^ b[70] ^ b[71]
- let bb = [
- b[18], b[20], b[52], b[26], b[30], b[34], b[58], b[38], b[40], b[53], b[42], b[21], b[27], b[54], b[55], b[31],
- b[35], b[57], b[39], b[41], b[43], b[22], b[28], b[32], b[60], b[36], b[23], b[29], b[33], b[37], b[44], b[45],
- b[59], b[46], b[47], b[48], b[49], b[50], b[24], b[25], b[65], b[66], b[70], b[71]
- ]
- bb = bb.concat(window_env_list).concat(b[72])
- return rc4_encrypt(String.fromCharCode.apply(null, bb), String.fromCharCode.apply(null, [121]));
- }
- function generate_random_str() {
- let random_str_list = []
- random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [3, 45]))
- random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [1, 0]))
- random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [1, 5]))
- return String.fromCharCode.apply(null, random_str_list)
- }
- function generate_a_bogus(url_search_params, user_agent) {
- /**
- * url_search_params:"device_platform=webapp&aid=6383&channel=channel_pc_web&update_version_code=170400&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=123.0.0.0&browser_online=true&engine_name=Blink&engine_version=123.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7362810250930783783&msToken=VkDUvz1y24CppXSl80iFPr6ez-3FiizcwD7fI1OqBt6IICq9RWG7nCvxKb8IVi55mFd-wnqoNkXGnxHrikQb4PuKob5Q-YhDp5Um215JzlBszkUyiEvR"
- * user_agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
- */
- let result_str = generate_random_str() + generate_rc4_bb_str(
- url_search_params,
- user_agent,
- "1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32"
- );
- return result_encrypt(result_str, "s4") + "=";
- }
- //测试调用
- // console.log(generate_a_bogus(
- // "device_platform=webapp&aid=6383&channel=channel_pc_web&update_version_code=170400&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=123.0.0.0&browser_online=true&engine_name=Blink&engine_version=123.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7362810250930783783&msToken=VkDUvz1y24CppXSl80iFPr6ez-3FiizcwD7fI1OqBt6IICq9RWG7nCvxKb8IVi55mFd-wnqoNkXGnxHrikQb4PuKob5Q-YhDp5Um215JzlBszkUyiEvR",
- // "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
- // ));
|