mirror of
https://github.com/pysunday/rs-reverse.git
synced 2025-04-12 03:46:56 +08:00
feat: add makecookie must handler functions
This commit is contained in:
parent
c3204f6509
commit
cc899698f8
@ -1,154 +1,17 @@
|
||||
const dataOper = require('./dataOper');
|
||||
const _chunk = require('lodash/chunk');
|
||||
const jsdom = require("jsdom");
|
||||
const { JSDOM } = jsdom;
|
||||
const { window } = new JSDOM(``, {
|
||||
runScripts: "outside-only",
|
||||
url: "http://wcjs.sbj.cnipa.gov.cn/sgtmi",
|
||||
});
|
||||
|
||||
const { String, Array, Error, Math, Date, Object, unescape, encodeURIComponent, Function, parseInt } = window;
|
||||
const parser = require('./parser/');
|
||||
const gv = require('./globalVarible');
|
||||
|
||||
module.exports = class {
|
||||
constructor(ts) {
|
||||
this.startTime = new Date().getTime();
|
||||
window.$_ts = ts
|
||||
this.opdata = dataOper()
|
||||
parser.init(ts)
|
||||
}
|
||||
|
||||
parseCpCommon(data) {
|
||||
if (!data) return [];
|
||||
const { opdata: { getData } } = this;
|
||||
const ans = []
|
||||
const firstCode = data.charCodeAt(0) - 97;
|
||||
for (let idx = 1; idx < data.length; ++idx) {
|
||||
let curr = data.charCodeAt(idx);
|
||||
if (curr >= 40 && curr < 92) {
|
||||
curr += firstCode;
|
||||
if (curr >= 92) curr -= 52;
|
||||
} else if (curr >= 97 && curr < 127) {
|
||||
curr += firstCode;
|
||||
if(curr >= 127) curr -= 30;
|
||||
}
|
||||
ans[idx - 1] = curr;
|
||||
}
|
||||
return String.fromCharCode(...ans).split(getData('G_$d2'));
|
||||
}
|
||||
|
||||
globalCode() {
|
||||
const { opdata: { setData, getData } } = this;
|
||||
setData('G_$dZ', String.fromCharCode);
|
||||
setData('G_$at', Array);
|
||||
setData('G_$d2', String.fromCharCode(96));
|
||||
const cp0 = _chunk(this.parseCpCommon(window.$_ts.cp[0]), 96);
|
||||
setData('G_$cc', cp0[0]);
|
||||
setData('G_$ia', cp0[1]);
|
||||
setData('G_$ga', cp0[2]);
|
||||
setData('G_$_7', cp0[3]);
|
||||
setData('G_$_3', cp0[4]);
|
||||
setData('G_$jY', cp0[5]);
|
||||
setData('G_$ad', cp0[6]);
|
||||
setData('G_$bJ', cp0[7]);
|
||||
setData('G_$eh', cp0[8]);
|
||||
setData('G_$bv', cp0[9]);
|
||||
setData('G_$bO', cp0[10]);
|
||||
setData('G_$_x', cp0[11]);
|
||||
setData('G_$dL', cp0[12]);
|
||||
setData('G_$bn', cp0[13]);
|
||||
setData('G_$_a', cp0[14]);
|
||||
setData('G_$kf', cp0[15]);
|
||||
setData('G_$fa', cp0[16]);
|
||||
setData('G_$h2', cp0[17]);
|
||||
setData('G_$je', cp0[18]);
|
||||
setData('G_$he', cp0[19]);
|
||||
setData('G_$$6', cp0[20]);
|
||||
setData('G_$hQ', this.parseCpCommon(window.$_ts.cp[2]).map(Number));
|
||||
setData('G_$cJ', this.parseCpCommon(window.$_ts.cp[6]));
|
||||
setData('G_$aP', []);
|
||||
setData('G_$fX', []);
|
||||
getData('G_$fX')[49] = getData('G_$aP');
|
||||
getData('G_$fX')[15] = null;
|
||||
setData('G_$cZ', String);
|
||||
setData('G_$gc', window);
|
||||
setData('G_$ja', null);
|
||||
setData('G_$dq', Error);
|
||||
setData('G_$cm', Math);
|
||||
setData('G_$hY', parseInt);
|
||||
setData('G_$ao', Date);
|
||||
setData('G_$fi', Object);
|
||||
setData('G_$aB', unescape);
|
||||
setData('G_$hq', encodeURIComponent);
|
||||
setData('G_$_z', Function);
|
||||
setData('G_$ah', window.document);
|
||||
setData('G_$ii', window.top.location);
|
||||
setData('G_$_v', Math.random);
|
||||
setData('G_$gh', Math.abs);
|
||||
setData('G_$kg', Math.ceil);
|
||||
getData('G_$fX')[51] = Math.round;
|
||||
getData('G_$fX')[27] = Math.floor;
|
||||
getData('G_$fX')[44] = Math.log;
|
||||
getData('G_$fX')[53] = Math.pow;
|
||||
setData('G_$bB', Math.sqrt);
|
||||
setData('G_$fA', window.setTimeout);
|
||||
setData('G_$iu', window.setInterval);
|
||||
setData('G_$hL', window.eval);
|
||||
setData('G_$dN', window.escape);
|
||||
setData('G_$jr', window.Number);
|
||||
setData('G_$gL', window.decodeURIComponent);
|
||||
setData('G_$dk', window.isFinite);
|
||||
setData('G_$c7', window.location);
|
||||
setData('G_$jU', window.RegExp);
|
||||
getData('G_$fX')[19] = window.$_ts;
|
||||
setData('G_$hD', String.prototype);
|
||||
getData('G_$fX')[40] = String.prototype.charAt;
|
||||
setData('G_$jD', String.prototype.charCodeAt);
|
||||
getData('G_$fX')[30] = String.prototype.concat;
|
||||
getData('G_$fX')[14] = String.prototype.indexOf;
|
||||
getData('G_$fX')[33] = String.prototype.lastIndexOf;
|
||||
setData('G_$gW', String.prototype.match);
|
||||
setData('G_$en', String.prototype.replace);
|
||||
setData('G_$$L', String.prototype.search);
|
||||
getData('G_$fX')[36] = String.prototype.slice;
|
||||
getData('G_$fX')[11] = String.prototype.split;
|
||||
setData('G_$j0', String.prototype.substr);
|
||||
setData('G_$c1', String.prototype.substring);
|
||||
getData('G_$fX')[42] = String.prototype.toLowerCase;
|
||||
getData('G_$fX')[43] = String.prototype.toUpperCase;
|
||||
setData('G_$f9', Array.prototype.push);
|
||||
setData('G_$in', Object.prototype.toString);
|
||||
getData('G_$fX')[38] = Function.prototype.toString;
|
||||
getData('G_$fX')[2] = Array.prototype.join;
|
||||
getData('G_$fX')[16] = window.document.createElement;
|
||||
getData('G_$fX')[21] = window.document.appendChild;
|
||||
getData('G_$fX')[50] = window.document.removeChild;
|
||||
setData('G_$eF', []);
|
||||
getData('G_$fX')[46] = window.clearInterval;
|
||||
setData('G_$bd', '/');
|
||||
setData('G_$eD', ':');
|
||||
setData('G_$dl', '#');
|
||||
setData('G_$bL', '//');
|
||||
setData('G_$cb', 'href');
|
||||
setData('G_$ap', 'protocol');
|
||||
setData('G_$_f', 'hostname');
|
||||
setData('G_$jm', 'port');
|
||||
setData('G_$jQ', 'pathname');
|
||||
setData('G_$dH', window.CollectGarbage);
|
||||
getData('G_$fX')[32] = window.DOMParser
|
||||
setData('G_$_E', window.ActiveXObject);
|
||||
setData('G_$aJ', window.JSON);
|
||||
setData('G_$$H', String.prototype.trim);
|
||||
getData('G_$fX')[45] = window.JSON && window.JSON.parse;
|
||||
getData('G_$fX')[52] = '';
|
||||
getData('G_$fX')[48] = window.$_ts.jf;
|
||||
window.$_ts.jf = undefined;
|
||||
getData('G_$fX')[12] = [getData('G_$hQ')[9], getData('G_$hQ')[48], getData('G_$hQ')[37], 1];
|
||||
getData('G_$fX')[3] = 1;
|
||||
getData('G_$fX')[18] = getData('G_$hQ')[41];
|
||||
getData('G_$fX')[8] = getData('G_$hQ')[0];
|
||||
setData('G_$$o', parseInt);
|
||||
parseHandle() {
|
||||
}
|
||||
|
||||
run() {
|
||||
this.globalCode();
|
||||
this.parseHandle();
|
||||
}
|
||||
}
|
||||
|
29
src/handler/funcOper.js
Normal file
29
src/handler/funcOper.js
Normal file
@ -0,0 +1,29 @@
|
||||
module.exports = function() {
|
||||
let data;
|
||||
function init(defData = {}) {
|
||||
data = { ...defData };
|
||||
}
|
||||
init();
|
||||
return {
|
||||
setFunc(key, val, isNotCover = false) {
|
||||
if (key.indexOf('G_') === 0) isNotCover = true;
|
||||
if (isNotCover && key in data) throw Error(`数据键${key}重复定义`);
|
||||
data[key] = val;
|
||||
return val;
|
||||
},
|
||||
getFunc(key, automake = false) {
|
||||
if (!(key in data)) {
|
||||
if (automake) {
|
||||
data[key] = () => key;
|
||||
} else {
|
||||
throw Error(`数据键${key}未定义`);
|
||||
}
|
||||
}
|
||||
return data[key]
|
||||
},
|
||||
getAllFunc() {
|
||||
return data;
|
||||
},
|
||||
init,
|
||||
}
|
||||
}
|
46
src/handler/globalVarible.js
Normal file
46
src/handler/globalVarible.js
Normal file
@ -0,0 +1,46 @@
|
||||
const _merge = require('lodash/merge');
|
||||
const _chunk = require('lodash/chunk');
|
||||
const _get = require('lodash/get');
|
||||
|
||||
const cache = {};
|
||||
|
||||
class GlobalVarible {
|
||||
get cp0() {
|
||||
return cache.cp0;
|
||||
}
|
||||
get cp0_96() {
|
||||
return (idx, cur) => {
|
||||
const isIdxNum = typeof idx === 'number';
|
||||
const isCurNum = typeof cur === 'number';
|
||||
if (isIdxNum && isCurNum) return _get(cache, `cp0_96.${idx}.${cur}`);
|
||||
if (isIdxNum) return _get(cache, `cp0_96.${idx}`);
|
||||
return cache.cp0_96
|
||||
}
|
||||
}
|
||||
get cp2() {
|
||||
return cache.cp2;
|
||||
}
|
||||
get cp6() {
|
||||
return cache.cp6;
|
||||
}
|
||||
get ts() {
|
||||
// 返回$_ts
|
||||
return cache.ts;
|
||||
}
|
||||
get r2mka() {
|
||||
// 返回获取任务对象的方法,为空时返回任务树
|
||||
return cache.r2mka;
|
||||
}
|
||||
get keys() {
|
||||
// 返回密钥集合
|
||||
return cache.keys;
|
||||
}
|
||||
setAttr(attr, value) {
|
||||
cache[attr] = value;
|
||||
if (attr === 'cp0') {
|
||||
cache.cp0_96 = _chunk(value, 96);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new GlobalVarible();
|
12
src/handler/parser/common/combine4.js
Normal file
12
src/handler/parser/common/combine4.js
Normal file
@ -0,0 +1,12 @@
|
||||
// 将数字数组每四位通过位移运算生成新数字,最后组成数组返回
|
||||
// 入参数组的长度必须是4的倍数
|
||||
const gv = require('@src/handler/globalVarible');
|
||||
|
||||
module.exports = function(numarr) {
|
||||
const arr = new Array(numarr.length / gv.cp2[19]);
|
||||
for (let cursor = 0, idx = 0; cursor < numarr.length; cursor += 4, idx++) {
|
||||
arr[idx] = numarr[cursor] << gv.cp2[4] | numarr[cursor + 1] << gv.cp2[2] | numarr[cursor + 2] << gv.cp2[52] | numarr[cursor + 3];
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
55
src/handler/parser/common/decode.js
Normal file
55
src/handler/parser/common/decode.js
Normal file
@ -0,0 +1,55 @@
|
||||
const gv = require('@src/handler/globalVarible');
|
||||
|
||||
function trans(numarr) {
|
||||
const ans = [];
|
||||
const mark = '?'.charCodeAt();
|
||||
for (var idx = 0; idx < numarr.length; idx++) {
|
||||
const num = numarr[idx];
|
||||
let val;
|
||||
if (num < gv.cp2[37]) {
|
||||
val = num;
|
||||
} else if (num < gv.cp2[46]) {
|
||||
val = mark;
|
||||
} else if (num < gv.cp2[36]) {
|
||||
val = (num & gv.cp2[13]) << gv.cp2[55] | numarr[idx + 1] & gv.cp2[13];
|
||||
idx++;
|
||||
} else if (num < gv.cp2[7]) {
|
||||
val = (num & gv.cp2[31]) << gv.cp2[14] | (numarr[idx + 1] & gv.cp2[13]) << gv.cp2[55] | numarr[idx + gv.cp2[56]] & gv.cp2[13];
|
||||
idx += gv.cp2[56];
|
||||
} else if (num < gv.cp2[99]) {
|
||||
val = (num & gv.cp2[23]) << gv.cp2[9] | (numarr[idx + 1] & gv.cp2[13]) << gv.cp2[14] | (numarr[idx + gv.cp2[56]] & gv.cp2[13]) << gv.cp2[55] | numarr[idx + gv.cp2[58]] & gv.cp2[13];
|
||||
idx += gv.cp2[58];
|
||||
} else if (num < gv.cp2[148]) {
|
||||
val = mark;
|
||||
idx += gv.cp2[19];
|
||||
} else if (num < gv.cp2[171]) {
|
||||
val = mark;
|
||||
idx += gv.cp2[29];
|
||||
} else {
|
||||
val = mark;
|
||||
}
|
||||
if (val > gv.cp2[25]) {
|
||||
val -= gv.cp2[26];
|
||||
ans.push((val >> gv.cp2[0]) + gv.cp2[187], val % gv.cp2[63] + gv.cp2[160]);
|
||||
} else {
|
||||
ans.push(val);
|
||||
}
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
function join(numarr, start = 0, end = numarr.length) {
|
||||
const ans = new Array(Math.ceil(numarr.length / gv.cp2[120]));
|
||||
let idx = 0;
|
||||
while (start < end - gv.cp2[120]) {
|
||||
ans[idx++] = String.fromCharCode(...numarr.slice(start, start += gv.cp2[120]));
|
||||
}
|
||||
if (start < end) {
|
||||
ans[idx++] = String.fromCharCode(...numarr.slice(start, end));
|
||||
}
|
||||
return ans.join('');
|
||||
}
|
||||
|
||||
module.exports = function(numarr) {
|
||||
return join(trans(numarr));
|
||||
}
|
30
src/handler/parser/common/decrypt.js
Normal file
30
src/handler/parser/common/decrypt.js
Normal file
@ -0,0 +1,30 @@
|
||||
const gv = require('@src/handler/globalVarible');
|
||||
|
||||
let datas = undefined;
|
||||
|
||||
module.exports = function(str) {
|
||||
if (!datas) {
|
||||
datas = gv.cp0_96(7, 41).split('').reduce((ans, key, idx) => {
|
||||
const code = key.charCodeAt()
|
||||
ans[0][code] = idx << gv.cp2[56];
|
||||
ans[1][code] = idx >> gv.cp2[19];
|
||||
ans[2][code] = (idx & gv.cp2[31]) << gv.cp2[19];
|
||||
ans[3][code] = idx >> gv.cp2[56];
|
||||
ans[4][code] = (idx & gv.cp2[58]) << gv.cp2[55];
|
||||
ans[5][code] = idx;
|
||||
return ans
|
||||
}, [{}, {}, {}, {}, {}, { ...new Array(255).fill(-1) }])
|
||||
}
|
||||
const [data1, data2, data3, data4, data5, data6] = datas;
|
||||
const ans = []
|
||||
for(let i = 0; i < str.length; i += 4) {
|
||||
let [one, two, three, four] = [0, 1, 2, 3].map(it => {
|
||||
if (i + it >= str.length) return undefined
|
||||
return str[i + it].charCodeAt()
|
||||
})
|
||||
two !== undefined && ans.push(data1[one] | data2[two])
|
||||
three !== undefined && ans.push(data3[two] | data4[three])
|
||||
four !== undefined && ans.push(data5[three] | data6[four])
|
||||
}
|
||||
return ans
|
||||
}
|
37
src/handler/parser/common/encrypt.js
Normal file
37
src/handler/parser/common/encrypt.js
Normal file
@ -0,0 +1,37 @@
|
||||
// 加密两个数组生成新数组
|
||||
const combine4 = require('./combine4');
|
||||
const gv = require('@src/handler/globalVarible');
|
||||
|
||||
module.exports = function (numarr1, numarr2) {
|
||||
const arr = new Array(numarr1.length - gv.cp2[52]);
|
||||
const comb1 = combine4(numarr1);
|
||||
const comb2 = combine4(numarr2);
|
||||
let first = comb1[0];
|
||||
let second = comb1[1];
|
||||
let current, next, temp;
|
||||
let cursor = 0;
|
||||
for (let idx = gv.cp2[56]; idx < comb1.length - 1; cursor += 8, idx += 2) {
|
||||
current = comb1[idx];
|
||||
next = comb1[idx + 1];
|
||||
temp = gv.cp2[132];
|
||||
for (let i = 0; i < gv.cp2[48]; ++i) {
|
||||
next = next - ((current << gv.cp2[19] ^ current >> gv.cp2[29] & gv.cp2[12]) + current ^ temp + comb2[temp >> gv.cp2[57] & gv.cp2[105] & gv.cp2[58]]) & gv.cp2[17];
|
||||
temp = temp - gv.cp2[66] & gv.cp2[17];
|
||||
current = current - ((next << gv.cp2[19] ^ next >> gv.cp2[29] & gv.cp2[12]) + next ^ temp + comb2[temp & gv.cp2[58]]) & gv.cp2[17];
|
||||
}
|
||||
first = current ^ first;
|
||||
second = next ^ second;
|
||||
arr[cursor] = first >> gv.cp2[4] & gv.cp2[34];
|
||||
arr[cursor + 1] = first >> gv.cp2[2] & gv.cp2[34];
|
||||
arr[cursor + 2] = first >> gv.cp2[52] & gv.cp2[34];
|
||||
arr[cursor + 3] = first & gv.cp2[34];
|
||||
arr[cursor + 4] = second >> gv.cp2[4] & gv.cp2[34];
|
||||
arr[cursor + 5] = second >> gv.cp2[2] & gv.cp2[34];
|
||||
arr[cursor + 6] = second >> gv.cp2[52] & gv.cp2[34];
|
||||
arr[cursor + 7] = second & gv.cp2[34];
|
||||
first = comb1[idx];
|
||||
second = comb1[idx + 1];
|
||||
}
|
||||
arr.splice(cursor - arr[cursor - 1], arr[cursor - 1]);
|
||||
return arr;
|
||||
}
|
26
src/handler/parser/common/extrace.js
Normal file
26
src/handler/parser/common/extrace.js
Normal file
@ -0,0 +1,26 @@
|
||||
// 数组中提取数据
|
||||
const gv = require('@src/handler/globalVarible');
|
||||
|
||||
function getLens(numarr, idx) {
|
||||
const item = numarr[idx];
|
||||
if ((item & gv.cp2[37]) === 0) return item;
|
||||
if ((item & gv.cp2[46]) == gv.cp2[37]) return (item & gv.cp2[13]) << gv.cp2[52] | numarr[idx + 1];
|
||||
if ((item & gv.cp2[36]) == gv.cp2[46]) return (item & gv.cp2[1]) << gv.cp2[2] | numarr[idx + 1] << gv.cp2[52] | numarr[idx + 2];
|
||||
if ((item & gv.cp2[7]) == gv.cp2[36]) return (item & gv.cp2[31]) << gv.cp2[4] | numarr[idx + 1] << gv.cp2[2] | numarr[idx + 2] << gv.cp2[52] | numarr[idx + 3];
|
||||
if ((item & gv.cp2[99]) == gv.cp2[7]) return (numarr[idx + 1] << gv.cp2[4] | numarr[idx + 2] << gv.cp2[2] | numarr[idx + 3] << gv.cp2[52] | numarr[idx + 4]) >>> 0;
|
||||
return item;
|
||||
}
|
||||
|
||||
module.exports = function (numarr) {
|
||||
const arr = [];
|
||||
for(let i = 1; i < numarr.length; i++) {
|
||||
const len = getLens(numarr, i);
|
||||
if (len === 0) {
|
||||
arr.push([]);
|
||||
} else {
|
||||
arr.push(numarr.slice(i + 1, i + 1 + len));
|
||||
i += len;
|
||||
}
|
||||
}
|
||||
return arr;
|
||||
}
|
8
src/handler/parser/common/hexnum.js
Normal file
8
src/handler/parser/common/hexnum.js
Normal file
@ -0,0 +1,8 @@
|
||||
// 16进制数组拼接的数字转字符
|
||||
module.exports = function(str) {
|
||||
const arr = [];
|
||||
for (let i = 0; i < str.length; i += 2) {
|
||||
arr.push(parseInt(str.substr(i, 2), 16));
|
||||
}
|
||||
return String.fromCharCode(...arr);
|
||||
}
|
9
src/handler/parser/common/index.js
Normal file
9
src/handler/parser/common/index.js
Normal file
@ -0,0 +1,9 @@
|
||||
exports.main = require('./main');
|
||||
exports.swap = require('./swap');
|
||||
exports.hexnum = require('./hexnum');
|
||||
exports.combine4 = require('./combine4');
|
||||
exports.encrypt = require('./encrypt');
|
||||
exports.decrypt = require('./decrypt');
|
||||
exports.extrace = require('./extrace');
|
||||
exports.decode = require('./decode');
|
||||
|
19
src/handler/parser/common/main.js
Normal file
19
src/handler/parser/common/main.js
Normal file
@ -0,0 +1,19 @@
|
||||
// 将字符串解码成字符数组
|
||||
module.exports = function(str) {
|
||||
if (!str) return [];
|
||||
const splitStr = String.fromCharCode(96);
|
||||
const ans = []
|
||||
const firstCode = str.charCodeAt(0) - 97;
|
||||
for (let idx = 1; idx < str.length; ++idx) {
|
||||
let curr = str.charCodeAt(idx);
|
||||
if (curr >= 40 && curr < 92) {
|
||||
curr += firstCode;
|
||||
if (curr >= 92) curr -= 52;
|
||||
} else if (curr >= 97 && curr < 127) {
|
||||
curr += firstCode;
|
||||
if(curr >= 127) curr -= 30;
|
||||
}
|
||||
ans[idx - 1] = curr;
|
||||
}
|
||||
return String.fromCharCode(...ans).split(splitStr);
|
||||
}
|
10
src/handler/parser/common/swap.js
Normal file
10
src/handler/parser/common/swap.js
Normal file
@ -0,0 +1,10 @@
|
||||
// 字符交换方式解码字符串
|
||||
module.exports = function (str) {
|
||||
const arr = str.split('');
|
||||
for (let idx = str.length - 4; idx >= 0; idx -= 4) {
|
||||
[arr[idx], arr[idx + 1], arr[idx + 3], arr[idx + 2]] =
|
||||
[arr[idx + 1], arr[idx + 3], arr[idx + 2], arr[idx]];
|
||||
}
|
||||
return arr.join('');
|
||||
}
|
||||
|
14
src/handler/parser/common/temp.js
Normal file
14
src/handler/parser/common/temp.js
Normal file
@ -0,0 +1,14 @@
|
||||
// 用于将ascii码数组转字符后拼接
|
||||
const gv = require('../globalVarible');
|
||||
|
||||
module.exports = function (numarr, start = 0, end = numarr.length) {
|
||||
const arr = new Array(Math.ceil(numarr.length / gv.cp2[120]));
|
||||
const idx = 0;
|
||||
while (start < end - gv.cp2[120]) {
|
||||
arr[idx++] = String.fromCharCode(...numarr.slice(start, start += gv.cp2[120]));
|
||||
}
|
||||
if (start < end) {
|
||||
arr[idx++] = String.fromCharCode(...numarr.slice(start, end));
|
||||
}
|
||||
return arr.join('')
|
||||
}
|
32
src/handler/parser/decrypt.js
Normal file
32
src/handler/parser/decrypt.js
Normal file
@ -0,0 +1,32 @@
|
||||
const gv = require('../globalVarible');
|
||||
|
||||
const getTimeFlag = (time) => {
|
||||
return [
|
||||
time >>> gv.cp2[4] & gv.cp2[34],
|
||||
time >>> gv.cp2[2] & gv.cp2[34],
|
||||
time >>> gv.cp2[52] & gv.cp2[34],
|
||||
time & gv.cp2[34]
|
||||
];
|
||||
}
|
||||
|
||||
const restoreTimeFlag = (timeFlag) => {
|
||||
return timeFlag[0] << gv.cp2[4] | timeFlag[1] << gv.cp2[2] | timeFlag[2] << gv.cp2[52] | timeFlag[3];
|
||||
}
|
||||
|
||||
exports.parse = function(numarr) {
|
||||
const now = Math.ceil(new Date().getTime() / 1000);
|
||||
const timeflag = [
|
||||
now >>> gv.cp2[4] & gv.cp2[34],
|
||||
now >>> gv.cp2[2] & gv.cp2[34],
|
||||
now >>> gv.cp2[52] & gv.cp2[34],
|
||||
now & gv.cp2[34]
|
||||
];
|
||||
const random = Math.ceil(Math.random() * gv.cp2[30]);
|
||||
const ans = [...numarr, ...timeflag].map(it => it ^ 33)
|
||||
ans.push(random);
|
||||
return ans
|
||||
|
||||
}
|
||||
|
||||
exports.init = function() {
|
||||
};
|
15
src/handler/parser/index.js
Normal file
15
src/handler/parser/index.js
Normal file
@ -0,0 +1,15 @@
|
||||
const gv = require('../globalVarible');
|
||||
const common = require('./common');
|
||||
|
||||
function init(ts) {
|
||||
gv.setAttr('ts', ts);
|
||||
require('./r2mka').init();
|
||||
require('./tscp').init();
|
||||
require('./tscd').init();
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
...common,
|
||||
init,
|
||||
}
|
||||
|
88
src/handler/parser/r2mka.js
Normal file
88
src/handler/parser/r2mka.js
Normal file
@ -0,0 +1,88 @@
|
||||
const gv = require('../globalVarible');
|
||||
const gt3 = require('@src/immutext/').globalText3;
|
||||
|
||||
function gtHandler(str, curr) {
|
||||
return {
|
||||
getCurr: function() {
|
||||
return curr;
|
||||
},
|
||||
getCode: function() {
|
||||
return str.charCodeAt(curr++);
|
||||
},
|
||||
getLine: function() {
|
||||
const end = this.getCode();
|
||||
if (end === 0) return '';
|
||||
const ans = str.substr(curr, end);
|
||||
curr += end;
|
||||
return ans;
|
||||
},
|
||||
getList: function() {
|
||||
const ans = this.getLine()
|
||||
if (!ans) return [];
|
||||
return ans.split(String.fromCharCode(255));
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const parse = (() => {
|
||||
let count = 0;
|
||||
const valMap = {};
|
||||
return function(val, deep = 0, deeps = [0]) {
|
||||
const str = val.taskstr;
|
||||
val.taskstr = str;
|
||||
val.val = {};
|
||||
if (!str) {
|
||||
val.taskarr = [];
|
||||
} else {
|
||||
val.taskarr = str.split('').map(it => it.charCodeAt());
|
||||
}
|
||||
val.key = `${deeps.join('>')}-${count++}`;
|
||||
valMap[val.key] = val;
|
||||
val.child_one.map((it, idx) => {
|
||||
if (it) {
|
||||
parse(it, deep + 1, [...deeps, 'one', idx]);
|
||||
}
|
||||
});
|
||||
val.child_two.map((it, idx) => {
|
||||
if (it) {
|
||||
parse(it, deep + 1, [...deeps, 'two', idx]);
|
||||
}
|
||||
});
|
||||
return (key) => {
|
||||
if (!key) return val;
|
||||
return valMap[key];
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
exports.parse = function(str = gt3) {
|
||||
const r2mka_len = 'r2mka'.length;
|
||||
const flag = str.charAt(r2mka_len) === '1';
|
||||
const gt = gtHandler(str, r2mka_len + 1);
|
||||
function deepParse() {
|
||||
const ans = {
|
||||
lens: gt.getCode(), // 当isReset为否时或者循环开始入口,设置入参数组的长度
|
||||
isReset: gt.getCode(), // 标志位,标记是否重置循环参数
|
||||
taskstr: gt.getLine(), // 循环的下标取值来源
|
||||
}
|
||||
let curr = gt.getCode();
|
||||
ans.child_one = new Array(curr + 2);
|
||||
for (let i = 0; i < curr; i++) {
|
||||
ans.child_one[i + 2] = deepParse();
|
||||
}
|
||||
curr = gt.getCode();
|
||||
ans.child_two = new Array(curr);
|
||||
for (let i = 0; i < curr; i++) {
|
||||
ans.child_two[i] = deepParse();
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
gt.getList().concat(gt.getList()); // 未发现用处
|
||||
const windowIdx = gt.getCode(); // 首次循环入参配置,window变量存储下标
|
||||
const resourceIdx = gt.getCode(); // 首次循环如参配置,资源变量存储下标
|
||||
return parse(deepParse());
|
||||
};
|
||||
|
||||
exports.init = function() {
|
||||
gv.setAttr('r2mka', exports.parse(gt3));
|
||||
}
|
21
src/handler/parser/tscd.js
Normal file
21
src/handler/parser/tscd.js
Normal file
@ -0,0 +1,21 @@
|
||||
// 生成密钥
|
||||
const gv = require('../globalVarible');
|
||||
const decrypt = require('./common/decrypt');
|
||||
|
||||
exports.init = function() {
|
||||
const cdArr = decrypt(gv.ts.cd);
|
||||
const start = gv.r2mka('0>one>23-25').taskarr[9] + 2;
|
||||
const end = (cdArr[0] << 8 | cdArr[1]) + 2;
|
||||
const one = cdArr.slice(start, end); // arr127
|
||||
const offset = [1, 153, 3, 3, 4, 2, 6, 4];
|
||||
const ans = cdArr.slice(end).map((item, idx) => { // arr1575
|
||||
return item ^ offset[idx % gv.cp2[52]];
|
||||
})
|
||||
const keys = []
|
||||
for (let i = 0, op = 1; i < ans[0]; i ++) {
|
||||
const gap = ans[op++] << 8 | ans[op++];
|
||||
keys.push(ans.slice(op, op + gap));
|
||||
op += gap;
|
||||
}
|
||||
gv.setAttr('keys', keys);
|
||||
};
|
9
src/handler/parser/tscp.js
Normal file
9
src/handler/parser/tscp.js
Normal file
@ -0,0 +1,9 @@
|
||||
// 将加密的字符串解密并切割成数组
|
||||
const gv = require('../globalVarible');
|
||||
const parse = require('./common/main');
|
||||
|
||||
exports.init = function() {
|
||||
gv.setAttr('cp0', parse(gv.ts.cp[0]));
|
||||
gv.setAttr('cp2', parse(gv.ts.cp[2]).map(Number));
|
||||
gv.setAttr('cp6', parse(gv.ts.cp[6]));
|
||||
}
|
File diff suppressed because one or more lines are too long
35
test/cp0_96.test.js
Normal file
35
test/cp0_96.test.js
Normal file
@ -0,0 +1,35 @@
|
||||
const paths = require('@utils/paths');
|
||||
const fs = require('fs');
|
||||
const { main, swap, hexnum, init } = require('../src/handler/parser/');
|
||||
const tsFullPath = paths.exampleResolve('codes', '1-$_ts-full.json');
|
||||
init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8')));
|
||||
const gv = require('@src/handler/globalVarible');
|
||||
/*
|
||||
setData('G_$cc', cp0[0]);
|
||||
setData('G_$ia', cp0[1]);
|
||||
setData('G_$ga', cp0[2]);
|
||||
setData('G_$_7', cp0[3]);
|
||||
setData('G_$_3', cp0[4]);
|
||||
setData('G_$jY', cp0[5]);
|
||||
setData('G_$ad', cp0[6]);
|
||||
setData('G_$bJ', cp0[7]);
|
||||
setData('G_$eh', cp0[8]);
|
||||
setData('G_$bv', cp0[9]);
|
||||
setData('G_$bO', cp0[10]);
|
||||
setData('G_$_x', cp0[11]);
|
||||
setData('G_$dL', cp0[12]);
|
||||
setData('G_$bn', cp0[13]);
|
||||
*/
|
||||
|
||||
const valueMap = {
|
||||
'visibilityState': main(gv.cp0_96(6, 69)).join(),
|
||||
'parseFloat': swap(gv.cp0_96(5, 18)) + hexnum(gv.cp0_96(8, 30)),
|
||||
'11.678': hexnum(gv.cp0_96(7, 17)),
|
||||
'1.234': swap(gv.cp0_96(8, 36)),
|
||||
}
|
||||
|
||||
test('test cp0_96', () => {
|
||||
Object.entries(valueMap).forEach(([tb, ex]) => {
|
||||
expect(tb).toBe(ex);
|
||||
})
|
||||
});
|
35
test/parser.test.js
Normal file
35
test/parser.test.js
Normal file
@ -0,0 +1,35 @@
|
||||
const paths = require('@utils/paths');
|
||||
const fs = require('fs');
|
||||
const { main, swap, hexnum, combine4, decrypt, encrypt, extrace, init, decode } = require('../src/handler/parser/');
|
||||
const tsFullPath = paths.exampleResolve('codes', '1-$_ts-full.json');
|
||||
init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8')));
|
||||
const gv = require('@src/handler/globalVarible');
|
||||
|
||||
describe('test parser common', () => {
|
||||
test('test main', () => {
|
||||
expect(main('inakaxadalqKlwl{')[0]).toBe('visibilityState');
|
||||
});
|
||||
test('test swap', () => {
|
||||
expect(swap('rpsa')).toBe('pars');
|
||||
});
|
||||
test('test hexnum', () => {
|
||||
expect(hexnum('65466c6f6174')).toBe('eFloat');
|
||||
});
|
||||
test('test combine4', () => {
|
||||
expect(combine4(gv.keys[17])).toEqual([1052594159, -1469862260, 26804995, 67241476]);
|
||||
});
|
||||
test('test decrypt', () => {
|
||||
expect(decrypt('GGZGPQnkMJBUeWs2sLstGIr6oLYDI3AX')).toEqual([130, 15, 32, 137, 204, 131, 108, 219, 215, 244, 196, 229, 78, 132, 202, 129, 240, 119, 30, 133, 70, 125, 132, 46]);
|
||||
});
|
||||
test('test encrypt', () => {
|
||||
expect(encrypt(decrypt('GGZGPQnkMJBUeWs2sLstGIr6oLYDI3AX'), gv.keys[17])).toEqual([7, 0, 0, 6, 47, 115, 103, 116, 109, 105, 0, 0, 0, 0]);
|
||||
});
|
||||
test('test extrace', () => {
|
||||
const arr = encrypt(decrypt('GGZGPQnkMJBUeWs2sLstGIr6oLYDI3AX'), gv.keys[17]);
|
||||
expect(extrace(arr)).toEqual([[], [], [47, 115, 103, 116, 109, 105], [], [], [], []]);
|
||||
});
|
||||
test('test extrace', () => {
|
||||
const arr = extrace(encrypt(decrypt('GGZGPQnkMJBUeWs2sLstGIr6oLYDI3AX'), gv.keys[17]));
|
||||
expect(decode(arr[2])).toBe('/sgtmi');
|
||||
});
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user