diff --git a/main.js b/main.js index ea31a81..d53c45e 100755 --- a/main.js +++ b/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 ')); diff --git a/package.json b/package.json index a1cd838..e2905e1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ }, "author": "pysunday", "license": "ISC", - "tsfile": "1-$_ts-full.json", "dependencies": { "cheerio": "^1.0.0-rc.12", "jest": "^29.7.0", diff --git a/src/handler/parser/common/dynamicExec.js b/src/handler/parser/common/dynamicExec.js new file mode 100644 index 0000000..7c1420d --- /dev/null +++ b/src/handler/parser/common/dynamicExec.js @@ -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; + } + } +} + diff --git a/src/handler/parser/common/index.js b/src/handler/parser/common/index.js index d769de6..4c84f77 100644 --- a/src/handler/parser/common/index.js +++ b/src/handler/parser/common/index.js @@ -21,5 +21,6 @@ module.exports = { numarrEncrypt: require('./numarrEncrypt'), numarr2string: require('./numarr2string'), numarrJoin: require('./numarrJoin'), + dynamicExec: require('./dynamicExec'), } diff --git a/src/handler/parser/tscd.js b/src/handler/parser/tscd.js index 77f99f5..7689111 100644 --- a/src/handler/parser/tscd.js +++ b/src/handler/parser/tscd.js @@ -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]]; }) diff --git a/src/makeCode.js b/src/makeCode.js index 76fa42d..65d7e3f 100644 --- a/src/makeCode.js +++ b/src/makeCode.js @@ -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 ')); } diff --git a/src/makeCookie.js b/src/makeCookie.js index c6acf9f..c705059 100644 --- a/src/makeCookie.js +++ b/src/makeCookie.js @@ -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(); diff --git a/test/cp0_96.test.js b/test/cp0_96.test.js index cb51ee5..cb0af4a 100644 --- a/test/cp0_96.test.js +++ b/test/cp0_96.test.js @@ -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]); diff --git a/test/parser.test.js b/test/parser.test.js index 79731a1..7af43b4 100644 --- a/test/parser.test.js +++ b/test/parser.test.js @@ -1,4 +1,4 @@ -const gv = require('../utils/initGv'); +const gv = require('../utils/initGv')(); const { main, swap4, diff --git a/test/r2mka.test.js b/test/r2mka.test.js index a4e8b90..0cd5987 100644 --- a/test/r2mka.test.js +++ b/test/r2mka.test.js @@ -1,4 +1,4 @@ -const gv = require('../utils/initGv'); +const gv = require('../utils/initGv')(); const { ascii2string } = gv.utils; const valueMap = { diff --git a/utils/initGv.js b/utils/initGv.js index 04dd08b..b495562 100644 --- a/utils/initGv.js +++ b/utils/initGv.js @@ -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'); -})(); +}; diff --git a/utils/monitor.js b/utils/monitor.js new file mode 100644 index 0000000..bdc74a1 --- /dev/null +++ b/utils/monitor.js @@ -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); + } + }); +}