feat: key iv value logic optimization, addition of dynamic code execution mechanism

This commit is contained in:
rnet 2024-01-04 12:39:33 +08:00
parent 96068ddc28
commit fe2577e51f
12 changed files with 795 additions and 28 deletions

12
main.js
View File

@ -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 '));

View File

@ -29,7 +29,6 @@
},
"author": "pysunday",
"license": "ISC",
"tsfile": "1-$_ts-full.json",
"dependencies": {
"cheerio": "^1.0.0-rc.12",
"jest": "^29.7.0",

View 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;
}
}
}

View File

@ -21,5 +21,6 @@ module.exports = {
numarrEncrypt: require('./numarrEncrypt'),
numarr2string: require('./numarr2string'),
numarrJoin: require('./numarrJoin'),
dynamicExec: require('./dynamicExec'),
}

View File

@ -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]];
})

View File

@ -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 '));
}

View File

@ -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();

View File

@ -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]);

View File

@ -1,4 +1,4 @@
const gv = require('../utils/initGv');
const gv = require('../utils/initGv')();
const {
main,
swap4,

View File

@ -1,4 +1,4 @@
const gv = require('../utils/initGv');
const gv = require('../utils/initGv')();
const { ascii2string } = gv.utils;
const valueMap = {

View File

@ -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
View 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);
}
});
}