js-confuser 1.5.8 → 1.6.0

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 (139) hide show
  1. package/.github/workflows/node.js.yml +2 -2
  2. package/CHANGELOG.md +69 -0
  3. package/README.md +143 -7
  4. package/dist/index.js +33 -4
  5. package/dist/obfuscator.js +30 -31
  6. package/dist/options.js +4 -5
  7. package/dist/order.js +4 -6
  8. package/dist/probability.js +2 -4
  9. package/dist/templates/bufferToString.js +13 -0
  10. package/dist/templates/crash.js +2 -2
  11. package/dist/templates/es5.js +18 -0
  12. package/dist/transforms/antiTooling.js +1 -1
  13. package/dist/transforms/calculator.js +77 -21
  14. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +980 -367
  15. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +8 -3
  16. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +25 -26
  17. package/dist/transforms/deadCode.js +33 -25
  18. package/dist/transforms/dispatcher.js +7 -6
  19. package/dist/transforms/es5/antiClass.js +6 -2
  20. package/dist/transforms/es5/antiDestructuring.js +3 -1
  21. package/dist/transforms/es5/es5.js +31 -34
  22. package/dist/transforms/eval.js +11 -0
  23. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +8 -5
  24. package/dist/transforms/extraction/objectExtraction.js +6 -1
  25. package/dist/transforms/finalizer.js +82 -0
  26. package/dist/transforms/flatten.js +82 -55
  27. package/dist/transforms/hexadecimalNumbers.js +34 -9
  28. package/dist/transforms/identifier/globalAnalysis.js +88 -0
  29. package/dist/transforms/identifier/globalConcealing.js +10 -83
  30. package/dist/transforms/identifier/movedDeclarations.js +2 -8
  31. package/dist/transforms/identifier/renameVariables.js +39 -27
  32. package/dist/transforms/identifier/variableAnalysis.js +58 -62
  33. package/dist/transforms/minify.js +80 -61
  34. package/dist/transforms/opaquePredicates.js +1 -1
  35. package/dist/transforms/preparation/preparation.js +2 -2
  36. package/dist/transforms/preparation.js +231 -0
  37. package/dist/transforms/renameLabels.js +1 -1
  38. package/dist/transforms/rgf.js +4 -5
  39. package/dist/transforms/stack.js +87 -26
  40. package/dist/transforms/string/encoding.js +150 -179
  41. package/dist/transforms/string/stringCompression.js +14 -15
  42. package/dist/transforms/string/stringConcealing.js +25 -8
  43. package/dist/transforms/string/stringEncoding.js +13 -24
  44. package/dist/transforms/transform.js +11 -18
  45. package/dist/traverse.js +24 -18
  46. package/dist/util/compare.js +2 -2
  47. package/dist/util/gen.js +15 -0
  48. package/dist/util/insert.js +31 -7
  49. package/dist/util/random.js +15 -0
  50. package/package.json +5 -5
  51. package/src/index.ts +57 -19
  52. package/src/obfuscator.ts +26 -29
  53. package/src/options.ts +17 -21
  54. package/src/order.ts +4 -8
  55. package/src/probability.ts +2 -3
  56. package/src/templates/bufferToString.ts +68 -0
  57. package/src/templates/crash.ts +5 -9
  58. package/src/templates/es5.ts +131 -0
  59. package/src/transforms/antiTooling.ts +1 -1
  60. package/src/transforms/calculator.ts +122 -59
  61. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +1583 -571
  62. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +18 -3
  63. package/src/transforms/deadCode.ts +383 -26
  64. package/src/transforms/dispatcher.ts +8 -6
  65. package/src/transforms/es5/antiClass.ts +10 -1
  66. package/src/transforms/es5/antiDestructuring.ts +3 -1
  67. package/src/transforms/es5/es5.ts +32 -77
  68. package/src/transforms/eval.ts +18 -0
  69. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -6
  70. package/src/transforms/extraction/objectExtraction.ts +12 -5
  71. package/src/transforms/finalizer.ts +75 -0
  72. package/src/transforms/flatten.ts +194 -151
  73. package/src/transforms/identifier/globalAnalysis.ts +85 -0
  74. package/src/transforms/identifier/globalConcealing.ts +14 -103
  75. package/src/transforms/identifier/movedDeclarations.ts +4 -11
  76. package/src/transforms/identifier/renameVariables.ts +37 -30
  77. package/src/transforms/identifier/variableAnalysis.ts +66 -73
  78. package/src/transforms/minify.ts +116 -77
  79. package/src/transforms/opaquePredicates.ts +2 -2
  80. package/src/transforms/preparation.ts +238 -0
  81. package/src/transforms/renameLabels.ts +2 -2
  82. package/src/transforms/rgf.ts +6 -7
  83. package/src/transforms/stack.ts +97 -37
  84. package/src/transforms/string/encoding.ts +115 -212
  85. package/src/transforms/string/stringCompression.ts +27 -18
  86. package/src/transforms/string/stringConcealing.ts +41 -11
  87. package/src/transforms/string/stringEncoding.ts +18 -18
  88. package/src/transforms/transform.ts +15 -21
  89. package/src/traverse.ts +24 -12
  90. package/src/types.ts +11 -2
  91. package/src/util/compare.ts +2 -2
  92. package/src/util/gen.ts +21 -1
  93. package/src/util/insert.ts +49 -9
  94. package/src/util/random.ts +13 -0
  95. package/test/code/Cash.test.ts +1 -1
  96. package/test/code/Dynamic.test.ts +12 -10
  97. package/test/code/ES6.src.js +136 -0
  98. package/test/code/ES6.test.ts +28 -2
  99. package/test/code/NewFeatures.test.ts +19 -0
  100. package/test/index.test.ts +15 -2
  101. package/test/probability.test.ts +44 -0
  102. package/test/templates/template.test.ts +1 -1
  103. package/test/transforms/antiTooling.test.ts +52 -0
  104. package/test/transforms/calculator.test.ts +40 -0
  105. package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +713 -149
  106. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +173 -0
  107. package/test/transforms/deadCode.test.ts +66 -15
  108. package/test/transforms/dispatcher.test.ts +44 -1
  109. package/test/transforms/es5/antiClass.test.ts +33 -0
  110. package/test/transforms/es5/antiDestructuring.test.ts +16 -0
  111. package/test/transforms/eval.test.ts +53 -0
  112. package/test/transforms/extraction/objectExtraction.test.ts +21 -0
  113. package/test/transforms/flatten.test.ts +195 -3
  114. package/test/transforms/identifier/movedDeclarations.test.ts +27 -0
  115. package/test/transforms/identifier/renameVariables.test.ts +108 -0
  116. package/test/transforms/lock/antiDebug.test.ts +2 -2
  117. package/test/transforms/minify.test.ts +151 -0
  118. package/test/transforms/preparation.test.ts +157 -0
  119. package/test/transforms/rgf.test.ts +56 -29
  120. package/test/transforms/stack.test.ts +91 -21
  121. package/test/transforms/string/stringCompression.test.ts +39 -0
  122. package/test/transforms/string/stringConcealing.test.ts +115 -0
  123. package/test/transforms/string/stringEncoding.test.ts +53 -2
  124. package/test/transforms/transform.test.ts +66 -0
  125. package/test/traverse.test.ts +139 -0
  126. package/test/util/compare.test.ts +23 -1
  127. package/src/transforms/controlFlowFlattening/choiceFlowObfuscation.ts +0 -87
  128. package/src/transforms/controlFlowFlattening/controlFlowObfuscation.ts +0 -203
  129. package/src/transforms/controlFlowFlattening/switchCaseObfuscation.ts +0 -130
  130. package/src/transforms/hexadecimalNumbers.ts +0 -31
  131. package/src/transforms/hideInitializingCode.ts +0 -432
  132. package/src/transforms/label.ts +0 -64
  133. package/src/transforms/preparation/nameConflicts.ts +0 -102
  134. package/src/transforms/preparation/preparation.ts +0 -176
  135. package/test/transforms/controlFlowFlattening/controlFlowObfuscation.test.ts +0 -101
  136. package/test/transforms/controlFlowFlattening/switchCaseObfuscation.test.ts +0 -120
  137. package/test/transforms/hideInitializingCode.test.ts +0 -336
  138. package/test/transforms/preparation/nameConflicts.test.ts +0 -52
  139. package/test/transforms/preparation/preparation.test.ts +0 -62
