mirror of
https://github.com/pysunday/rs-reverse.git
synced 2025-04-20 02:34: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 dataOper = require('./dataOper');
|
||||||
const _chunk = require('lodash/chunk');
|
const _chunk = require('lodash/chunk');
|
||||||
const jsdom = require("jsdom");
|
const parser = require('./parser/');
|
||||||
const { JSDOM } = jsdom;
|
const gv = require('./globalVarible');
|
||||||
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;
|
|
||||||
|
|
||||||
module.exports = class {
|
module.exports = class {
|
||||||
constructor(ts) {
|
constructor(ts) {
|
||||||
this.startTime = new Date().getTime();
|
parser.init(ts)
|
||||||
window.$_ts = ts
|
|
||||||
this.opdata = dataOper()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
parseCpCommon(data) {
|
parseHandle() {
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
run() {
|
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