js-confuser 1.7.1 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +12 -27
  3. package/dist/compiler.js +2 -8
  4. package/dist/constants.js +17 -10
  5. package/dist/index.js +7 -30
  6. package/dist/obfuscator.js +15 -62
  7. package/dist/options.js +21 -38
  8. package/dist/order.js +4 -7
  9. package/dist/parser.js +5 -13
  10. package/dist/precedence.js +6 -8
  11. package/dist/presets.js +4 -6
  12. package/dist/probability.js +13 -24
  13. package/dist/templates/bufferToString.js +100 -5
  14. package/dist/templates/crash.js +51 -9
  15. package/dist/templates/es5.js +125 -6
  16. package/dist/templates/functionLength.js +24 -6
  17. package/dist/templates/globals.js +9 -0
  18. package/dist/templates/template.js +71 -30
  19. package/dist/transforms/antiTooling.js +26 -22
  20. package/dist/transforms/calculator.js +18 -54
  21. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +236 -333
  22. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
  23. package/dist/transforms/deadCode.js +528 -27
  24. package/dist/transforms/dispatcher.js +106 -110
  25. package/dist/transforms/es5/antiClass.js +70 -44
  26. package/dist/transforms/es5/antiDestructuring.js +14 -38
  27. package/dist/transforms/es5/antiES6Object.js +39 -48
  28. package/dist/transforms/es5/antiSpreadOperator.js +5 -14
  29. package/dist/transforms/es5/antiTemplate.js +10 -19
  30. package/dist/transforms/es5/es5.js +7 -40
  31. package/dist/transforms/extraction/classExtraction.js +83 -0
  32. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
  33. package/dist/transforms/extraction/objectExtraction.js +24 -56
  34. package/dist/transforms/finalizer.js +6 -20
  35. package/dist/transforms/flatten.js +51 -99
  36. package/dist/transforms/identifier/globalAnalysis.js +8 -26
  37. package/dist/transforms/identifier/globalConcealing.js +35 -54
  38. package/dist/transforms/identifier/movedDeclarations.js +66 -38
  39. package/dist/transforms/identifier/renameVariables.js +29 -68
  40. package/dist/transforms/identifier/variableAnalysis.js +21 -48
  41. package/dist/transforms/lock/antiDebug.js +20 -25
  42. package/dist/transforms/lock/integrity.js +48 -47
  43. package/dist/transforms/lock/lock.js +62 -113
  44. package/dist/transforms/minify.js +77 -108
  45. package/dist/transforms/opaquePredicates.js +11 -48
  46. package/dist/transforms/preparation.js +17 -50
  47. package/dist/transforms/renameLabels.js +5 -22
  48. package/dist/transforms/rgf.js +93 -69
  49. package/dist/transforms/shuffle.js +41 -46
  50. package/dist/transforms/stack.js +35 -98
  51. package/dist/transforms/string/encoding.js +73 -27
  52. package/dist/transforms/string/stringCompression.js +44 -68
  53. package/dist/transforms/string/stringConcealing.js +125 -134
  54. package/dist/transforms/string/stringEncoding.js +6 -26
  55. package/dist/transforms/string/stringSplitting.js +5 -30
  56. package/dist/transforms/transform.js +50 -100
  57. package/dist/traverse.js +11 -18
  58. package/dist/util/compare.js +27 -29
  59. package/dist/util/gen.js +32 -86
  60. package/dist/util/guard.js +0 -1
  61. package/dist/util/identifiers.js +9 -72
  62. package/dist/util/insert.js +27 -77
  63. package/dist/util/math.js +0 -3
  64. package/dist/util/object.js +3 -7
  65. package/dist/util/random.js +5 -36
  66. package/dist/util/scope.js +6 -3
  67. package/package.json +3 -3
  68. package/src/constants.ts +12 -0
  69. package/src/options.ts +13 -0
  70. package/src/order.ts +2 -2
  71. package/src/templates/bufferToString.ts +49 -11
  72. package/src/templates/functionLength.ts +21 -3
  73. package/src/templates/globals.ts +3 -0
  74. package/src/templates/template.ts +85 -25
  75. package/src/transforms/antiTooling.ts +33 -11
  76. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +2 -2
  77. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
  78. package/src/transforms/deadCode.ts +0 -16
  79. package/src/transforms/dispatcher.ts +91 -69
  80. package/src/transforms/es5/antiClass.ts +10 -1
  81. package/src/transforms/extraction/classExtraction.ts +168 -0
  82. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -10
  83. package/src/transforms/extraction/objectExtraction.ts +4 -15
  84. package/src/transforms/flatten.ts +20 -5
  85. package/src/transforms/identifier/globalConcealing.ts +29 -65
  86. package/src/transforms/identifier/movedDeclarations.ts +90 -24
  87. package/src/transforms/minify.ts +27 -12
  88. package/src/transforms/rgf.ts +94 -5
  89. package/src/transforms/stack.ts +12 -3
  90. package/src/transforms/string/encoding.ts +85 -51
  91. package/src/transforms/string/stringCompression.ts +5 -8
  92. package/src/transforms/string/stringConcealing.ts +139 -113
  93. package/src/transforms/string/stringEncoding.ts +1 -2
  94. package/src/transforms/string/stringSplitting.ts +1 -2
  95. package/src/transforms/transform.ts +30 -1
  96. package/src/util/compare.ts +39 -5
  97. package/src/util/gen.ts +10 -3
  98. package/src/util/insert.ts +17 -0
  99. package/src/util/scope.ts +14 -2
  100. package/test/code/Cash.test.ts +10 -4
  101. package/test/code/StrictMode.src.js +65 -0
  102. package/test/code/StrictMode.test.js +37 -0
  103. package/test/compare.test.ts +62 -2
  104. package/test/options.test.ts +111 -55
  105. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
  106. package/test/transforms/dispatcher.test.ts +55 -0
  107. package/test/transforms/extraction/classExtraction.test.ts +86 -0
  108. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
  109. package/test/transforms/extraction/objectExtraction.test.ts +2 -0
  110. package/test/transforms/identifier/globalConcealing.test.ts +19 -0
  111. package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
  112. package/test/transforms/minify.test.ts +37 -0
  113. package/test/transforms/rgf.test.ts +50 -0
  114. package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
  115. package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
  116. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
  117. package/dist/transforms/eval.js +0 -84
  118. package/dist/transforms/hexadecimalNumbers.js +0 -63
  119. package/dist/transforms/hideInitializingCode.js +0 -270
  120. package/dist/transforms/identifier/nameRecycling.js +0 -218
  121. package/dist/transforms/label.js +0 -67
  122. package/dist/transforms/preparation/nameConflicts.js +0 -116
  123. package/dist/transforms/preparation/preparation.js +0 -188