@@ -10,200 +10,171 @@ var _template = _interopRequireDefault(require("../../templates/template"));
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
11
 
12
12
  const Encoding = {
13
- ascii85: {
14
- encode(a) {
15
- var b, c, d, e, f, g, h, i, j, k; // @ts-ignore
16
-
17
- for ( // @ts-ignore
18
- !/[^\x00-\xFF]/.test(a), b = "\x00\x00\x00\x00".slice(a.length % 4 || 4), a += b, c = [], d = 0, e = a.length; e > d; d += 4) f = (a.charCodeAt(d) << 24) + (a.charCodeAt(d + 1) << 16) + (a.charCodeAt(d + 2) << 8) + a.charCodeAt(d + 3), 0 !== f ? (k = f % 85, f = (f - k) / 85, j = f % 85, f = (f - j) / 85, i = f % 85, f = (f - i) / 85, h = f % 85, f = (f - h) / 85, g = f % 85, c.push(g + 33, h + 33, i + 33, j + 33, k + 33)) : c.push(122);
19
-
20
- return function (a, b) {
21
- for (var c = b; c > 0; c--) a.pop();
22
- }(c, b.length), "<~" + String.fromCharCode.apply(String, c) + "~>";
23
- },
24
-
25
- decode(a) {
26
- var c,
27
- d,
28
- e,
29
- f,
30
- g,
31
- h = String,
32
- l = "length",
33
- w = 255,
34
- x = "charCodeAt",
35
- y = "slice",
36
- z = "replace";
37
-
38
- for ("<~" === a[y](0, 2) && "~>" === a[y](-2), a = a[y](2, -2)[z](/s/g, "")[z]("z", "!!!!!"), c = "uuuuu"[y](a[l] % 5 || 5), a += c, e = [], f = 0, g = a[l]; g > f; f += 5) d = 52200625 * (a[x](f) - 33) + 614125 * (a[x](f + 1) - 33) + 7225 * (a[x](f + 2) - 33) + 85 * (a[x](f + 3) - 33) + (a[x](f + 4) - 33), e.push(w & d >> 24, w & d >> 16, w & d >> 8, w & d);
39
-
40
- return function (a, b) {
41
- for (var c = b; c > 0; c--) a.pop();
42
- }(e, c[l]), h.fromCharCode.apply(h, e);
43
- },
44
-
45
- template: (0, _template.default)("\n function {name}(a, LL = [\"fromCharCode\", \"apply\"]) {\n var c, d, e, f, g, h = String, l = \"length\", w = 255, x = \"charCodeAt\", y = \"slice\", z = \"replace\";\n for (\"<~\" === a[y](0, 2) && \"~>\" === a[y](-2), a = a[y](2, -2)[z](/s/g, \"\")[z](\"z\", \"!!!!!\"), \n c = \"uuuuu\"[y](a[l] % 5 || 5), a += c, e = [], f = 0, g = a[l]; g > f; f += 5) d = 52200625 * (a[x](f) - 33) + 614125 * (a[x](f + 1) - 33) + 7225 * (a[x](f + 2) - 33) + 85 * (a[x](f + 3) - 33) + (a[x](f + 4) - 33), \n e.push(w & d >> 24, w & d >> 16, w & d >> 8, w & d);\n return function(a, b) {\n for (var c = b; c > 0; c--) a.pop();\n }(e, c[l]), h[LL[0]][LL[1]](h, e);\n }\n ")
46
- },
47
- base32: {
48
- encode: function (s) {
49
- var a = "!\"#$%&'()*+,-./0123456789:;<=>?@";
50
- var len = s.length;
51
- var o = "";
52
- var w,
53
- c,
54
- r = 0,
55
- sh = 0,
56
- i;
57
-
58
- for (i = 0; i < len; i += 5) {
59
- // mask top 5 bits
60
- c = s.charCodeAt(i);
61
- w = 0xf8 & c;
62
- o += a.charAt(w >> 3);
63
- r = 0x07 & c;
64
- sh = 2;
65
-
66
- if (i + 1 < len) {
67
- c = s.charCodeAt(i + 1); // mask top 2 bits
68
-
69
- w = 0xc0 & c;
70
- o += a.charAt((r << 2) + (w >> 6));
71
- o += a.charAt((0x3e & c) >> 1);
72
- r = c & 0x01;
73
- sh = 4;
74
- }
75
-
76
- if (i + 2 < len) {
77
- c = s.charCodeAt(i + 2); // mask top 4 bits
78
-
79
- w = 0xf0 & c;
80
- o += a.charAt((r << 4) + (w >> 4));
81
- r = 0x0f & c;
82
- sh = 1;
83
- }
84
-
85
- if (i + 3 < len) {
86
- c = s.charCodeAt(i + 3); // mask top 1 bit
87
-
88
- w = 0x80 & c;
89
- o += a.charAt((r << 1) + (w >> 7));
90
- o += a.charAt((0x7c & c) >> 2);
91
- r = 0x03 & c;
92
- sh = 3;
93
- }
94
-
95
- if (i + 4 < len) {
96
- c = s.charCodeAt(i + 4); // mask top 3 bits
97
-
98
- w = 0xe0 & c;
99
- o += a.charAt((r << 3) + (w >> 5));
100
- o += a.charAt(0x1f & c);
101
- r = 0;
102
- sh = 0;
13
+ base91: {
14
+ encode(str) {
15
+ const table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
16
+ const raw = Buffer.from(str, "utf-8");
17
+ const len = raw.length;
18
+ let ret = "";
19
+ let n = 0;
20
+ let b = 0;
21
+
22
+ for (let i = 0; i < len; i++) {
23
+ b |= raw[i] << n;
24
+ n += 8;
25
+
26
+ if (n > 13) {
27
+ let v = b & 8191;
28
+
29
+ if (v > 88) {
30
+ b >>= 13;
31
+ n -= 13;
32
+ } else {
33
+ v = b & 16383;
34
+ b >>= 14;
35
+ n -= 14;
36
+ }
37
+
38
+ ret += table[v % 91] + table[v / 91 | 0];
103
39
  }
104
- } // Calculate length of pad by getting the
105
- // number of words to reach an 8th octet.
106
-
107
-
108
- if (r != 0) {
109
- o += a.charAt(r << sh);
110
40
  }
111
41
 
112
- return o;
113
- },
114
- decode: function (s) {
115
- var v,
116
- x,
117
- bits = 0,
118
- o = "",
119
- len = s.length,
120
- d = String,
121
- e = "charCodeAt",
122
- f = "fromCharCode",
123
- i;
124
-
125
- for (i = 0; i < len; i += 1) {
126
- v = s[e](i) - 33, v >= 0 && v < 32 ? (bits += (x = x << 5 | v, 5), bits >= 8 ? bits -= (o += d[f](x >> bits - 8 & 0xff), 8) : 0) : 0;
42
+ if (n) {
43
+ ret += table[b % 91];
44
+ if (n > 7 || b > 90) ret += table[b / 91 | 0];
127
45
  }
128
46
 
129
- return o;
47
+ return ret;
130
48
  },
131
- template: (0, _template.default)("\n function {name}(s) {\n var v,\n x,\n b = 0,\n o = \"\",\n len = s.length,\n d = String,\n e = \"charCodeAt\",\n f = \"fromCharCode\", i;\n \n for (i = 0; i < len; i += 1) {\n (v = s[e](i) - 33),\n v >= 0 && v < 32\n ? ((b += ((x = (x << 5) | v), 5)),\n b >= 8\n ? (b -= ((o += d[f]((x >> (b - 8)) & 0xff)), 8))\n : 0)\n : 0;\n }\n return o;\n }\n ")
132
- },
133
- hexTable: {
134
- encode: function (str) {
135
- var output = "";
136
49
 
137
- for (var j = 0; j < str.length; j += 3) {
138
- var chunk = str.substring(j, j + 3);
139
-
140
- if (!chunk) {
141
- continue;
50
+ decode(str) {
51
+ const table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
52
+ const raw = "" + (str || "");
53
+ const len = raw.length;
54
+ const ret = [];
55
+ let b = 0;
56
+ let n = 0;
57
+ let v = -1;
58
+
59
+ for (let i = 0; i < len; i++) {
60
+ const p = table.indexOf(raw[i]);
61
+ if (p === -1) continue;
62
+
63
+ if (v < 0) {
64
+ v = p;
65
+ } else {
66
+ v += p * 91;
67
+ b |= v << n;
68
+ n += (v & 8191) > 88 ? 13 : 14;
69
+
70
+ do {
71
+ ret.push(b & 0xff);
72
+ b >>= 8;
73
+ n -= 8;
74
+ } while (n > 7);
75
+
76
+ v = -1;
142
77
  }
143
-
144
- chunk = chunk + "~";
145
- var uniqueChars = new Set([]);
146
-
147
- for (var char of chunk) {
148
- uniqueChars.add(char);
149
- }
150
-
151
- var keys = Array.from(uniqueChars).sort();
152
- var table = {},
153
- i = 0;
154
-
155
- for (var key of keys) {
156
- table[key] = i++;
157
- }
158
-
159
- var idx = [];
160
-
161
- for (var char of chunk) {
162
- idx.push(table[char]);
163
- }
164
-
165
- var table64 = "0x";
166
-
167
- for (var i = keys.length - 1; i >= 0; i--) {
168
- table64 += keys[i].charCodeAt(0).toString(16).toUpperCase();
169
- }
170
-
171
- var idxInt = 0;
172
-
173
- for (var i = idx.length - 1; i >= 0; i--) {
174
- idxInt = idxInt << 3 | idx[i];
175
- }
176
-
177
- var idx64 = "0x" + idxInt.toString(16).toUpperCase(); // console.log(chunk, table, idx, table64, idx64);
178
-
179
- output += table64 + "," + idx64 + ",";
180
78
  }
181
79
 
182
- if (output.endsWith(",")) {
183
- output = output.substring(0, output.length - 1);
80
+ if (v > -1) {
81
+ ret.push((b | v << n) & 0xff);
184
82
  }
185
83
 
186
- return "{" + output + "}";
84
+ return Buffer.from(ret).toString("utf-8");
187
85
  },
188
- decode: function (str) {
189
- var output = "";
190
- str = str.substring(1, str.length - 1);
191
- var chunks = str.split(",");
192
-
193
- for (var i = 0; i < chunks.length; i += 2) {
194
- var arr = [chunks[i], chunks[i + 1]];
195
- var [table, idx] = arr.map(Number); // console.log(table, idx);
196
-
197
- while (idx) {
198
- output += String.fromCharCode(table >> 8 * (idx & 7) & 0xff);
199
- idx >>= 3;
200
- }
201
- }
202
86
 
203
- return output.replace(/~/g, "");
204
- },
205
- template: (0, _template.default)("\n function {name}(str){\n var output = \"\";\n \n str = str.substring(1, str.length - 1);\n var chunks = str.split(\",\");\n \n for (var i = 0; i < chunks.length; i += 2) {\n var arr = [chunks[i], chunks[i + 1]];\n \n var [table, idx] = arr.map(Number);\n \n // console.log(table, idx);\n while (idx) {\n output += String.fromCharCode((table >> (8 * (idx & 7))) & 0xff);\n idx >>= 3;\n }\n }\n \n return output.replace(/~/g, \"\");\n }\n \n ")
87
+ template: (0, _template.default)(" \n function {name}(str){\n const table =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~\"';\n\n const raw = \"\" + (str || \"\");\n const len = raw.length;\n const ret = [];\n\n let b = 0;\n let n = 0;\n let v = -1;\n\n for (let i = 0; i < len; i++) {\n const p = table.indexOf(raw[i]);\n if (p === -1) continue;\n if (v < 0) {\n v = p;\n } else {\n v += p * 91;\n b |= v << n;\n n += (v & 8191) > 88 ? 13 : 14;\n do {\n ret.push(b & 0xff);\n b >>= 8;\n n -= 8;\n } while (n > 7);\n v = -1;\n }\n }\n\n if (v > -1) {\n ret.push((b | (v << n)) & 0xff);\n }\n\n return {bufferToString}(ret);\n }\n ")
206
88
  }
89
+ /* ascii85: { This implementation is flaky and causes decoding errors
90
+ encode(a) {
91
+ var b, c, d, e, f, g, h, i, j, k;
92
+ // @ts-ignore
93
+ for (
94
+ // @ts-ignore
95
+ !/[^\x00-\xFF]/.test(a),
96
+ b = "\x00\x00\x00\x00".slice(a.length % 4 || 4),
97
+ a += b,
98
+ c = [],
99
+ d = 0,
100
+ e = a.length;
101
+ e > d;
102
+ d += 4
103
+ )
104
+ (f =
105
+ (a.charCodeAt(d) << 24) +
106
+ (a.charCodeAt(d + 1) << 16) +
107
+ (a.charCodeAt(d + 2) << 8) +
108
+ a.charCodeAt(d + 3)),
109
+ 0 !== f
110
+ ? ((k = f % 85),
111
+ (f = (f - k) / 85),
112
+ (j = f % 85),
113
+ (f = (f - j) / 85),
114
+ (i = f % 85),
115
+ (f = (f - i) / 85),
116
+ (h = f % 85),
117
+ (f = (f - h) / 85),
118
+ (g = f % 85),
119
+ c.push(g + 33, h + 33, i + 33, j + 33, k + 33))
120
+ : c.push(122);
121
+ return (
122
+ (function (a, b) {
123
+ for (var c = b; c > 0; c--) a.pop();
124
+ })(c, b.length),
125
+ "<~" + String.fromCharCode.apply(String, c) + "~>"
126
+ );
127
+ },
128
+ decode(a) {
129
+ var c,
130
+ d,
131
+ e,
132
+ f,
133
+ g,
134
+ h = String,
135
+ l = "length",
136
+ w = 255,
137
+ x = "charCodeAt",
138
+ y = "slice",
139
+ z = "replace";
140
+ for (
141
+ "<~" === a[y](0, 2) && "~>" === a[y](-2),
142
+ a = a[y](2, -2)[z](/s/g, "")[z]("z", "!!!!!"),
143
+ c = "uuuuu"[y](a[l] % 5 || 5),
144
+ a += c,
145
+ e = [],
146
+ f = 0,
147
+ g = a[l];
148
+ g > f;
149
+ f += 5
150
+ )
151
+ (d =
152
+ 52200625 * (a[x](f) - 33) +
153
+ 614125 * (a[x](f + 1) - 33) +
154
+ 7225 * (a[x](f + 2) - 33) +
155
+ 85 * (a[x](f + 3) - 33) +
156
+ (a[x](f + 4) - 33)),
157
+ e.push(w & (d >> 24), w & (d >> 16), w & (d >> 8), w & d);
158
+ return (
159
+ (function (a, b) {
160
+ for (var c = b; c > 0; c--) a.pop();
161
+ })(e, c[l]),
162
+ h.fromCharCode.apply(h, e)
163
+ );
164
+ },
165
+ template: Template(`
166
+ function {name}(a, LL = ["fromCharCode", "apply"]) {
167
+ var c, d, e, f, g, h = String, l = "length", w = 255, x = "charCodeAt", y = "slice", z = "replace";
168
+ for ("<~" === a[y](0, 2) && "~>" === a[y](-2), a = a[y](2, -2)[z](/\s/g, "")[z]("z", "!!!!!"),
169
+ c = "uuuuu"[y](a[l] % 5 || 5), a += c, e = [], f = 0, g = a[l]; g > f; f += 5) d = 52200625 * (a[x](f) - 33) + 614125 * (a[x](f + 1) - 33) + 7225 * (a[x](f + 2) - 33) + 85 * (a[x](f + 3) - 33) + (a[x](f + 4) - 33),
170
+ e.push(w & d >> 24, w & d >> 16, w & d >> 8, w & d);
171
+ return function(a, b) {
172
+ for (var c = b; c > 0; c--) a.pop();
173
+ }(e, c[l]), h[LL[0]][LL[1]](h, e);
174
+ }
175
+ `),
176
+ }, */
177
+
207
178
  };
208
179
  var _default = Encoding;
209
180
  exports.default = _default;
@@ -23,6 +23,8 @@ var _transform = _interopRequireDefault(require("../transform"));
23
23
 
24
24
  var _stringConcealing = require("./stringConcealing");
25
25
 
26
+ var _random = require("../../util/random");
27
+
26
28
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
29
 
28
30
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@@ -74,7 +76,7 @@ class StringCompression extends _transform.default {
74
76
 
75
77
  _defineProperty(this, "string", void 0);
76
78
 
77
- _defineProperty(this, "delimiter", "1");
79
+ _defineProperty(this, "delimiter", "|");
78
80
 
79
81
  _defineProperty(this, "fnName", void 0);
80
82
 
@@ -98,7 +100,7 @@ class StringCompression extends _transform.default {
98
100
  var encoded = LZ_encode(this.string);
99
101
 
100
102
  if (LZ_decode(encoded) !== this.string) {
101
- this.error(new Error("String failed to be decoded"));
103
+ this.error(new Error("String failed to be decoded. Try disabling the 'stringCompression' option."));
102
104
  }
103
105
 
104
106
  var getStringParamName = this.getPlaceholder();
@@ -130,33 +132,30 @@ class StringCompression extends _transform.default {
130
132
  return;
131
133
  }
132
134
 
133
- if (!(0, _probability.ComputeProbabilityMap)(object.value, x => x)) {
135
+ if (!(0, _probability.ComputeProbabilityMap)(this.options.stringCompression, x => x, object.value)) {
134
136
  return;
135
- }
137
+ } // HARD CODED LIMIT of 10,000 (after 1,000 elements)
136
138
 
137
- var index = this.map.get(object.value);
139
+
140
+ if (this.map.size > 1000 && !(0, _random.chance)(this.map.size / 100)) return;
141
+ var index = this.map.get(object.value); // New string, add it!
138
142
 
139
143
  if (typeof index !== "number") {
144
+ // Ensure the string gets properly decoded
140
145
  if (LZ_decode(LZ_encode(object.value)) !== object.value) {
141
146
  this.ignore.add(object.value);
142
147
  return;
143
148
  }
144
149
 
145
- var before = this.string;
146
150
  index = this.map.size;
147
151
  this.map.set(object.value, index);
148
- this.string += object.value + this.delimiter; // allow rollback if string becomes corrupted
149
-
150
- if (LZ_decode(LZ_encode(this.string)) !== this.string) {
151
- this.string = before;
152
- this.map.delete(object.value);
153
- this.ignore.add(object.value);
154
- return;
155
- }
152
+ this.string += object.value + this.delimiter;
156
153
  }
157
154
 
158
155
  (0, _assert.ok)(typeof index === "number");
159
- this.replaceIdentifierOrLiteral(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.fnName), [(0, _gen.Literal)(index)]), parents);
156
+ return () => {
157
+ this.replaceIdentifierOrLiteral(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.fnName), [(0, _gen.Literal)(index)]), parents);
158
+ };
160
159
  }
161
160
 
162
161
  }
@@ -26,6 +26,10 @@ var _transform = _interopRequireDefault(require("../transform"));
26
26
 
27
27
  var _encoding = _interopRequireDefault(require("./encoding"));
28
28
 
29
+ var _probability = require("../../probability");
30
+
31
+ var _bufferToString = require("../../templates/bufferToString");
32
+
29
33
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
30
34
 
31
35
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@@ -95,6 +99,11 @@ class StringConcealing extends _transform.default {
95
99
  apply(tree) {
96
100
  super.apply(tree);
97
101
  var cacheName = this.getPlaceholder();
102
+ var bufferToStringName = this.getPlaceholder(); // This helper functions convert UInt8 Array to UTf-string
103
+
104
+ (0, _insert.prepend)(tree, ..._bufferToString.BufferToStringTemplate.compile({
105
+ name: bufferToStringName
106
+ }));
98
107
  Object.keys(this.encoding).forEach(type => {
99
108
  var {
100
109
  template
@@ -102,7 +111,8 @@ class StringConcealing extends _transform.default {
102
111
  var decodeFn = this.getPlaceholder();
103
112
  var getterFn = this.encoding[type];
104
113
  (0, _insert.append)(tree, template.single({
105
- name: decodeFn
114
+ name: decodeFn,
115
+ bufferToString: bufferToStringName
106
116
  }));
107
117
  (0, _insert.append)(tree, (0, _template.default)("\n \n function ".concat(getterFn, "(x, y, z, a = ").concat(decodeFn, ", b = ").concat(cacheName, "){\n if ( z ) {\n return y[").concat(cacheName, "[z]] = ").concat(getterFn, "(x, y);\n } else if ( y ) {\n [b, y] = [a(b), x || z]\n }\n \n return y ? x[b[y]] : ").concat(cacheName, "[x] || (z=(b[x], a), ").concat(cacheName, "[x] = z(").concat(this.arrayName, "[x]))\n }\n \n ")).single());
108
118
  });
@@ -122,12 +132,19 @@ class StringConcealing extends _transform.default {
122
132
  // Empty strings are discarded
123
133
  if (!object.value || this.ignore.has(object.value) || object.value.length == 0) {
124
134
  return;
125
- }
135
+ } // Allow user to choose which strings get changed
136
+
137
+
138
+ if (!(0, _probability.ComputeProbabilityMap)(this.options.stringConcealing, x => x, object.value)) {
139
+ return;
140
+ } // HARD CODED LIMIT of 10,000 (after 1,000 elements)
141
+
126
142
 
143
+ if (this.set.size > 1000 && !(0, _random.chance)(this.set.size / 100)) return;
127
144
  var types = Object.keys(this.encoding);
128
145
  var type = (0, _random.choice)(types);
129
146
 
130
- if (!type || !this.hasAllEncodings && Math.random() > 0.9) {
147
+ if (!type || !this.hasAllEncodings && (0, _random.chance)(10)) {
131
148
  var allowed = Object.keys(_encoding.default).filter(type => !this.encoding[type]);
132
149
 
133
150
  if (!allowed.length) {
@@ -165,16 +182,16 @@ class StringConcealing extends _transform.default {
165
182
  (0, _assert.ok)(index != -1, "index == -1");
166
183
  var callExpr = (0, _gen.CallExpression)((0, _gen.Identifier)(fnName), [(0, _gen.Literal)(index)]); // use `.apply` to fool automated de-obfuscators
167
184
 
168
- if (Math.random() > 0.5) {
169
- callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.Identifier)("apply"), false), [(0, _gen.ThisExpression)(), (0, _gen.ArrayExpression)([(0, _gen.Literal)(index)])]);
185
+ if ((0, _random.chance)(10)) {
186
+ callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.Literal)("apply"), true), [(0, _gen.Identifier)("undefined"), (0, _gen.ArrayExpression)([(0, _gen.Literal)(index)])]);
170
187
  } // use `.call`
171
- else if (Math.random() > 0.5) {
172
- callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.Identifier)("call"), false), [(0, _gen.ThisExpression)(), (0, _gen.Literal)(index)]);
188
+ else if ((0, _random.chance)(10)) {
189
+ callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.Literal)("call"), true), [(0, _gen.Identifier)("undefined"), (0, _gen.Literal)(index)]);
173
190
  }
174
191
 
175
192
  var referenceType = "call";
176
193
 
177
- if (parents.length && Math.random() < 0.5 / this.variablesMade) {
194
+ if (parents.length && (0, _random.chance)(50 - this.variablesMade)) {
178
195
  referenceType = "constantReference";
179
196
  }
180
197
 
@@ -9,15 +9,15 @@ var _transform = _interopRequireDefault(require("../transform"));
9
9
 
10
10
  var _random = require("../../util/random");
11
11
 
12
- var _order = require("../../order");
13
-
14
12
  var _compare = require("../../util/compare");
15
13
 
16
14
  var _stringConcealing = require("./stringConcealing");
17
15
 
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ var _probability = require("../../probability");
19
17
 
20
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
18
+ var _gen = require("../../util/gen");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
21
 
22
22
  function pad(x, len) {
23
23
  while (x.length < len) {
@@ -73,34 +73,23 @@ function toUnicodeRepresentation(str) {
73
73
 
74
74
  class StringEncoding extends _transform.default {
75
75
  constructor(o) {
76
- super(o, _order.ObfuscateOrder.StringEncoding);
77
-
78
- _defineProperty(this, "seen", void 0);
79
- }
80
-
81
- apply(tree) {
82
- this.seen = new Set();
83
- super.apply(tree);
76
+ super(o);
84
77
  }
85
78
 
86
79
  match(object, parents) {
87
- return object.type == "Literal" && typeof object.value === "string" && !(0, _stringConcealing.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
80
+ return object.type == "Literal" && typeof object.value === "string" && object.value.length > 0 && !(0, _stringConcealing.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
88
81
  }
89
82
 
90
83
  transform(object, parents) {
91
- // Todo fix circular json problems
92
- if (this.seen.has(object)) {
93
- return;
94
- }
95
-
96
- this.seen.add(object);
84
+ // Allow percentages
85
+ if (!(0, _probability.ComputeProbabilityMap)(this.options.stringEncoding, x => x, object.value)) return;
97
86
  var type = (0, _random.choice)(["hexadecimal", "unicode"]);
98
- var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(object.value); // escodegen tries to escape backslashes, here is a work-around
87
+ var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(object.value);
88
+ return () => {
89
+ if (object.type !== "Literal") return; // ESCodeGen tries to escape backslashes, here is a work-around
99
90
 
100
- this.replace(object, {
101
- type: "Identifier",
102
- name: "'".concat(escapedString, "'")
103
- });
91
+ this.replace(object, (0, _gen.Identifier)("'".concat(escapedString, "'")));
92
+ };
104
93
  }
105
94
 
106
95
  }
@@ -81,10 +81,6 @@ class Transform {
81
81
  /**
82
82
  * Transforms to run after.
83
83
  */
84
-
85
- /**
86
- * Transformations to run at the same time (can cause conflicts so use sparingly)
87
- */
88
84
  constructor(obfuscator) {
89
85
  let priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
90
86
 
@@ -98,15 +94,12 @@ class Transform {
98
94
 
99
95
  _defineProperty(this, "after", void 0);
100
96
 
101
- _defineProperty(this, "concurrent", void 0);
102
-
103
97
  (0, _assert.ok)(obfuscator instanceof _obfuscator.default, "obfuscator should be an Obfuscator");
104
98
  this.obfuscator = obfuscator;
105
99
  this.options = this.obfuscator.options;
106
100
  this.priority = priority;
107
101
  this.before = [];
108
102
  this.after = [];
109
- this.concurrent = [];
110
103
  }
111
104
  /**
112
105
  * The transformation name.
@@ -136,12 +129,12 @@ class Transform {
136
129
 
137
130
 
138
131
  this.before.forEach(x => x.apply(tree));
139
- (0, _traverse.default)(tree, (object, parents) => {
140
- var fns = [];
141
- fns.push(this.input(object, parents)); // Fix 1. Increase performance with multiple transforms on one iteration.
132
+ /**
133
+ * Run this transformation
134
+ */
142
135
 
143
- this.concurrent.forEach(x => fns.push(x.input(object, parents)));
144
- return () => fns.forEach(x => x && x());
136
+ (0, _traverse.default)(tree, (object, parents) => {
137
+ return this.input(object, parents);
145
138
  });
146
139
  /**
147
140
  * Cleanup transformations
@@ -206,14 +199,13 @@ class Transform {
206
199
  }
207
200
  /**
208
201
  * Returns an independent name generator with it's own counter.
209
- * @param offset
202
+ * @param overrideMode - Override the user's `identifierGenerator` option
210
203
  * @returns
211
204
  */
212
205
 
213
206
 
214
- getGenerator() {
215
- let offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
216
- var count = offset;
207
+ getGenerator(overrideMode) {
208
+ var count = 0;
217
209
  var identifiers = new Set();
218
210
  return {
219
211
  generate: () => {
@@ -221,7 +213,7 @@ class Transform {
221
213
 
222
214
  do {
223
215
  count++;
224
- retValue = this.generateIdentifier(-1, count);
216
+ retValue = this.generateIdentifier(-1, count, overrideMode);
225
217
  } while (identifiers.has(retValue));
226
218
 
227
219
  identifiers.add(retValue);
@@ -239,6 +231,7 @@ class Transform {
239
231
  generateIdentifier() {
240
232
  let length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;
241
233
  let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
234
+ let overrideMode = arguments.length > 2 ? arguments[2] : undefined;
242
235
 
243
236
  if (length == -1) {
244
237
  length = (0, _random.getRandomInteger)(6, 8);
@@ -255,7 +248,7 @@ class Transform {
255
248
  var identifier;
256
249
 
257
250
  do {
258
- identifier = (0, _probability.ComputeProbabilityMap)(this.options.identifierGenerator, function () {
251
+ identifier = (0, _probability.ComputeProbabilityMap)(overrideMode || this.options.identifierGenerator, function () {
259
252
  let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "randomized";
260
253
 
261
254
  switch (mode) {