probe-vm.js 1021 B

123456789101112131415161718192021222324252627282930313233343536
  1. // 直接绕过 bytenode,用 vm.Script 试
  2. const fs = require('fs');
  3. const vm = require('vm');
  4. const target = process.argv[2];
  5. const raw = fs.readFileSync(target);
  6. console.log('size:', raw.length);
  7. // 尝试 1:整段作 cachedData
  8. function try1(label, buf) {
  9. try {
  10. const s = new vm.Script('"\u200b"', { cachedData: buf });
  11. console.log(`[${label}] rejected=`, s.cachedDataRejected);
  12. } catch (e) {
  13. console.log(`[${label}] ERR:`, e.code, e.message);
  14. }
  15. }
  16. try1('full', raw);
  17. try1('skip2', raw.subarray(2)); // 去掉 bytenode 头
  18. try1('skip4', raw.subarray(4)); // 去掉更多
  19. // 试 brotli 解压后作 cachedData
  20. const zlib = require('zlib');
  21. for (let skip of [0, 2, 4, 8]) {
  22. try {
  23. const d = zlib.brotliDecompressSync(raw.subarray(skip));
  24. try1(`brotli-skip${skip}`, d);
  25. } catch (e) { /* skip */ }
  26. }
  27. // 看几个特殊位置的字节
  28. console.log('\n[byte map]');
  29. for (let i = 0; i < 16; i++) {
  30. console.log(` [${i}] = 0x${raw[i].toString(16).padStart(2, '0')} (${raw[i]})`);
  31. }