mirror of
https://github.com/pysunday/rs-reverse.git
synced 2025-04-12 03:46:56 +08:00
feat: key iv value logic optimization, addition of dynamic code execution mechanism
This commit is contained in:
parent
96068ddc28
commit
fe2577e51f
12
main.js
12
main.js
@ -118,12 +118,20 @@ module.exports = yargs
|
||||
type: 'string',
|
||||
demandOption: true,
|
||||
},
|
||||
f: {
|
||||
alias: 'file',
|
||||
describe: '拥有完整$_ts的json文件',
|
||||
type: 'string',
|
||||
coerce: (input) => {
|
||||
if (['1', '2'].includes(input)) return paths.exampleResolve(`codes/${input}-\$_ts-full.json`);
|
||||
return input;
|
||||
}
|
||||
},
|
||||
},
|
||||
handler: commandHandler.bind(null, makeCookie),
|
||||
handler: (argv) => {
|
||||
debugLog(argv.level);
|
||||
Math.random = () => 0.1253744220839037;
|
||||
const gv = require('@utils/initGv');
|
||||
const gv = require('@utils/initGv')(argv.file);
|
||||
Object.assign(global, gv.utils);
|
||||
const output = JSON.stringify(eval(argv.code));
|
||||
console.log([`\n 输入:${argv.code}`, `输出:${output}\n`].join('\n '));
|
||||
|
@ -29,7 +29,6 @@
|
||||
},
|
||||
"author": "pysunday",
|
||||
"license": "ISC",
|
||||
"tsfile": "1-$_ts-full.json",
|
||||
"dependencies": {
|
||||
"cheerio": "^1.0.0-rc.12",
|
||||
"jest": "^29.7.0",
|
||||
|
639
src/handler/parser/common/dynamicExec.js
Normal file
639
src/handler/parser/common/dynamicExec.js
Normal file
@ -0,0 +1,639 @@
|
||||
const gv = require('@src/handler/globalVarible');
|
||||
const monitor = require('@utils/monitor');
|
||||
const logger = require('@utils/logger');
|
||||
|
||||
module.exports = function(...params) {
|
||||
logger.info('执行开始!');
|
||||
try {
|
||||
return dynamicExec(...params);
|
||||
} catch (err) {
|
||||
logger.error(String(err));
|
||||
process.exit();
|
||||
} finally {
|
||||
logger.info('执行结束!');
|
||||
}
|
||||
}
|
||||
|
||||
function dynamicExec(task, start = 0, args = [], loop_res = [], global_res = []) {
|
||||
args = monitor(args, 'args', { getLog: true, setLog: true });
|
||||
loop_res = monitor(loop_res, 'loop_res', { getLog: true, setLog: true, getCb: (key) => {if(['81', '83'].includes(key))debugger}});
|
||||
global_res = monitor(global_res, 'global_res', { getLog: true, setLog: true });
|
||||
if (typeof task === 'string') task = gv.r2mka(task).taskarr;
|
||||
console.log(`动态代码运行,任务列表:${task}, 起点:${start},长度:${task.length}`);
|
||||
const data = [];
|
||||
const ret = [];
|
||||
ret[0] = args;
|
||||
ret[2] = [
|
||||
'window、',
|
||||
args,
|
||||
];
|
||||
let target, tarkey, d_cursor = 0, temp1, temp2, temp3, temp4, t_cursor;
|
||||
let runtimes = 0;
|
||||
const len = task.length;
|
||||
const notCheckTask = [11, 15, 27, 32, 48, 51, 59, 84, 104, 109];
|
||||
for (t_cursor = start; t_cursor < len; t_cursor++) {
|
||||
// console.log(`${notCheckTask.includes(task[t_cursor]) ? '[no]' : '[ok]'}【${++runtimes}, ${t_cursor}】运行 case(${task[t_cursor]})`);
|
||||
switch (task[t_cursor]) {
|
||||
case 0:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] * temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 1:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] & temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 2:
|
||||
data[d_cursor++] = ret[0][task[++t_cursor]];
|
||||
break;
|
||||
case 3:
|
||||
data[d_cursor++] = true;
|
||||
break;
|
||||
case 4:
|
||||
tarkey = task[++t_cursor];
|
||||
temp1 = data[--d_cursor];
|
||||
!temp1 ? (t_cursor += tarkey, ++d_cursor) : 0;
|
||||
break;
|
||||
case 5:
|
||||
temp1 = data[--d_cursor];
|
||||
setTarget();
|
||||
temp1 = target[tarkey] |= temp1;
|
||||
break;
|
||||
case 6:
|
||||
data[d_cursor++] = ret[2][task[++t_cursor]];
|
||||
break;
|
||||
case 7:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] !== temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 8:
|
||||
d_cursor -= 2;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
data[d_cursor++] = target(data[temp1], data[temp1 + 1]);
|
||||
break;
|
||||
case 9:
|
||||
d_cursor--;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
data[d_cursor++] = target(data[temp1]);
|
||||
break;
|
||||
case 10:
|
||||
temp2 = task[++t_cursor];
|
||||
t_cursor += temp2;
|
||||
break;
|
||||
case 11:
|
||||
// temp3 = task[++t_cursor];
|
||||
// data[d_cursor++] = ret[3][temp3][task[++t_cursor]];
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 12:
|
||||
return data[--d_cursor];
|
||||
case 13:
|
||||
d_cursor -= 3;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
console.log(target);
|
||||
target = target[tarkey];
|
||||
temp1 = target(data[temp1], data[temp1 + 1], data[temp1 + 2]);
|
||||
break;
|
||||
case 14:
|
||||
temp2 = task[++t_cursor];
|
||||
t_cursor -= temp2;
|
||||
break;
|
||||
case 15:
|
||||
// temp3 = task[++t_cursor];
|
||||
// data[d_cursor++] = ret[1][temp3][task[++t_cursor]];
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 16:
|
||||
d_cursor--;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
temp1 = target[tarkey](data[temp1]);
|
||||
break;
|
||||
case 17:
|
||||
d_cursor--;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
data[d_cursor++] = target[tarkey](data[temp1]);
|
||||
break;
|
||||
case 18:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] in temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 19:
|
||||
temp1 = data[--d_cursor];
|
||||
target = data[d_cursor - 1];
|
||||
target[keycodes[task[++t_cursor]]] = temp1;
|
||||
break;
|
||||
case 20:
|
||||
data[d_cursor++] = [];
|
||||
break;
|
||||
case 21:
|
||||
task[t_cursor] = 26;
|
||||
tarkey = task[++t_cursor];
|
||||
temp1 = keycodes[tarkey];
|
||||
task[t_cursor] = temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 22:
|
||||
temp1 = data[--d_cursor];
|
||||
setTarget();
|
||||
temp1 = target[tarkey] += temp1;
|
||||
break;
|
||||
case 23:
|
||||
data[d_cursor++] = loop_res[task[++t_cursor]];
|
||||
break;
|
||||
case 24:
|
||||
tarkey = data[--d_cursor];
|
||||
target = data[--d_cursor];
|
||||
break;
|
||||
case 25:
|
||||
temp1 = data[--d_cursor];
|
||||
setTarget();
|
||||
target[tarkey] = temp1;
|
||||
break;
|
||||
case 26:
|
||||
data[d_cursor++] = task[++t_cursor];
|
||||
break;
|
||||
case 27:
|
||||
// temp3 = task[++t_cursor];
|
||||
// tarkey = task[++t_cursor];
|
||||
// target = ret[3][temp3];
|
||||
break;
|
||||
case 28:
|
||||
setTarget();
|
||||
data[d_cursor++] = target[tarkey]();
|
||||
break;
|
||||
case 29:
|
||||
d_cursor -= 2;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
data[d_cursor++] = target[tarkey](data[temp1], data[temp1 + 1]);
|
||||
break;
|
||||
case 30:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] > temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 31:
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
data[d_cursor++] = target();
|
||||
break;
|
||||
case 32:
|
||||
// _$cG(_$$I, task[++t_cursor], task[++t_cursor], temp2 = task[++t_cursor], task[++t_cursor], t_cursor + 1, ret[2], ret);
|
||||
// ret[4] ? t_cursor = len : t_cursor += temp2;
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 33:
|
||||
tarkey = task[++t_cursor];
|
||||
target = ret[0];
|
||||
break;
|
||||
case 34:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] != temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 35:
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
temp1 = target();
|
||||
break;
|
||||
case 36:
|
||||
d_cursor--;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
temp1 = target(data[temp1]);
|
||||
break;
|
||||
case 37:
|
||||
task[t_cursor] = 92;
|
||||
tarkey = keywords[task[++t_cursor]];
|
||||
task[t_cursor] = tarkey;
|
||||
target = data[--d_cursor];
|
||||
break;
|
||||
case 38:
|
||||
temp1 = data[--d_cursor];
|
||||
temp2 = task[++t_cursor];
|
||||
temp1 ? 0 : t_cursor += temp2;
|
||||
break;
|
||||
case 39:
|
||||
tarkey = task[++t_cursor];
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 ? (t_cursor += tarkey, ++d_cursor) : 0;
|
||||
break;
|
||||
case 40:
|
||||
data[d_cursor++] = {};
|
||||
break;
|
||||
case 41:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] == temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 42:
|
||||
temp1 = data[--d_cursor];
|
||||
target = data[--d_cursor];
|
||||
data[d_cursor++] = target[temp1];
|
||||
break;
|
||||
case 43:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] < temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 44:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] === temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 45:
|
||||
data[d_cursor++] = global_res[task[++t_cursor]];
|
||||
break;
|
||||
case 46:
|
||||
task[t_cursor] = 87;
|
||||
tarkey = keywords[task[++t_cursor]];
|
||||
task[t_cursor] = tarkey;
|
||||
temp1 = data[--d_cursor];
|
||||
data[d_cursor++] = temp1[tarkey];
|
||||
break;
|
||||
case 47:
|
||||
d_cursor -= 2;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
temp1 = target(data[temp1], data[temp1 + 1]);
|
||||
break;
|
||||
case 48:
|
||||
// tarkey = task[++t_cursor];
|
||||
// data[d_cursor++] = _$_w(_$$I._$hW[tarkey], ret);
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 49:
|
||||
d_cursor -= 2;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
temp1 = target[tarkey](data[temp1], data[temp1 + 1]);
|
||||
break;
|
||||
case 50:
|
||||
temp1 = typeof data[--d_cursor];
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 51:
|
||||
// temp2 = task[++t_cursor];
|
||||
// temp4 = data.slice(d_cursor - temp2, d_cursor);
|
||||
// d_cursor -= temp2;
|
||||
// setTarget();
|
||||
// data[d_cursor++] = _$fH(target[tarkey], temp4);
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 52:
|
||||
temp1 = data[--d_cursor];
|
||||
target = data[d_cursor - 1];
|
||||
target[keywords[task[++t_cursor]]] = temp1;
|
||||
break;
|
||||
case 53:
|
||||
temp1 = data[--d_cursor];
|
||||
data[d_cursor++] = !temp1;
|
||||
break;
|
||||
case 54:
|
||||
tarkey = task[++t_cursor];
|
||||
target = loop_res;
|
||||
break;
|
||||
case 55:
|
||||
temp1 = target[tarkey]++;
|
||||
break;
|
||||
case 56:
|
||||
ret[4] = 2;
|
||||
t_cursor = len;
|
||||
break;
|
||||
case 57:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] - temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 58:
|
||||
data[d_cursor++] = false;
|
||||
break;
|
||||
case 59:
|
||||
// task[t_cursor] = 26;
|
||||
// tarkey = task[++t_cursor];
|
||||
// temp1 = _$kG[tarkey];
|
||||
// task[t_cursor] = temp1;
|
||||
// data[d_cursor++] = temp1;
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 60:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] + temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 61:
|
||||
temp1 = data[--d_cursor];
|
||||
target = data[d_cursor - 1];
|
||||
target.push(temp1);
|
||||
break;
|
||||
case 62:
|
||||
tarkey = task[++t_cursor];
|
||||
target = global_res;
|
||||
break;
|
||||
case 63:
|
||||
tarkey = task[++t_cursor];
|
||||
target = ret[2];
|
||||
break;
|
||||
case 64:
|
||||
break;
|
||||
case 65:
|
||||
task[t_cursor] = 87;
|
||||
tarkey = keycodes[task[++t_cursor]];
|
||||
task[t_cursor] = tarkey;
|
||||
temp1 = data[--d_cursor];
|
||||
data[d_cursor++] = temp1[tarkey];
|
||||
break;
|
||||
case 66:
|
||||
data[d_cursor++] = null;
|
||||
break;
|
||||
case 67:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] << temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 68:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] + temp1;
|
||||
break;
|
||||
case 69:
|
||||
d_cursor -= 5;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
data[d_cursor++] = target[tarkey](data[temp1], data[temp1 + 1], data[temp1 + 2], data[temp1 + 3], data[temp1 + 4]);
|
||||
break;
|
||||
case 70:
|
||||
data[d_cursor++] = target[tarkey]++;
|
||||
break;
|
||||
case 71:
|
||||
temp2 = task[++t_cursor];
|
||||
d_cursor -= temp2;
|
||||
temp4 = data.slice(d_cursor, d_cursor + temp2);
|
||||
setTarget();
|
||||
temp1 = target[tarkey].apply(target, temp4);
|
||||
break;
|
||||
case 72:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] % temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 73:
|
||||
data[d_cursor++] = ++target[tarkey];
|
||||
break;
|
||||
case 74:
|
||||
d_cursor -= 4;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
temp1 = target(data[temp1], data[temp1 + 1], data[temp1 + 2], data[temp1 + 3]);
|
||||
break;
|
||||
case 75:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] >= temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 76:
|
||||
temp1 = task[++t_cursor];
|
||||
break;
|
||||
case 77:
|
||||
temp1 = target[tarkey]--;
|
||||
break;
|
||||
case 78:
|
||||
tarkey = task[++t_cursor];
|
||||
temp1 = temp1[tarkey];
|
||||
break;
|
||||
case 79:
|
||||
d_cursor -= 3;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
data[d_cursor++] = target(data[temp1], data[temp1 + 1], data[temp1 + 2]);
|
||||
break;
|
||||
case 80:
|
||||
tarkey = task[++t_cursor];
|
||||
data[d_cursor++] = temp1[tarkey];
|
||||
break;
|
||||
case 81:
|
||||
d_cursor -= 4;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
data[d_cursor++] = target[tarkey](data[temp1], data[temp1 + 1], data[temp1 + 2], data[temp1 + 3]);
|
||||
break;
|
||||
case 82:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] <= temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 83:
|
||||
tarkey = task[++t_cursor];
|
||||
temp1 = data[--d_cursor];
|
||||
!temp1 ? t_cursor += tarkey : 0;
|
||||
break;
|
||||
case 84:
|
||||
// temp1 = data[--d_cursor];
|
||||
// tarkey = task[++t_cursor];
|
||||
// target = _$ke[tarkey];
|
||||
// temp2 = target[temp1];
|
||||
// temp2 == _$an ? temp2 = task[++t_cursor] : ++t_cursor;
|
||||
// t_cursor += temp2;
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 85:
|
||||
setTarget();
|
||||
temp1 = target[tarkey]();
|
||||
break;
|
||||
case 86:
|
||||
temp1 = delete target[tarkey];
|
||||
break;
|
||||
case 87:
|
||||
tarkey = task[++t_cursor];
|
||||
temp1 = data[--d_cursor];
|
||||
data[d_cursor++] = temp1[tarkey];
|
||||
break;
|
||||
case 88:
|
||||
temp1 = data[--d_cursor];
|
||||
data[d_cursor++] = ~temp1;
|
||||
break;
|
||||
case 89:
|
||||
temp1 = -data[--d_cursor];
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 90:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] >>> temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 91:
|
||||
temp1 = data[--d_cursor];
|
||||
setTarget();
|
||||
temp1 = target[tarkey] ^= temp1;
|
||||
break;
|
||||
case 92:
|
||||
tarkey = task[++t_cursor];
|
||||
target = data[--d_cursor];
|
||||
break;
|
||||
case 93:
|
||||
d_cursor -= 3;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
temp1 = target[tarkey](data[temp1], data[temp1 + 1], data[temp1 + 2]);
|
||||
break;
|
||||
case 94:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] / temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 95:
|
||||
d_cursor -= 3;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
data[d_cursor++] = target[tarkey](data[temp1], data[temp1 + 1], data[temp1 + 2]);
|
||||
break;
|
||||
case 96:
|
||||
d_cursor -= 4;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
temp1 = target[tarkey](data[temp1], data[temp1 + 1], data[temp1 + 2], data[temp1 + 3]);
|
||||
break;
|
||||
case 97:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] instanceof temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 98:
|
||||
temp1 = data[--d_cursor];
|
||||
setTarget();
|
||||
temp1 = target[tarkey] &= temp1;
|
||||
break;
|
||||
case 99:
|
||||
task[t_cursor] = 92;
|
||||
tarkey = keycodes[task[++t_cursor]];
|
||||
task[t_cursor] = tarkey;
|
||||
target = data[--d_cursor];
|
||||
break;
|
||||
case 100:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] | temp1
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 101:
|
||||
temp2 = task[++t_cursor], temp1 = data[--d_cursor], t_cursor++;
|
||||
t_cursor += temp2 - 1;
|
||||
break;
|
||||
case 102:
|
||||
temp1 = ++target[tarkey];
|
||||
break;
|
||||
case 103:
|
||||
temp1 = data[--d_cursor];
|
||||
setTarget();
|
||||
target[tarkey] = temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
case 104:
|
||||
// temp3 = task[++t_cursor];
|
||||
// tarkey = task[++t_cursor];
|
||||
// target = ret[1][temp3];
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 105:
|
||||
tarkey = task[++t_cursor];
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = temp1[tarkey];
|
||||
break;
|
||||
case 106:
|
||||
d_cursor -= 4;
|
||||
temp1 = d_cursor;
|
||||
setTarget();
|
||||
target = target[tarkey];
|
||||
data[d_cursor++] = target(data[temp1], data[temp1 + 1], data[temp1 + 2], data[temp1 + 3]);
|
||||
break;
|
||||
case 107:
|
||||
data[d_cursor++] = --target[tarkey];
|
||||
break;
|
||||
case 108:
|
||||
--d_cursor;
|
||||
target = data;
|
||||
tarkey = d_cursor;
|
||||
break;
|
||||
case 109:
|
||||
// temp2 = task[++t_cursor];
|
||||
// temp4 = data.slice(d_cursor - temp2, d_cursor);
|
||||
// d_cursor -= temp2;
|
||||
// setTarget();
|
||||
// temp1 = _$fH(target[tarkey], temp4);
|
||||
notCheckTask.push(task[t_cursor]);
|
||||
break;
|
||||
case 110:
|
||||
temp1 = data[--d_cursor];
|
||||
setTarget();
|
||||
temp1 = target[tarkey] -= temp1;
|
||||
break;
|
||||
case 111:
|
||||
temp1 = data[--d_cursor];
|
||||
temp1 = data[--d_cursor] ^ temp1;
|
||||
data[d_cursor++] = temp1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function setTarget() {
|
||||
let next = task[++t_cursor];
|
||||
if (next <= 24) {
|
||||
tarkey = data[--d_cursor];
|
||||
target = data[--d_cursor];
|
||||
} else if (next > 24 && next <= 27) {
|
||||
console.log(`[no] 设置关键对象与下标:${next}`)
|
||||
// temp3 = task[++t_cursor];
|
||||
// tarkey = task[++t_cursor];
|
||||
// target = ret[3][temp3];
|
||||
debugger;
|
||||
} else if (next > 27 && next <= 33) {
|
||||
tarkey = task[++t_cursor];
|
||||
target = ret[0];
|
||||
} else if (next > 33 && next <= 37) {
|
||||
task[t_cursor] = 92;
|
||||
tarkey = keywords[task[++t_cursor]];
|
||||
task[t_cursor] = tarkey;
|
||||
target = data[--d_cursor];
|
||||
} else if (next > 37 && next <= 54) {
|
||||
tarkey = task[++t_cursor];
|
||||
target = loop_res;
|
||||
} else if (next > 54 && next <= 62) {
|
||||
tarkey = task[++t_cursor];
|
||||
target = global_res;
|
||||
} else if (next > 62 && next <= 63) {
|
||||
tarkey = task[++t_cursor];
|
||||
target = ret[2];
|
||||
} else if (next > 63 && next <= 92) {
|
||||
tarkey = task[++t_cursor];
|
||||
target = data[--d_cursor];
|
||||
} else if (next > 92 && next <= 99) {
|
||||
task[t_cursor] = 92;
|
||||
tarkey = keycodes[task[++t_cursor]];
|
||||
task[t_cursor] = tarkey;
|
||||
target = data[--d_cursor];
|
||||
} else if (next > 99 && next <= 104) {
|
||||
console.log(`[no] 设置关键对象与下标:${next}`)
|
||||
// temp3 = task[++t_cursor];
|
||||
// tarkey = task[++t_cursor];
|
||||
// target = ret[1][temp3];
|
||||
debugger;
|
||||
} else {
|
||||
--d_cursor;
|
||||
target = data;
|
||||
tarkey = d_cursor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,5 +21,6 @@ module.exports = {
|
||||
numarrEncrypt: require('./numarrEncrypt'),
|
||||
numarr2string: require('./numarr2string'),
|
||||
numarrJoin: require('./numarrJoin'),
|
||||
dynamicExec: require('./dynamicExec'),
|
||||
}
|
||||
|
||||
|
@ -2,13 +2,76 @@
|
||||
const gv = require('../globalVarible');
|
||||
const decrypt = require('./common/decrypt');
|
||||
const logger = require('@utils/logger');
|
||||
const numToNumarr4 = require('./common/numToNumarr4');
|
||||
const dynamicExec = require('./common/dynamicExec');
|
||||
|
||||
function getValMaps() {
|
||||
let uid = gv.ts.cp[3];
|
||||
const ans = [];
|
||||
for (let i = 0; i < gv.cp2[19]; i++) {
|
||||
uid = gv.cp2[174] * (uid & gv.cp2[25]) + gv.cp2[135]
|
||||
ans.push(uid)
|
||||
}
|
||||
return numToNumarr4(ans);
|
||||
}
|
||||
|
||||
function parse(arr) {
|
||||
const len = arr.length;
|
||||
const valMap = getValMaps();
|
||||
let idx = 0;
|
||||
const task = [57, 132, 132, 132, 132, 132, 132].reverse();
|
||||
do {
|
||||
// 逻辑概率来源为:idx初始值为4,此处为idx += gv.cp2[2], 如果之后task有变可尝试固定为该逻辑
|
||||
idx += gv.cp2[gv.r2mka("0>one>5-5").taskarr[task.pop()]];
|
||||
const mod = idx % (len - idx > gv.cp2[2] ? gv.cp2[2] : len - idx);
|
||||
arr[mod + idx] ^= valMap[mod];
|
||||
} while (idx < len && task.length);
|
||||
return arr;
|
||||
}
|
||||
|
||||
function getTaskarr(arr, idx, ans = []) {
|
||||
if (idx >= arr.length) return;
|
||||
const start = idx + 1;
|
||||
const end = start + arr[idx];
|
||||
ans.push(arr.slice(start, end));
|
||||
getTaskarr(arr, end + 2, ans);
|
||||
return ans;
|
||||
}
|
||||
|
||||
|
||||
function getOffset(arr) {
|
||||
const [task0, task1, task2, task3] = getTaskarr(arr, arr[3]);
|
||||
console.log([task0, task1, task3]);
|
||||
const l81 = gv.r2mka("0-0").taskarr[42] + gv.cp2[56];
|
||||
const l83 = (gv.cp0_96(1, gv.r2mka("0-0").taskarr[57]).charCodeAt() + l81) * l81;
|
||||
const offset = dynamicExec('0>one>22-24', 0, undefined, {
|
||||
20: function(...params) {
|
||||
return dynamicExec(task0, 0, params, {
|
||||
8: function (...params) {
|
||||
return dynamicExec(task1, 0, params);
|
||||
}
|
||||
})
|
||||
},
|
||||
8: function(...params) {
|
||||
return dynamicExec(task1, 0, params);
|
||||
},
|
||||
10: function(...params) {
|
||||
return dynamicExec(task3, 0, params);
|
||||
},
|
||||
81: l81,
|
||||
83: l83,
|
||||
}, {
|
||||
59: gv.cp2,
|
||||
})
|
||||
return offset;
|
||||
}
|
||||
|
||||
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 end = (cdArr[0] << gv.cp2[52] | cdArr[1]) + start;
|
||||
const one = parse(cdArr.slice(start, end)); // arr127
|
||||
const offset = getOffset(one);
|
||||
const ans = cdArr.slice(end).map((item, idx) => { // arr1575
|
||||
return item ^ offset[idx % gv.cp2[52]];
|
||||
})
|
||||
|
@ -1,7 +1,7 @@
|
||||
const Coder = require('./handler/Coder');
|
||||
const paths = require('@utils/paths');
|
||||
const logger = require('@utils/logger');
|
||||
const fs = require('fs');
|
||||
const logger = require('@utils/logger');
|
||||
|
||||
module.exports = function (ts, immucfg) {
|
||||
const startTime = new Date().getTime();
|
||||
@ -9,28 +9,35 @@ module.exports = function (ts, immucfg) {
|
||||
const { code, $_ts } = coder.run();
|
||||
const files = [
|
||||
{
|
||||
name: 'input_ts',
|
||||
desc: '输入ts:',
|
||||
text: JSON.stringify(ts),
|
||||
},
|
||||
{
|
||||
name: 'output_ts',
|
||||
name: 'makecode_output_ts',
|
||||
desc: '输出ts:',
|
||||
text: JSON.stringify($_ts),
|
||||
extend: 'json',
|
||||
},
|
||||
{
|
||||
name: 'dynamic_code',
|
||||
desc: '动态代码:',
|
||||
name: 'makecode_output_code',
|
||||
desc: '输出动态代码:',
|
||||
text: code,
|
||||
extend: 'js',
|
||||
},
|
||||
].map(it => ({ ...it, filepath: paths.outputResolve(it.name) + '.js' }))
|
||||
immucfg ? {
|
||||
name: 'makecode_input_ts',
|
||||
desc: 'url方式提取的ts:',
|
||||
text: JSON.stringify(ts),
|
||||
extend: 'json',
|
||||
} : null,
|
||||
immucfg ? {
|
||||
name: 'makecode_input_immucfg',
|
||||
desc: 'url方式提取的静态文本:',
|
||||
text: JSON.stringify(immucfg),
|
||||
extend: 'json',
|
||||
} : null,
|
||||
].filter(Boolean).map(it => ({ ...it, filepath: `${paths.outputResolve(it.name)}.${it.extend}` }))
|
||||
if (!fs.existsSync(paths.outputPath)) fs.mkdirSync(paths.outputPath);
|
||||
files.forEach(({ filepath, text }) => fs.writeFileSync(filepath, text))
|
||||
logger.info([
|
||||
`生成动态代码成功!用时:${new Date().getTime() - startTime}ms\n`,
|
||||
`${files[0].desc}${files[1].filepath}`,
|
||||
`${files[1].desc}${files[1].filepath}`,
|
||||
`${files[2].desc}${files[2].filepath}\n`,
|
||||
...files.reduce((ans, it, idx) => ([...ans, `${it.desc}${it.filepath}${idx === files.length - 1 ? '\n' : ''}`]), []),
|
||||
].join('\n '));
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,8 @@ const logger = require('@utils/logger');
|
||||
const Coder = require('./handler/Coder');
|
||||
const Cookie = require('./handler/Cookie');
|
||||
const unescape = require('@utils/unescape');
|
||||
const paths = require('@utils/paths');
|
||||
const fs = require('fs');
|
||||
|
||||
function parseR2mka(text) {
|
||||
const start = text.indexOf('"') + 1;
|
||||
@ -9,7 +11,28 @@ function parseR2mka(text) {
|
||||
return unescape(text.substr(start, end));
|
||||
}
|
||||
|
||||
function writefile(ts, immucfg) {
|
||||
// 如果是url形式的则保存ts和immucfg
|
||||
const now = new Date().getTime();
|
||||
const files = [
|
||||
{
|
||||
name: `makecookie_url_ts_${now}`,
|
||||
desc: 'url方式提取的ts:',
|
||||
text: JSON.stringify(ts),
|
||||
},
|
||||
{
|
||||
name: `makecookie_url_immutext_${now}`,
|
||||
desc: 'url方式提取的静态文本:',
|
||||
text: JSON.stringify(immucfg),
|
||||
},
|
||||
].map(it => ({ ...it, filepath: paths.outputResolve(it.name) + '.json' }))
|
||||
if (!fs.existsSync(paths.outputPath)) fs.mkdirSync(paths.outputPath);
|
||||
files.forEach(({ filepath, text }) => fs.writeFileSync(filepath, text))
|
||||
logger.info('url方式保存文件:\n\n ' + files.reduce((ans, it, idx) => ([...ans, `${it.desc}${it.filepath}${idx === files.length - 1 ? '\n' : ''}`]), []).join('\n '));
|
||||
}
|
||||
|
||||
module.exports = function (ts, immucfg) {
|
||||
if (immucfg) writefile(ts, immucfg);
|
||||
const startTime = new Date().getTime();
|
||||
const coder = new Coder(ts, immucfg);
|
||||
const { code, $_ts } = coder.run();
|
||||
|
@ -1,4 +1,4 @@
|
||||
const gv = require('../utils/initGv');
|
||||
const gv = require('../utils/initGv')();
|
||||
const { main, swap4, swap2, hexnum, init } = gv.utils;
|
||||
/*
|
||||
setData('G_$cc', cp0[0]);
|
||||
|
@ -1,4 +1,4 @@
|
||||
const gv = require('../utils/initGv');
|
||||
const gv = require('../utils/initGv')();
|
||||
const {
|
||||
main,
|
||||
swap4,
|
||||
|
@ -1,4 +1,4 @@
|
||||
const gv = require('../utils/initGv');
|
||||
const gv = require('../utils/initGv')();
|
||||
const { ascii2string } = gv.utils;
|
||||
|
||||
const valueMap = {
|
||||
|
@ -1,12 +1,12 @@
|
||||
const paths = require('@utils/paths');
|
||||
const fs = require('fs');
|
||||
const { init } = require('@src/handler/parser/');
|
||||
const pkg = require(paths.package);
|
||||
const logger = require('./logger');
|
||||
|
||||
module.exports = (function() {
|
||||
const tsFullPath = paths.exampleResolve('codes', pkg.tsfile);
|
||||
logger.debug(`初始化GlobalVarible变量,$_ts配置文件:${tsFullPath}`);
|
||||
init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8')));
|
||||
module.exports = function(filepath) {
|
||||
if (!filepath) filepath = paths.exampleResolve('codes', "1-$_ts-full.json")
|
||||
if (!fs.existsSync(filepath)) throw new Error(`输入文件不存在: ${filepath}`);
|
||||
logger.debug(`初始化GlobalVarible变量,$_ts配置文件:${filepath}`);
|
||||
init(JSON.parse(fs.readFileSync(filepath, 'utf8')));
|
||||
return require('@src/handler/globalVarible');
|
||||
})();
|
||||
};
|
||||
|
27
utils/monitor.js
Normal file
27
utils/monitor.js
Normal file
@ -0,0 +1,27 @@
|
||||
module.exports = function monitor(tar, name, config = {}) {
|
||||
const {
|
||||
getLog, // 开启get日志
|
||||
setLog, // 开启set日志
|
||||
getKeys = [], // 触发get的debugger的键集合
|
||||
setKeys = [], // 触发set的debugger的键集合
|
||||
keys = [], // 触发debugger的键集合
|
||||
getCb, // get的回调,设置的debugger更友好
|
||||
setCb, // set的回调,设置的debugger更友好
|
||||
cb, // 回调,设置的debugger更友好
|
||||
parse = (key, val) => val,
|
||||
} = config;
|
||||
return new Proxy(tar, {
|
||||
get: function(target, property, receiver) {
|
||||
getLog && console.log(`${name} Getting ${property}`);
|
||||
if (getKeys.includes(property) || keys.includes(property)) debugger;
|
||||
(getCb || cb)?.(property);
|
||||
return Reflect.get(target, property, receiver);
|
||||
},
|
||||
set: function(target, property, value, receiver) {
|
||||
setLog && console.log(`${name} Setting ${property} to ${value}`);
|
||||
if (getKeys.includes(property) || keys.includes(property)) debugger;
|
||||
(setCb || cb)?.(property, value);
|
||||
return Reflect.set(target, property, parse(property, value), receiver);
|
||||
}
|
||||
});
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user