diff --git a/tools/bytejs.js b/tools/bytejs.js index d667436..dfa03ae 100644 --- a/tools/bytejs.js +++ b/tools/bytejs.js @@ -1,26 +1,34 @@ // makebytejs.js -const vm = require('vm'); -const fs = require('fs').promises; -const _module = require('module'); -const v8 = require('v8'); +var vm = require('vm'); +var fs = require('fs'); +var _module = require('module'); +var v8 = require('v8'); v8.setFlagsFromString('--no-lazy'); -async function compileFile(filePath) { - const code = await fs.readFile(filePath, 'utf-8'); - const script = new vm.Script(_module.wrap(code)); - const bytecode = script.createCachedData(); - await fs.writeFile(filePath.replace(/\.js$/i, '.bytecode'), bytecode); +function xor(buffer){ + var key = '123456789'.split('').map(function(e){return e.charCodeAt()}) + for (var i = 0; i < buffer.length; i++) { + buffer[i] ^= key[i % key.length] + } } -compileFile('./test.js'); +function compileFile(filePath) { + if (!fs.existsSync(filePath)) return + var code = fs.readFileSync(filePath, 'utf-8'); + var script = new vm.Script(_module.wrap(code)); + var bytecode = script.createCachedData(); + xor(bytecode) + fs.writeFileSync('main.bytecode', bytecode); +} +compileFile('./main_.js'); // runbytejs.js -const _module = require('module'); -const path = require('path'); -const fs = require('fs') -const vm = require('vm'); -const v8 = require('v8'); +var _module = require('module'); +var path = require('path'); +var fs = require('fs') +var vm = require('vm'); +var v8 = require('v8'); v8.setFlagsFromString('--no-flush-bytecode'); function validateString(value, name) { if (typeof value !== 'string') { @@ -28,8 +36,8 @@ function validateString(value, name) { } } function makeRequireFunction(mod) { - const Module = mod.constructor; - const require = function require(path) { + var Module = mod.constructor; + var require = function require(path) { return mod.require(path); }; require.resolve = function resolve(request, options) { @@ -45,22 +53,18 @@ function makeRequireFunction(mod) { require.cache = Module._cache; return require; } -const HeaderOffsetMap = { +var HeaderOffsetMap = { 'magic': 0, 'version_hash': 4, 'source_hash': 8, 'flag_hash': 12 }; -let _flag_buf; function getFlagBuf() { - if (!_flag_buf) { - const script = new vm.Script(""); - _flag_buf = getHeader(script.createCachedData(), 'flag_hash'); - } - return _flag_buf; + var script = new vm.Script(""); + return getHeader(script.createCachedData(), 'flag_hash'); } function getHeader(buffer, type) { - const offset = HeaderOffsetMap[type]; + var offset = HeaderOffsetMap[type]; return buffer.slice(offset, offset + 4); } function setHeader(buffer, type, vBuffer) { @@ -68,7 +72,7 @@ function setHeader(buffer, type, vBuffer) { } function buf2num(buf) { // 注意字节序问题 - let ret = 0; + var ret = 0; ret |= buf[3] << 24; ret |= buf[2] << 16; ret |= buf[1] << 8; @@ -76,11 +80,11 @@ function buf2num(buf) { return ret; } function loadBytecode(filePath) { - const bytecode = fs.readFileSync(filePath, null); - console.log(bytecode.toString('latin1')) + var bytecode = fs.readFileSync(filePath, null); + xor(bytecode) setHeader(bytecode, 'flag_hash', getFlagBuf()); - const sourceHash = buf2num(getHeader(bytecode, 'source_hash')); - const script = new vm.Script(' '.repeat(sourceHash), { + var sourceHash = buf2num(getHeader(bytecode, 'source_hash')); + var script = new vm.Script(' '.repeat(sourceHash), { filename: filePath, cachedData: bytecode, lineOffset: 0, @@ -92,17 +96,15 @@ function loadBytecode(filePath) { return script; } _module._extensions['.bytecode'] = function (module, filename) { - const script = loadBytecode(filename, false); - const wrapperFn = script.runInThisContext({ + var script = loadBytecode(filename, false); + var wrapperFn = script.runInThisContext({ filename: filename, displayErrors: true, lineOffset: 0, columnOffset: 0, }); - const require = makeRequireFunction(module); + var require = makeRequireFunction(module); wrapperFn.bind(module.exports)(module.exports, require, module, filename, path.dirname(filename)); } -require('./test.bytecode') - -console.log(window.top == window.self) \ No newline at end of file +require('./main.bytecode') \ No newline at end of file