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
@@ -1,159 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _assert = require("assert");
9
-
10
- var _probability = require("../../probability");
11
-
12
- var _traverse = require("../../traverse");
13
-
14
- var _gen = require("../../util/gen");
15
-
16
- var _identifiers = require("../../util/identifiers");
17
-
18
- var _insert = require("../../util/insert");
19
-
20
- var _random = require("../../util/random");
21
-
22
- var _transform = _interopRequireDefault(require("../transform"));
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- /**
27
- * Obfuscates For and While statements.
28
- */
29
- class ControlFlowObfuscation extends _transform.default {
30
- constructor(o) {
31
- super(o);
32
- }
33
-
34
- match(object, parents) {
35
- return object.type === "ForStatement" || object.type === "WhileStatement";
36
- }
37
-
38
- transform(object, parents) {
39
- return () => {
40
- if (object.$controlFlowObfuscation) {
41
- // avoid infinite loop
42
- return;
43
- }
44
-
45
- if ((0, _identifiers.containsLexicallyBoundVariables)(object, parents)) {
46
- return;
47
- }
48
-
49
- var illegal = false;
50
- (0, _traverse.walk)(object, parents, (o, p) => {
51
- if (o.type == "FunctionDeclaration" || o.type == "BreakStatement") {
52
- illegal = true;
53
- return "EXIT";
54
- }
55
- });
56
-
57
- if (illegal) {
58
- return;
59
- }
60
-
61
- var body = parents[0].type == "LabeledStatement" ? parents[1] : parents[0];
62
- var element = parents[0].type == "LabeledStatement" ? parents[0] : object; // No place to insert more statements
63
-
64
- if (!Array.isArray(body)) {
65
- return;
66
- } // No place to insert variable declaration
67
-
68
-
69
- if (body.indexOf(element) === -1) {
70
- return;
71
- }
72
-
73
- if (!(0, _probability.ComputeProbabilityMap)(this.options.controlFlowFlattening, x => x)) {
74
- return;
75
- }
76
-
77
- var init = [];
78
- var update = [];
79
- var test = null;
80
- var consequent = [];
81
-
82
- if (object.type === "ForStatement") {
83
- if (object.init) {
84
- init.push(object.init);
85
- }
86
-
87
- if (object.update) {
88
- update.push((0, _gen.ExpressionStatement)(object.update));
89
- }
90
-
91
- if (object.test) {
92
- test = object.test || (0, _gen.Literal)(true);
93
- }
94
- } else if (object.type === "WhileStatement") {
95
- if (object.test) {
96
- test = object.test;
97
- }
98
- } else {
99
- throw new Error("Unknown type: " + object.type);
100
- }
101
-
102
- if (object.body.type == "BlockStatement") {
103
- consequent.push(...(0, _insert.getBlockBody)(object.body));
104
- } else {
105
- consequent.push(object.body);
106
- }
107
-
108
- if (!test) {
109
- test = (0, _gen.Literal)(true);
110
- }
111
-
112
- (0, _assert.ok)(test);
113
- init.forEach(o => {
114
- if (o.type !== "VariableDeclaration" && o.type !== "ExpressionStatement") {
115
- this.replace(o, (0, _gen.ExpressionStatement)((0, _insert.clone)(o)));
116
- }
117
- });
118
- var stateVar = this.getPlaceholder();
119
- var selection = new Set(); // init 0 test 1 run 2 update 3 end 4
120
-
121
- var states = []; // Create 5 random unique number
122
-
123
- while (states.length < 5) {
124
- var newState;
125
-
126
- do {
127
- newState = (0, _random.getRandomInteger)(0, 1000 + states.length);
128
- } while (selection.has(newState));
129
-
130
- (0, _assert.ok)(!isNaN(newState));
131
- states.push(newState);
132
- selection.add(newState);
133
- }
134
-
135
- (0, _assert.ok)(selection.size === states.length);
136
- (0, _assert.ok)(states.length === 5);
137
- var startState = states[0];
138
- var testState = states[1];
139
- var bodyState = states[2];
140
- var updateState = states[3];
141
- var endState = states[4];
142
- body.splice(body.indexOf(element), 0, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(stateVar, (0, _gen.Literal)(startState))));
143
-
144
- function goto(from, to) {
145
- var diff = to - from;
146
- (0, _assert.ok)(!isNaN(diff));
147
- return (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("+=", (0, _gen.Identifier)(stateVar), (0, _gen.Literal)(diff)));
148
- }
149
-
150
- var cases = [(0, _gen.SwitchCase)((0, _gen.Literal)(startState), [...init, goto(startState, testState), (0, _gen.BreakStatement)()]), (0, _gen.SwitchCase)((0, _gen.Literal)(testState), [(0, _gen.IfStatement)(test, [goto(testState, bodyState)], [goto(testState, endState)]), (0, _gen.BreakStatement)()]), (0, _gen.SwitchCase)((0, _gen.Literal)(bodyState), [...consequent, goto(bodyState, updateState), (0, _gen.BreakStatement)()]), (0, _gen.SwitchCase)((0, _gen.Literal)(updateState), [...update, goto(updateState, testState), (0, _gen.BreakStatement)()])];
151
- this.replace(object, (0, _gen.WhileStatement)((0, _gen.BinaryExpression)("!=", (0, _gen.Identifier)(stateVar), (0, _gen.Literal)(endState)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(stateVar), cases)])); // Marked to not be infinite
152
-
153
- object.$controlFlowObfuscation = 1;
154
- };
155
- }
156
-
157
- }
158
-
159
- exports.default = ControlFlowObfuscation;
@@ -1,106 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _traverse = require("../../traverse");
9
-
10
- var _gen = require("../../util/gen");
11
-
12
- var _insert = require("../../util/insert");
13
-
14
- var _random = require("../../util/random");
15
-
16
- var _transform = _interopRequireDefault(require("../transform"));
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
- /**
21
- * Does complex math to the state variable, after both CFF and CFO have run.
22
- *
23
- * The switch statements are ones with numbered cases and a simple discriminant.
24
- */
25
- class SwitchCaseObfuscation extends _transform.default {
26
- constructor(o) {
27
- super(o);
28
- }
29
-
30
- match(object, parents) {
31
- return object.type == "SwitchStatement" && (object.$controlFlowFlattening || !object.cases.find(x => !(x.test && typeof x.test === "object" && x.test.type == "Literal" && typeof x.test.value === "number" && Math.abs(x.test.value) < 100000)));
32
- }
33
-
34
- transform(object, parents) {
35
- var types = new Set();
36
- (0, _traverse.walk)(object.discriminant, [object, ...parents], (o, p) => {
37
- if (o.type) {
38
- types.add(o.type);
39
- }
40
- });
41
-
42
- if (!object.$controlFlowFlattening) {
43
- types.delete("Identifier");
44
-
45
- if (types.size) {
46
- return;
47
- }
48
- }
49
-
50
- var body = parents[0];
51
- var element = object;
52
-
53
- if (parents[0].type == "LabeledStatement") {
54
- body = parents[1];
55
- element = parents[0];
56
- }
57
-
58
- if (!Array.isArray(body)) {
59
- return;
60
- }
61
-
62
- var index = body.indexOf(element);
63
-
64
- if (index === -1) {
65
- return;
66
- }
67
-
68
- var factor = (0, _random.getRandomInteger)(2, 100);
69
- var offset = (0, _random.getRandomInteger)(-250, 250);
70
- var newVar = this.getPlaceholder();
71
- var newStates = [];
72
- var max;
73
- object.cases.forEach((caseObject, i) => {
74
- if (caseObject.test && caseObject.test.type === "Literal" && typeof caseObject.test.value === "number") {
75
- var current = caseObject.test.value;
76
- var value = current * factor + offset;
77
- newStates[i] = value;
78
-
79
- if (!max || Math.abs(value) > max) {
80
- max = Math.abs(value);
81
- }
82
- }
83
- });
84
-
85
- if (max > 100000) {
86
- return;
87
- } // State variable declaration
88
-
89
-
90
- body.splice(index, 0, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(newVar, (0, _gen.BinaryExpression)("+", (0, _gen.BinaryExpression)("*", (0, _insert.clone)(object.discriminant), (0, _gen.Literal)(factor)), (0, _gen.Literal)(offset)))));
91
- object.discriminant = (0, _gen.Identifier)(newVar); // possible so override
92
-
93
- object.cases.forEach((x, i) => {
94
- if (x.test) {
95
- if (x.test.type === "Literal" && typeof x.test.value === "number") {
96
- x.test = (0, _gen.Literal)(newStates[i]);
97
- } else {
98
- x.test = (0, _gen.BinaryExpression)("+", (0, _gen.BinaryExpression)("*", x.test, (0, _gen.Literal)(factor)), (0, _gen.Literal)(offset));
99
- }
100
- }
101
- });
102
- }
103
-
104
- }
105
-
106
- exports.default = SwitchCaseObfuscation;
@@ -1,84 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _compiler = require("../compiler");
9
-
10
- var _order = require("../order");
11
-
12
- var _probability = require("../probability");
13
-
14
- var _traverse = require("../traverse");
15
-
16
- var _gen = require("../util/gen");
17
-
18
- var _insert = require("../util/insert");
19
-
20
- var _transform = _interopRequireDefault(require("./transform"));
21
-
22
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
- class Eval extends _transform.default {
25
- constructor(o) {
26
- super(o, _order.ObfuscateOrder.Eval);
27
- }
28
-
29
- match(object, parents) {
30
- return (0, _insert.isFunction)(object) && object.type != "ArrowFunctionExpression" && !object.$eval && !object.$dispatcherSkip;
31
- }
32
-
33
- transform(object, parents) {
34
- // Don't apply to getter/setters or class methods
35
- if (parents[0]) {
36
- if (parents[0].type === "MethodDefinition" && parents[0].value === object) {
37
- return;
38
- }
39
-
40
- if (parents[0].type === "Property" && parents[0].value === object && (parents[0].kind !== "init" || parents[0].method)) {
41
- return;
42
- }
43
- }
44
-
45
- if (!(0, _probability.ComputeProbabilityMap)(this.options.eval, x => x, object.id && object.id.name)) {
46
- return;
47
- }
48
-
49
- object.$eval = (o, p) => {
50
- var name;
51
- var requiresMove = false;
52
-
53
- if (object.type == "FunctionDeclaration") {
54
- name = object.id.name;
55
- object.type = "FunctionExpression";
56
- object.id = null;
57
- requiresMove = Array.isArray(p[0]) && (0, _traverse.isBlock)(p[1]);
58
- }
59
-
60
- var code = (0, _compiler.compileJsSync)(object, this.options);
61
-
62
- if (object.type == "FunctionExpression") {
63
- code = "(" + code + ")";
64
- }
65
-
66
- var literal = (0, _gen.Literal)(code);
67
- var expr = (0, _gen.CallExpression)((0, _gen.Identifier)("eval"), [literal]);
68
-
69
- if (name) {
70
- expr = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, expr));
71
- }
72
-
73
- if (requiresMove) {
74
- (0, _insert.prepend)(p[1], expr);
75
- p[0].splice(p[0].indexOf(object), 1);
76
- } else {
77
- this.replace(object, expr);
78
- }
79
- };
80
- }
81
-
82
- }
83
-
84
- exports.default = Eval;
@@ -1,63 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _transform = _interopRequireDefault(require("./transform"));
9
-
10
- var _order = require("../order");
11
-
12
- var _gen = require("../util/gen");
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- /**
17
- * The HexadecimalNumbers transformation converts number literals into the hexadecimal form.
18
- *
19
- * This is done by replacing the number literal with an Identifier to ensure escodegen properly outputs it as such
20
- *
21
- * This transformation also handles BigInt support, so its always enabled for this reason.
22
- */
23
- class HexadecimalNumbers extends _transform.default {
24
- constructor(o) {
25
- super(o, _order.ObfuscateOrder.HexadecimalNumbers);
26
- }
27
-
28
- isNumberLiteral(object) {
29
- return object.type === "Literal" && typeof object.value === "number" && Math.floor(object.value) === object.value;
30
- }
31
-
32
- isBigIntLiteral(object) {
33
- return object.type === "Literal" && typeof object.value === "bigint";
34
- }
35
-
36
- match(object, parents) {
37
- return this.options.hexadecimalNumbers && this.isNumberLiteral(object) || this.isBigIntLiteral(object);
38
- }
39
-
40
- transform(object, parents) {
41
- if (this.isNumberLiteral(object)) {
42
- return () => {
43
- // Technically, a Literal will never be negative because it's supposed to be inside a UnaryExpression with a "-" operator.
44
- // This code handles it regardless
45
- var isNegative = object.value < 0;
46
- var hex = Math.abs(object.value).toString(16);
47
- var newStr = (isNegative ? "-" : "") + "0x" + hex;
48
- this.replace(object, (0, _gen.Identifier)(newStr));
49
- };
50
- } // https://github.com/MichaelXF/js-confuser/issues/79
51
-
52
-
53
- if (this.isBigIntLiteral(object)) {
54
- return () => {
55
- // Use an Identifier with the raw string
56
- this.replace(object, (0, _gen.Identifier)(object.raw));
57
- };
58
- }
59
- }
60
-
61
- }
62
-
63
- exports.default = HexadecimalNumbers;
@@ -1,270 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _constants = require("../constants");
9
-
10
- var _order = require("../order");
11
-
12
- var _traverse = require("../traverse");
13
-
14
- var _gen = require("../util/gen");
15
-
16
- var _identifiers = require("../util/identifiers");
17
-
18
- var _insert = require("../util/insert");
19
-
20
- var _random = require("../util/random");
21
-
22
- var _transform = _interopRequireDefault(require("./transform"));
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- class HideInitializingCode extends _transform.default {
27
- constructor(o) {
28
- super(o, _order.ObfuscateOrder.HideInitializingCode);
29
- }
30
-
31
- match(object, parents) {
32
- return object.type == "Program";
33
- }
34
-
35
- transform(object, parents) {
36
- return () => {
37
- var body = object.body;
38
- var hasExport = false;
39
- var stmts = [];
40
- var functions = [];
41
- var exportTypes = new Set(["ExportNamedDeclaration", "ExportSpecifier", "ExportDefaultDeclaration", "ExportAllDeclaration"]);
42
- var sampledNames = new Set();
43
- body.forEach(stmt => {
44
- if (stmt.type == "FunctionDeclaration") {
45
- functions.push(stmt);
46
-
47
- if (stmt.id) {
48
- sampledNames.add(stmt.id.name);
49
- }
50
- } else if (exportTypes.has(stmt.type)) {
51
- hasExport = true;
52
- } else {
53
- stmts.push(stmt);
54
- }
55
- });
56
-
57
- if (hasExport) {
58
- return;
59
- }
60
-
61
- var definedNames = new Set();
62
-
63
- const findNames = (o, p) => {
64
- (0, _identifiers.validateChain)(o, p);
65
- var context = (0, _insert.getVarContext)(o, p);
66
- (0, _traverse.walk)(o, p, (oo, pp) => {
67
- if (oo.type == "Identifier" && !_constants.reservedIdentifiers.has(oo.name) && !this.options.globalVariables.has(oo.name)) {
68
- var info = (0, _identifiers.getIdentifierInfo)(oo, pp);
69
-
70
- if (info.spec.isReferenced && info.spec.isDefined && (0, _insert.getVarContext)(oo, pp) === context) {
71
- definedNames.add(oo.name);
72
- }
73
- }
74
- });
75
- };
76
-
77
- (0, _traverse.walk)(object, [], (o, p) => {
78
- if (o.type == "VariableDeclaration" || o.type == "ClassDeclaration") {
79
- if (p.find(x => (0, _insert.isFunction)(x))) {
80
- return;
81
- }
82
-
83
- if (o.type == "VariableDeclaration") {
84
- return () => {
85
- var exprs = [];
86
- var fi = (0, _insert.isForInitialize)(o, p);
87
- o.declarations.forEach(declarator => {
88
- findNames(declarator.id, [declarator, o.declarations, o, ...p]);
89
-
90
- if (fi === "left-hand") {
91
- exprs.push({ ...declarator.id
92
- });
93
- } else {
94
- exprs.push((0, _gen.AssignmentExpression)("=", declarator.id, declarator.init || (0, _gen.Identifier)("undefined")));
95
- }
96
- });
97
-
98
- if (fi) {
99
- this.replace(o, exprs.length > 1 ? (0, _gen.SequenceExpression)(exprs) : exprs[0]);
100
- } else {
101
- this.replace(o, (0, _gen.ExpressionStatement)((0, _gen.SequenceExpression)(exprs)));
102
- }
103
- };
104
- } else if (o.type == "ClassDeclaration") {
105
- if (o.id.name) {
106
- definedNames.add(o.id.name);
107
- this.replace(o, (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(o.id.name), { ...o,
108
- type: "ClassExpression"
109
- })));
110
- }
111
- }
112
- }
113
- });
114
- var addNodes = [];
115
-
116
- if (definedNames.size) {
117
- addNodes.push((0, _gen.VariableDeclaration)(Array.from(definedNames).map(name => {
118
- return (0, _gen.VariableDeclarator)(name);
119
- })));
120
- }
121
-
122
- var deadValues = Object.create(null);
123
- Array((0, _random.getRandomInteger)(1, 20)).fill(0).forEach(() => {
124
- var name = this.getPlaceholder();
125
- var value = (0, _random.getRandomInteger)(-250, 250);
126
- addNodes.push((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, (0, _gen.Literal)(value))));
127
- deadValues[name] = value;
128
- sampledNames.add(name);
129
- });
130
- var map = new Map();
131
- var fnsToMake = (0, _random.getRandomInteger)(1, 5);
132
- var numberLiteralsMade = 1;
133
-
134
- function numberLiteral(num) {
135
- let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
136
-
137
- if (depth > 6 || Math.random() > 0.8 / depth || Math.random() > 80 / numberLiteralsMade) {
138
- return (0, _gen.Literal)(num);
139
- }
140
-
141
- numberLiteralsMade++;
142
-
143
- function ternaryCall(name) {
144
- let param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _random.getRandomInteger)(-250, 250);
145
- return (0, _gen.ConditionalExpression)((0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)(name)), (0, _gen.Literal)("function")), (0, _gen.CallExpression)((0, _gen.Identifier)(name), [numberLiteral(param, depth + 1)]), (0, _gen.Identifier)(name));
146
- }
147
-
148
- if (Math.random() > 0.5) {
149
- var fnName = (0, _random.choice)(Array.from(map.keys()));
150
-
151
- if (fnName) {
152
- var inputOutputs = map.get(fnName);
153
- var randomInput = (0, _random.choice)(Object.keys(inputOutputs));
154
- var outputValue = inputOutputs[randomInput];
155
- var parsed = parseFloat(randomInput);
156
- return (0, _gen.BinaryExpression)("-", ternaryCall(fnName, parsed), numberLiteral(outputValue - num, depth + 1));
157
- }
158
- }
159
-
160
- var deadValueName = (0, _random.choice)(Object.keys(deadValues));
161
- var actualValue = deadValues[deadValueName];
162
-
163
- if (Math.random() > 0.5) {
164
- return (0, _gen.BinaryExpression)("+", numberLiteral(num - actualValue, depth + 1), ternaryCall(deadValueName));
165
- }
166
-
167
- return (0, _gen.BinaryExpression)("-", ternaryCall(deadValueName), numberLiteral(actualValue - num, depth + 1));
168
- }
169
-
170
- for (var i = 0; i < fnsToMake; i++) {
171
- var name = this.getPlaceholder();
172
- var testShift = (0, _random.getRandomInteger)(-250, 250);
173
- var returnShift = (0, _random.getRandomInteger)(-250, 250);
174
- var inputs = (0, _random.getRandomInteger)(2, 5);
175
- var used = new Set();
176
- var uniqueNumbersNeeded = inputs * 2;
177
-
178
- for (var j = 0; j < uniqueNumbersNeeded; j++) {
179
- var num;
180
- var k = 0;
181
-
182
- do {
183
- num = (0, _random.getRandomInteger)(-250, 250 + k * 100);
184
- k++;
185
- } while (used.has(num));
186
-
187
- used.add(num);
188
- }
189
-
190
- var inputOutput = Object.create(null);
191
- var array = Array.from(used);
192
-
193
- for (var j = 0; j < array.length; j += 2) {
194
- inputOutput[array[j]] = array[j + 1];
195
- }
196
-
197
- var cases = Object.keys(inputOutput).map(input => {
198
- var parsed = parseFloat(input);
199
- return (0, _gen.SwitchCase)(numberLiteral(parsed + testShift), [(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)("input"), numberLiteral(inputOutput[input] - returnShift))), (0, _gen.BreakStatement)()]);
200
- });
201
- var functionExpression = (0, _gen.FunctionExpression)([(0, _gen.Identifier)("testShift"), (0, _gen.Identifier)("returnShift")], [(0, _gen.ReturnStatement)((0, _gen.FunctionExpression)([(0, _gen.Identifier)("input")], [(0, _gen.SwitchStatement)((0, _gen.BinaryExpression)("+", (0, _gen.Identifier)("input"), (0, _gen.Identifier)("testShift")), cases), (0, _gen.ReturnStatement)((0, _gen.BinaryExpression)("+", (0, _gen.Identifier)("input"), (0, _gen.Identifier)("returnShift")))]))]);
202
- var variableDeclaration = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, (0, _gen.CallExpression)(functionExpression, [numberLiteral(testShift), numberLiteral(returnShift)])));
203
- addNodes.push(variableDeclaration);
204
- map.set(name, inputOutput);
205
- sampledNames.add(name);
206
- }
207
-
208
- var deadNameArray = Object.keys(deadValues);
209
- var sampledArray = Array.from(sampledNames);
210
- var check = (0, _random.getRandomInteger)(-250, 250);
211
- var initName = "init" + this.getPlaceholder(); // Entangle number literals
212
-
213
- var made = 1; // Limit frequency
214
-
215
- (0, _traverse.walk)(stmts, [], (o, p) => {
216
- if (o.type == "Literal" && typeof o.value === "number" && Math.floor(o.value) === o.value && Math.abs(o.value) < 100000 && Math.random() < 4 / made) {
217
- made++;
218
- return () => {
219
- this.replaceIdentifierOrLiteral(o, numberLiteral(o.value), p);
220
- };
221
- }
222
- }); // Create the new function
223
-
224
- addNodes.push((0, _gen.FunctionDeclaration)(initName, [], [...stmts]));
225
-
226
- function truePredicate() {
227
- return (0, _gen.BinaryExpression)(">", (0, _gen.Literal)(600 + (0, _random.getRandomInteger)(200, 800)), (0, _gen.Literal)(400 - (0, _random.getRandomInteger)(0, 600)));
228
- }
229
-
230
- function falsePredicate() {
231
- return (0, _gen.BinaryExpression)(">", (0, _gen.Literal)(400 - (0, _random.getRandomInteger)(0, 600)), (0, _gen.Literal)(600 + (0, _random.getRandomInteger)(200, 800)));
232
- }
233
-
234
- function safeCallExpression(name, param) {
235
- return (0, _gen.ConditionalExpression)((0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)(name)), (0, _gen.Literal)("function")), (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(name), (0, _gen.Identifier)("call"), false), [(0, _gen.ThisExpression)(), numberLiteral(param)]), (0, _gen.Identifier)(name));
236
- }
237
-
238
- function ternaryHell(expr) {
239
- let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
240
-
241
- if (!depth || depth > 5 || Math.random() > 0.99 / (depth / 2)) {
242
- return expr;
243
- }
244
-
245
- var deadCode = safeCallExpression((0, _random.choice)(sampledArray), (0, _random.getRandomInteger)(-250, 250));
246
-
247
- if (Math.random() > 0.5) {
248
- return (0, _gen.ConditionalExpression)(truePredicate(), ternaryHell(expr, depth + 1), ternaryHell(deadCode, depth + 1));
249
- }
250
-
251
- return (0, _gen.ConditionalExpression)(falsePredicate(), ternaryHell(deadCode, depth + 1), ternaryHell(expr, depth + 1));
252
- } // Array of random ternary expressions
253
-
254
-
255
- var concealedCall = []; // Add 'dead calls', these expression don't call anything
256
-
257
- Array((0, _random.getRandomInteger)(2, 8)).fill(0).forEach(() => {
258
- concealedCall.push((0, _gen.ExpressionStatement)(ternaryHell(safeCallExpression((0, _random.choice)(deadNameArray), (0, _random.getRandomInteger)(-250, 250)))));
259
- }); // The real call to the 'init' function
260
-
261
- concealedCall.push((0, _gen.ExpressionStatement)(ternaryHell(safeCallExpression(initName, check))));
262
- (0, _random.shuffle)(concealedCall);
263
- (0, _random.shuffle)(functions);
264
- object.body = [...addNodes, ...functions, ...concealedCall];
265
- };
266
- }
267
-
268
- }
269
-
270
- exports.default = HideInitializingCode;