@@ -4,27 +4,45 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
7
+ var _constants = require("../../constants");
8
+ var _template = _interopRequireDefault(require("../../templates/template"));
8
9
  var _traverse = require("../../traverse");
9
-
10
10
  var _gen = require("../../util/gen");
11
-
11
+ var _insert = require("../../util/insert");
12
12
  var _transform = _interopRequireDefault(require("../transform"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
16
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
16
17
  /**
17
18
  * Expression Obfuscation runs before Control Flow Flattening
18
19
  */
19
20
  class ExpressionObfuscation extends _transform.default {
20
21
  constructor(o) {
21
22
  super(o);
23
+ _defineProperty(this, "fnName", void 0);
24
+ }
25
+ apply(tree) {
26
+ super.apply(tree);
27
+ if (typeof this.fnName === "string") {
28
+ (0, _insert.prepend)(tree, (0, _template.default)(`
29
+ function {fnName}(...args){
30
+ return args[args["length"] - 1]
31
+ }
32
+ `).single({
33
+ fnName: this.fnName
34
+ }));
35
+ }
36
+ }
37
+ createSequenceExpression(expressions) {
38
+ if (!this.fnName) {
39
+ this.fnName = this.getPlaceholder() + _constants.criticalFunctionTag;
40
+ }
41
+ return (0, _gen.CallExpression)((0, _gen.Identifier)(this.fnName), [...expressions]);
22
42
  }
23
-
24
43
  match(object, parents) {
25
44
  return (0, _traverse.isBlock)(object);
26
45
  }
27
-
28
46
  transform(object, parents) {
29
47
  return () => {
30
48
  var exprs = [];
@@ -32,10 +50,10 @@ class ExpressionObfuscation extends _transform.default {
32
50
  object.body.forEach((stmt, i) => {
33
51
  if (stmt.type == "ExpressionStatement" && !stmt.directive) {
34
52
  var expr = stmt.expression;
35
-
36
53
  if (expr.type == "UnaryExpression" && !(expr.operator === "typeof" && expr.argument.type === "Identifier") && exprs.length // typeof is special
37
54
  ) {
38
- expr.argument = (0, _gen.SequenceExpression)([...exprs, { ...expr.argument
55
+ expr.argument = (0, _gen.SequenceExpression)([...exprs, {
56
+ ...expr.argument
39
57
  }]);
40
58
  deleteExprs.push(...exprs);
41
59
  exprs = [];
@@ -48,63 +66,66 @@ class ExpressionObfuscation extends _transform.default {
48
66
  if (stmt.test.type == "BinaryExpression" && stmt.test.operator !== "**") {
49
67
  if (stmt.test.left.type == "UnaryExpression" && !(stmt.test.left.operator === "typeof" && stmt.test.left.argument.type === "Identifier") // typeof is special
50
68
  ) {
51
- stmt.test.left.argument = (0, _gen.SequenceExpression)([...exprs, { ...stmt.test.left.argument
69
+ stmt.test.left.argument = this.createSequenceExpression([...exprs, {
70
+ ...stmt.test.left.argument
52
71
  }]);
53
72
  } else {
54
- stmt.test.left = (0, _gen.SequenceExpression)([...exprs, { ...stmt.test.left
73
+ stmt.test.left = this.createSequenceExpression([...exprs, {
74
+ ...stmt.test.left
55
75
  }]);
56
76
  }
57
77
  } else if (stmt.test.type == "LogicalExpression" && stmt.test.left.type == "BinaryExpression" && stmt.test.operator !== "**" && stmt.test.left.left.type == "UnaryExpression") {
58
- stmt.test.left.left.argument = (0, _gen.SequenceExpression)([...exprs, { ...stmt.test.left.left.argument
78
+ stmt.test.left.left.argument = this.createSequenceExpression([...exprs, {
79
+ ...stmt.test.left.left.argument
59
80
  }]);
60
81
  } else {
61
- stmt.test = (0, _gen.SequenceExpression)([...exprs, { ...stmt.test
82
+ stmt.test = this.createSequenceExpression([...exprs, {
83
+ ...stmt.test
62
84
  }]);
63
85
  }
64
-
65
86
  deleteExprs.push(...exprs);
66
87
  } else if (stmt.type == "ForStatement" || stmt.type == "LabeledStatement" && stmt.body.type == "ForStatement") {
67
88
  var init = (stmt.type == "LabeledStatement" ? stmt.body : stmt).init;
68
-
69
89
  if (init) {
70
90
  if (init.type == "VariableDeclaration") {
71
- init.declarations[0].init = (0, _gen.SequenceExpression)([...exprs, { ...(init.declarations[0].init || (0, _gen.Identifier)("undefined"))
91
+ init.declarations[0].init = this.createSequenceExpression([...exprs, {
92
+ ...(init.declarations[0].init || (0, _gen.Identifier)("undefined"))
72
93
  }]);
73
94
  deleteExprs.push(...exprs);
74
95
  } else if (init.type == "AssignmentExpression") {
75
- init.right = (0, _gen.SequenceExpression)([...exprs, { ...(init.right || (0, _gen.Identifier)("undefined"))
96
+ init.right = this.createSequenceExpression([...exprs, {
97
+ ...(init.right || (0, _gen.Identifier)("undefined"))
76
98
  }]);
77
99
  deleteExprs.push(...exprs);
78
100
  }
79
101
  }
80
102
  } else if (stmt.type == "VariableDeclaration") {
81
- stmt.declarations[0].init = (0, _gen.SequenceExpression)([...exprs, { ...(stmt.declarations[0].init || (0, _gen.Identifier)("undefined"))
103
+ stmt.declarations[0].init = this.createSequenceExpression([...exprs, {
104
+ ...(stmt.declarations[0].init || (0, _gen.Identifier)("undefined"))
82
105
  }]);
83
106
  deleteExprs.push(...exprs);
84
107
  } else if (stmt.type == "ThrowStatement") {
85
- stmt.argument = (0, _gen.SequenceExpression)([...exprs, { ...stmt.argument
108
+ stmt.argument = this.createSequenceExpression([...exprs, {
109
+ ...stmt.argument
86
110
  }]);
87
111
  deleteExprs.push(...exprs);
88
112
  } else if (stmt.type == "ReturnStatement") {
89
- stmt.argument = (0, _gen.SequenceExpression)([...exprs, { ...(stmt.argument || (0, _gen.Identifier)("undefined"))
113
+ stmt.argument = this.createSequenceExpression([...exprs, {
114
+ ...(stmt.argument || (0, _gen.Identifier)("undefined"))
90
115
  }]);
91
116
  deleteExprs.push(...exprs);
92
117
  }
93
118
  }
94
-
95
119
  exprs = [];
96
120
  }
97
121
  });
98
122
  deleteExprs.forEach(expr => {
99
123
  var index = object.body.findIndex(x => x.expression === expr);
100
-
101
124
  if (index !== -1) {
102
125
  object.body.splice(index, 1);
103
126
  }
104
127
  });
105
128
  };
106
129
  }
107
-
108
130
  }
109
-
110
131
  exports.default = ExpressionObfuscation;