js-confuser 1.7.2 → 2.0.0-alpha.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 (263) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
  2. package/.github/workflows/node.js.yml +1 -1
  3. package/CHANGELOG.md +105 -0
  4. package/Migration.md +57 -0
  5. package/README.md +23 -913
  6. package/dist/constants.js +69 -13
  7. package/dist/index.js +108 -152
  8. package/dist/obfuscator.js +316 -118
  9. package/dist/options.js +1 -109
  10. package/dist/order.js +30 -30
  11. package/dist/presets.js +47 -45
  12. package/dist/probability.js +25 -32
  13. package/dist/templates/bufferToStringTemplate.js +9 -0
  14. package/dist/templates/deadCodeTemplates.js +9 -0
  15. package/dist/templates/getGlobalTemplate.js +19 -0
  16. package/dist/templates/integrityTemplate.js +30 -0
  17. package/dist/templates/setFunctionLengthTemplate.js +9 -0
  18. package/dist/templates/stringCompressionTemplate.js +10 -0
  19. package/dist/templates/tamperProtectionTemplates.js +21 -0
  20. package/dist/templates/template.js +213 -93
  21. package/dist/transforms/astScrambler.js +100 -0
  22. package/dist/transforms/calculator.js +70 -127
  23. package/dist/transforms/controlFlowFlattening.js +1182 -0
  24. package/dist/transforms/deadCode.js +62 -577
  25. package/dist/transforms/dispatcher.js +300 -309
  26. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
  27. package/dist/transforms/extraction/objectExtraction.js +131 -215
  28. package/dist/transforms/finalizer.js +56 -59
  29. package/dist/transforms/flatten.js +275 -276
  30. package/dist/transforms/functionOutlining.js +230 -0
  31. package/dist/transforms/identifier/globalConcealing.js +217 -103
  32. package/dist/transforms/identifier/movedDeclarations.js +167 -91
  33. package/dist/transforms/identifier/renameVariables.js +240 -187
  34. package/dist/transforms/lock/integrity.js +61 -184
  35. package/dist/transforms/lock/lock.js +263 -303
  36. package/dist/transforms/minify.js +431 -436
  37. package/dist/transforms/opaquePredicates.js +65 -118
  38. package/dist/transforms/pack.js +160 -0
  39. package/dist/transforms/plugin.js +179 -0
  40. package/dist/transforms/preparation.js +263 -163
  41. package/dist/transforms/renameLabels.js +132 -56
  42. package/dist/transforms/rgf.js +142 -240
  43. package/dist/transforms/shuffle.js +52 -145
  44. package/dist/transforms/string/encoding.js +45 -173
  45. package/dist/transforms/string/stringCompression.js +81 -126
  46. package/dist/transforms/string/stringConcealing.js +189 -224
  47. package/dist/transforms/string/stringEncoding.js +32 -40
  48. package/dist/transforms/string/stringSplitting.js +54 -55
  49. package/dist/transforms/variableMasking.js +232 -0
  50. package/dist/utils/ControlObject.js +125 -0
  51. package/dist/utils/IntGen.js +46 -0
  52. package/dist/utils/NameGen.js +106 -0
  53. package/dist/utils/ast-utils.js +560 -0
  54. package/dist/utils/function-utils.js +56 -0
  55. package/dist/utils/gen-utils.js +48 -0
  56. package/dist/utils/node.js +77 -0
  57. package/dist/utils/object-utils.js +21 -0
  58. package/dist/utils/random-utils.js +91 -0
  59. package/dist/utils/static-utils.js +64 -0
  60. package/dist/validateOptions.js +122 -0
  61. package/index.d.ts +1 -17
  62. package/package.json +27 -22
  63. package/src/constants.ts +139 -77
  64. package/src/index.ts +70 -163
  65. package/src/obfuscationResult.ts +43 -0
  66. package/src/obfuscator.ts +328 -135
  67. package/src/options.ts +154 -623
  68. package/src/order.ts +14 -14
  69. package/src/presets.ts +39 -34
  70. package/src/probability.ts +21 -36
  71. package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
  72. package/src/templates/deadCodeTemplates.ts +1185 -0
  73. package/src/templates/getGlobalTemplate.ts +72 -0
  74. package/src/templates/integrityTemplate.ts +69 -0
  75. package/src/templates/setFunctionLengthTemplate.ts +11 -0
  76. package/src/templates/stringCompressionTemplate.ts +42 -0
  77. package/src/templates/tamperProtectionTemplates.ts +116 -0
  78. package/src/templates/template.ts +183 -92
  79. package/src/transforms/astScrambler.ts +99 -0
  80. package/src/transforms/calculator.ts +96 -224
  81. package/src/transforms/controlFlowFlattening.ts +1594 -0
  82. package/src/transforms/deadCode.ts +85 -628
  83. package/src/transforms/dispatcher.ts +431 -636
  84. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
  85. package/src/transforms/extraction/objectExtraction.ts +160 -333
  86. package/src/transforms/finalizer.ts +63 -64
  87. package/src/transforms/flatten.ts +439 -557
  88. package/src/transforms/functionOutlining.ts +225 -0
  89. package/src/transforms/identifier/globalConcealing.ts +261 -189
  90. package/src/transforms/identifier/movedDeclarations.ts +228 -142
  91. package/src/transforms/identifier/renameVariables.ts +252 -258
  92. package/src/transforms/lock/integrity.ts +84 -260
  93. package/src/transforms/lock/lock.ts +342 -491
  94. package/src/transforms/minify.ts +523 -663
  95. package/src/transforms/opaquePredicates.ts +90 -229
  96. package/src/transforms/pack.ts +195 -0
  97. package/src/transforms/plugin.ts +185 -0
  98. package/src/transforms/preparation.ts +337 -215
  99. package/src/transforms/renameLabels.ts +176 -77
  100. package/src/transforms/rgf.ts +293 -386
  101. package/src/transforms/shuffle.ts +80 -254
  102. package/src/transforms/string/encoding.ts +26 -129
  103. package/src/transforms/string/stringCompression.ts +118 -236
  104. package/src/transforms/string/stringConcealing.ts +255 -339
  105. package/src/transforms/string/stringEncoding.ts +28 -47
  106. package/src/transforms/string/stringSplitting.ts +61 -75
  107. package/src/transforms/variableMasking.ts +257 -0
  108. package/src/utils/ControlObject.ts +141 -0
  109. package/src/utils/IntGen.ts +33 -0
  110. package/src/utils/NameGen.ts +106 -0
  111. package/src/utils/ast-utils.ts +667 -0
  112. package/src/utils/function-utils.ts +50 -0
  113. package/src/utils/gen-utils.ts +48 -0
  114. package/src/utils/node.ts +78 -0
  115. package/src/utils/object-utils.ts +21 -0
  116. package/src/utils/random-utils.ts +79 -0
  117. package/src/utils/static-utils.ts +66 -0
  118. package/src/validateOptions.ts +256 -0
  119. package/tsconfig.json +13 -8
  120. package/babel.config.js +0 -12
  121. package/dev.js +0 -8
  122. package/dist/compiler.js +0 -34
  123. package/dist/parser.js +0 -59
  124. package/dist/precedence.js +0 -66
  125. package/dist/templates/bufferToString.js +0 -108
  126. package/dist/templates/crash.js +0 -59
  127. package/dist/templates/es5.js +0 -137
  128. package/dist/templates/functionLength.js +0 -34
  129. package/dist/templates/globals.js +0 -9
  130. package/dist/transforms/antiTooling.js +0 -88
  131. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
  132. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
  133. package/dist/transforms/es5/antiClass.js +0 -164
  134. package/dist/transforms/es5/antiDestructuring.js +0 -193
  135. package/dist/transforms/es5/antiES6Object.js +0 -185
  136. package/dist/transforms/es5/antiSpreadOperator.js +0 -35
  137. package/dist/transforms/es5/antiTemplate.js +0 -66
  138. package/dist/transforms/es5/es5.js +0 -123
  139. package/dist/transforms/extraction/classExtraction.js +0 -83
  140. package/dist/transforms/identifier/globalAnalysis.js +0 -70
  141. package/dist/transforms/identifier/variableAnalysis.js +0 -104
  142. package/dist/transforms/lock/antiDebug.js +0 -76
  143. package/dist/transforms/stack.js +0 -343
  144. package/dist/transforms/transform.js +0 -350
  145. package/dist/traverse.js +0 -110
  146. package/dist/util/compare.js +0 -145
  147. package/dist/util/gen.js +0 -564
  148. package/dist/util/guard.js +0 -9
  149. package/dist/util/identifiers.js +0 -355
  150. package/dist/util/insert.js +0 -362
  151. package/dist/util/math.js +0 -19
  152. package/dist/util/object.js +0 -40
  153. package/dist/util/random.js +0 -130
  154. package/dist/util/scope.js +0 -20
  155. package/docs/ControlFlowFlattening.md +0 -595
  156. package/docs/Countermeasures.md +0 -63
  157. package/docs/ES5.md +0 -197
  158. package/docs/Integrity.md +0 -75
  159. package/docs/RGF.md +0 -419
  160. package/samples/example.js +0 -15
  161. package/samples/high.js +0 -1
  162. package/samples/input.js +0 -3
  163. package/samples/javascriptobfuscator.com.js +0 -8
  164. package/samples/jscrambler_advanced.js +0 -1894
  165. package/samples/jscrambler_light.js +0 -1134
  166. package/samples/low.js +0 -1
  167. package/samples/medium.js +0 -1
  168. package/samples/obfuscator.io.js +0 -1686
  169. package/samples/preemptive.com.js +0 -16
  170. package/src/compiler.ts +0 -35
  171. package/src/parser.ts +0 -49
  172. package/src/precedence.ts +0 -61
  173. package/src/templates/crash.ts +0 -55
  174. package/src/templates/es5.ts +0 -131
  175. package/src/templates/functionLength.ts +0 -32
  176. package/src/templates/globals.ts +0 -3
  177. package/src/transforms/antiTooling.ts +0 -102
  178. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
  179. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
  180. package/src/transforms/es5/antiClass.ts +0 -272
  181. package/src/transforms/es5/antiDestructuring.ts +0 -294
  182. package/src/transforms/es5/antiES6Object.ts +0 -267
  183. package/src/transforms/es5/antiSpreadOperator.ts +0 -56
  184. package/src/transforms/es5/antiTemplate.ts +0 -98
  185. package/src/transforms/es5/es5.ts +0 -149
  186. package/src/transforms/extraction/classExtraction.ts +0 -168
  187. package/src/transforms/identifier/globalAnalysis.ts +0 -85
  188. package/src/transforms/identifier/variableAnalysis.ts +0 -118
  189. package/src/transforms/lock/antiDebug.ts +0 -112
  190. package/src/transforms/stack.ts +0 -551
  191. package/src/transforms/transform.ts +0 -453
  192. package/src/traverse.ts +0 -120
  193. package/src/types.ts +0 -131
  194. package/src/util/compare.ts +0 -181
  195. package/src/util/gen.ts +0 -651
  196. package/src/util/guard.ts +0 -7
  197. package/src/util/identifiers.ts +0 -494
  198. package/src/util/insert.ts +0 -419
  199. package/src/util/math.ts +0 -15
  200. package/src/util/object.ts +0 -39
  201. package/src/util/random.ts +0 -141
  202. package/src/util/scope.ts +0 -21
  203. package/test/code/Cash.src.js +0 -1011
  204. package/test/code/Cash.test.ts +0 -49
  205. package/test/code/Dynamic.src.js +0 -118
  206. package/test/code/Dynamic.test.ts +0 -49
  207. package/test/code/ES6.src.js +0 -235
  208. package/test/code/ES6.test.ts +0 -42
  209. package/test/code/NewFeatures.test.ts +0 -19
  210. package/test/code/StrictMode.src.js +0 -65
  211. package/test/code/StrictMode.test.js +0 -37
  212. package/test/compare.test.ts +0 -104
  213. package/test/index.test.ts +0 -249
  214. package/test/options.test.ts +0 -132
  215. package/test/presets.test.ts +0 -22
  216. package/test/probability.test.ts +0 -44
  217. package/test/templates/template.test.ts +0 -14
  218. package/test/transforms/antiTooling.test.ts +0 -52
  219. package/test/transforms/calculator.test.ts +0 -78
  220. package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
  221. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
  222. package/test/transforms/deadCode.test.ts +0 -85
  223. package/test/transforms/dispatcher.test.ts +0 -457
  224. package/test/transforms/es5/antiClass.test.ts +0 -427
  225. package/test/transforms/es5/antiDestructuring.test.ts +0 -157
  226. package/test/transforms/es5/antiES6Object.test.ts +0 -245
  227. package/test/transforms/es5/antiTemplate.test.ts +0 -116
  228. package/test/transforms/es5/es5.test.ts +0 -110
  229. package/test/transforms/extraction/classExtraction.test.ts +0 -86
  230. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
  231. package/test/transforms/extraction/objectExtraction.test.ts +0 -491
  232. package/test/transforms/flatten.test.ts +0 -721
  233. package/test/transforms/hexadecimalNumbers.test.ts +0 -62
  234. package/test/transforms/identifier/globalConcealing.test.ts +0 -72
  235. package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
  236. package/test/transforms/identifier/renameVariables.test.ts +0 -621
  237. package/test/transforms/lock/antiDebug.test.ts +0 -66
  238. package/test/transforms/lock/browserLock.test.ts +0 -129
  239. package/test/transforms/lock/countermeasures.test.ts +0 -100
  240. package/test/transforms/lock/integrity.test.ts +0 -161
  241. package/test/transforms/lock/lock.test.ts +0 -204
  242. package/test/transforms/lock/osLock.test.ts +0 -312
  243. package/test/transforms/lock/selfDefending.test.ts +0 -68
  244. package/test/transforms/minify.test.ts +0 -575
  245. package/test/transforms/opaquePredicates.test.ts +0 -43
  246. package/test/transforms/preparation.test.ts +0 -157
  247. package/test/transforms/renameLabels.test.ts +0 -95
  248. package/test/transforms/rgf.test.ts +0 -378
  249. package/test/transforms/shuffle.test.ts +0 -135
  250. package/test/transforms/stack.test.ts +0 -573
  251. package/test/transforms/string/stringCompression.test.ts +0 -120
  252. package/test/transforms/string/stringConcealing.test.ts +0 -299
  253. package/test/transforms/string/stringEncoding.test.ts +0 -95
  254. package/test/transforms/string/stringSplitting.test.ts +0 -135
  255. package/test/transforms/transform.test.ts +0 -66
  256. package/test/traverse.test.ts +0 -139
  257. package/test/util/compare.test.ts +0 -34
  258. package/test/util/gen.test.ts +0 -121
  259. package/test/util/identifiers.test.ts +0 -253
  260. package/test/util/insert.test.ts +0 -142
  261. package/test/util/math.test.ts +0 -5
  262. package/test/util/random.test.ts +0 -71
  263. /package/dist/{types.js → obfuscationResult.js} +0 -0
@@ -1,243 +1,208 @@
1
1
  "use strict";
2
2
 
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.default = void 0;
7
- var _assert = require("assert");
8
- var _order = require("../../order");
7
+ exports["default"] = void 0;
8
+ var t = _interopRequireWildcard(require("@babel/types"));
9
9
  var _template = _interopRequireDefault(require("../../templates/template"));
10
- var _traverse = require("../../traverse");
11
- var _compare = require("../../util/compare");
12
- var _gen = require("../../util/gen");
13
- var _insert = require("../../util/insert");
14
- var _random = require("../../util/random");
15
- var _transform = _interopRequireDefault(require("../transform"));
16
- var _encoding = require("./encoding");
10
+ var _order = require("../../order");
17
11
  var _probability = require("../../probability");
18
- var _bufferToString = require("../../templates/bufferToString");
19
- var _constants = require("../../constants");
20
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
21
- 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; }
22
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
23
- 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); }
24
- class StringConcealing extends _transform.default {
25
- constructor(o) {
26
- super(o, _order.ObfuscateOrder.StringConcealing);
27
- _defineProperty(this, "arrayExpression", void 0);
28
- _defineProperty(this, "set", void 0);
29
- _defineProperty(this, "index", void 0);
30
- // index, fnName, block
31
- _defineProperty(this, "arrayName", this.getPlaceholder());
32
- _defineProperty(this, "ignore", new Set());
33
- _defineProperty(this, "variablesMade", 1);
34
- _defineProperty(this, "gen", void 0);
35
- _defineProperty(this, "functionObjects", []);
36
- this.set = new Set();
37
- this.index = Object.create(null);
38
- this.arrayExpression = (0, _gen.ArrayExpression)([]);
39
- this.gen = this.getGenerator();
40
- }
41
- apply(tree) {
42
- super.apply(tree);
43
-
44
- // Pad array with useless strings
45
- var dead = (0, _random.getRandomInteger)(5, 15);
46
- for (var i = 0; i < dead; i++) {
47
- var str = (0, _random.getRandomString)((0, _random.getRandomInteger)(5, 40));
48
- var fn = this.transform((0, _gen.Literal)(str), [tree]);
49
- if (fn) {
50
- fn();
51
- }
12
+ var _assert = require("assert");
13
+ var _bufferToStringTemplate = require("../../templates/bufferToStringTemplate");
14
+ var _getGlobalTemplate = require("../../templates/getGlobalTemplate");
15
+ var _astUtils = require("../../utils/ast-utils");
16
+ var _randomUtils = require("../../utils/random-utils");
17
+ var _encoding = require("./encoding");
18
+ var _node = require("../../utils/node");
19
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
20
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
21
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
22
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
23
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
24
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
25
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
26
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
27
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
28
+ var STRING_CONCEALING = Symbol("StringConcealing");
29
+ var _default = exports["default"] = function _default(_ref) {
30
+ var Plugin = _ref.Plugin;
31
+ var me = Plugin(_order.Order.StringConcealing, {
32
+ changeData: {
33
+ strings: 0
52
34
  }
53
- var cacheName = this.getPlaceholder();
54
- var bufferToStringName = this.getPlaceholder() + _constants.predictableFunctionTag;
55
-
56
- // This helper functions convert UInt8 Array to UTf-string
57
- (0, _insert.prepend)(tree, ..._bufferToString.BufferToStringTemplate.compile({
58
- name: bufferToStringName,
59
- getGlobalFnName: this.getPlaceholder() + _constants.predictableFunctionTag
60
- }));
61
- for (var functionObject of this.functionObjects) {
62
- var {
63
- block,
64
- fnName: getterFnName,
65
- encodingImplementation
66
- } = functionObject;
67
- var decodeFn = this.getPlaceholder() + _constants.predictableFunctionTag + _constants.criticalFunctionTag;
68
- (0, _insert.append)(block, encodingImplementation.template.single({
69
- __fnName__: decodeFn,
70
- __bufferToString__: bufferToStringName
71
- }));
72
- // All these are fake and never ran
73
- var ifStatements = (0, _template.default)(`if ( z == x ) {
74
- return y[${cacheName}[z]] = ${getterFnName}(x, y);
75
- }
76
- if ( y ) {
77
- [b, y] = [a(b), x || z]
78
- return ${getterFnName}(x, b, z)
79
- }
80
- if ( z && a !== ${decodeFn} ) {
81
- ${getterFnName} = ${decodeFn}
82
- return ${getterFnName}(x, -1, z, a, b)
83
- }
84
- if ( a === ${getterFnName} ) {
85
- ${decodeFn} = y
86
- return ${decodeFn}(z)
87
- }
88
- if( a === undefined ) {
89
- ${getterFnName} = b
90
- }
91
- if( z == a ) {
92
- return y ? x[b[y]] : ${cacheName}[x] || (z=(b[x] || a), ${cacheName}[x] = z(${this.arrayName}[x]))
93
- }
94
- `).compile();
35
+ });
36
+ var blocks = [];
37
+ var stringMap = new Map();
38
+ var stringArrayName = me.getPlaceholder() + "_array";
39
+ var encodingImplementations = Object.create(null);
40
+ var availableStringEncodings = me.options.customStringEncodings;
95
41
 
96
- // Not all fake if-statements are needed
97
- ifStatements = ifStatements.filter(() => (0, _random.chance)(50));
42
+ // If no custom encodings are provided, use the default encoding
43
+ if (!availableStringEncodings || availableStringEncodings.length === 0) {
44
+ availableStringEncodings = [_encoding.createDefaultStringEncoding];
45
+ }
46
+ function hasAllEncodings() {
47
+ return availableStringEncodings.length === 0;
48
+ }
49
+ function createStringEncoding() {
50
+ var encodingIndex = (0, _randomUtils.getRandomInteger)(0, availableStringEncodings.length);
51
+ var encoding = availableStringEncodings[encodingIndex];
52
+ if (typeof encoding === "function") {
53
+ encoding = encoding(encodingImplementations);
54
+ var duplicateIdentity = typeof encoding.identity !== "undefined" && typeof encodingImplementations[encoding.identity] !== "undefined";
55
+ if (duplicateIdentity || encoding === null) {
56
+ // Null returned -> All encodings have been created
57
+ // Duplicate identity -> Most likely all encodings have been created
98
58
 
99
- // This one is always used
100
- ifStatements.push((0, _template.default)(`
101
- if ( x !== y ) {
102
- return b[x] || (b[x] = a(${this.arrayName}[x]))
103
- }
104
- `).single());
105
- (0, _random.shuffle)(ifStatements);
106
- var varDeclaration = (0, _template.default)(`
107
- var ${getterFnName} = (x, y, z, a, b)=>{
108
- if(typeof a === "undefined") {
109
- a = ${decodeFn}
110
- }
111
- if(typeof b === "undefined") {
112
- b = ${cacheName}
113
- }
59
+ // No longer create new encodings using this function
60
+ availableStringEncodings = availableStringEncodings.filter(function (x) {
61
+ return x !== encoding;
62
+ });
63
+
64
+ // Return a random encoding already made
65
+ encoding = (0, _randomUtils.choice)(Object.values(encodingImplementations));
66
+ (0, _assert.ok)(encoding, "Failed to create main string encoding");
114
67
  }
115
- `).single();
116
- varDeclaration.declarations[0].init.body.body.push(...ifStatements);
117
- (0, _insert.prepend)(block, varDeclaration);
118
68
  }
119
- (0, _insert.prepend)(tree, (0, _gen.VariableDeclaration)([(0, _gen.VariableDeclarator)(cacheName, (0, _gen.ArrayExpression)([])), (0, _gen.VariableDeclarator)(this.arrayName, this.arrayExpression)]));
120
- }
121
- match(object, parents) {
122
- return object.type == "Literal" && typeof object.value === "string" && object.value.length >= 3 && !(0, _compare.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents) //&&
123
- /*!parents.find((x) => x.$dispatcherSkip)*/;
69
+ if (typeof encoding.identity === "undefined") {
70
+ encoding.identity = encodingIndex.toString();
71
+ }
72
+ if (typeof encoding.code === "string") {
73
+ encoding.code = new _template["default"](encoding.code);
74
+ }
75
+ encodingImplementations[encoding.identity] = encoding;
76
+ return encoding;
124
77
  }
125
- transform(object, parents) {
126
- return () => {
127
- // Empty strings are discarded
128
- if (!object.value || this.ignore.has(object.value) || object.value.length == 0) {
129
- return;
130
- }
78
+ return {
79
+ visitor: {
80
+ Program: {
81
+ exit: function exit(programPath) {
82
+ var mainEncodingImplementation;
131
83
 
132
- // Allow user to choose which strings get changed
133
- if (!(0, _probability.ComputeProbabilityMap)(this.options.stringConcealing, x => x, object.value)) {
134
- return;
135
- }
136
- var currentBlock = (0, _traverse.getBlock)(object, parents);
137
-
138
- // Find created functions
139
- var functionObjects = parents.filter(node => node.$stringConcealingFunctionObject).map(item => item.$stringConcealingFunctionObject);
140
-
141
- // Choose random functionObject to use
142
- var functionObject = (0, _random.choice)(functionObjects);
143
- if (!functionObject || !(0, _encoding.hasAllEncodings)() && (0, _random.chance)(25 / this.functionObjects.length) && !currentBlock.$stringConcealingFunctionObject) {
144
- // No functions, create one
145
-
146
- var newFunctionObject = {
147
- block: currentBlock,
148
- encodingImplementation: (0, _encoding.createEncodingImplementation)(),
149
- fnName: this.getPlaceholder() + _constants.predictableFunctionTag
150
- };
151
- this.functionObjects.push(newFunctionObject);
152
- currentBlock.$stringConcealingFunctionObject = newFunctionObject;
153
- functionObject = newFunctionObject;
154
- }
155
- var {
156
- fnName,
157
- encodingImplementation
158
- } = functionObject;
159
- var index = -1;
160
-
161
- // String already decoded?
162
- if (this.set.has(object.value)) {
163
- var row = this.index[object.value];
164
- if (parents.includes(row[2])) {
165
- [index, fnName] = row;
166
- (0, _assert.ok)(typeof index === "number");
167
- }
168
- }
169
- if (index == -1) {
170
- // The decode function must return correct result
171
- var encoded = encodingImplementation.encode(object.value);
172
- if (encodingImplementation.decode(encoded) !== object.value) {
173
- this.ignore.add(object.value);
174
- this.warn(encodingImplementation.identity, object.value.slice(0, 100));
175
- delete _encoding.EncodingImplementations[encodingImplementation.identity];
176
- return;
177
- }
178
- this.arrayExpression.elements.push((0, _gen.Literal)(encoded));
179
- index = this.arrayExpression.elements.length - 1;
180
- this.index[object.value] = [index, fnName, currentBlock];
181
- this.set.add(object.value);
182
- }
183
- (0, _assert.ok)(index != -1, "index == -1");
184
- var callExpr = (0, _gen.CallExpression)((0, _gen.Identifier)(fnName), [(0, _gen.Literal)(index)]);
84
+ // Create a main encoder function for the Program
85
+ programPath.node[STRING_CONCEALING] = {
86
+ encodingImplementation: mainEncodingImplementation = createStringEncoding(),
87
+ fnName: me.getPlaceholder() + "_MAIN_STR"
88
+ };
89
+ blocks.push(programPath);
185
90
 
186
- // use `.apply` to fool automated de-obfuscators
187
- if ((0, _random.chance)(10)) {
188
- 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)])]);
189
- }
91
+ // Use that encoder function for these fake strings
92
+ var fakeStringCount = (0, _randomUtils.getRandomInteger)(75, 125);
93
+ for (var i = 0; i < fakeStringCount; i++) {
94
+ var fakeString = (0, _randomUtils.getRandomString)((0, _randomUtils.getRandomInteger)(5, 50));
95
+ stringMap.set(mainEncodingImplementation.encode(fakeString), stringMap.size);
96
+ }
97
+ programPath.traverse({
98
+ StringLiteral: {
99
+ exit: function exit(path) {
100
+ var _block;
101
+ var originalValue = path.node.value;
190
102
 
191
- // use `.call`
192
- else if ((0, _random.chance)(10)) {
193
- callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.Literal)("call"), true), [(0, _gen.Identifier)("undefined"), (0, _gen.Literal)(index)]);
194
- }
195
- var referenceType = "call";
196
- if (parents.length && (0, _random.chance)(50 - this.variablesMade)) {
197
- referenceType = "constantReference";
198
- }
199
- var newExpr = callExpr;
200
- if (referenceType === "constantReference") {
201
- // Define the string earlier, reference the name here
202
- this.variablesMade++;
203
- var constantReferenceType = (0, _random.choice)(["variable", "array", "object"]);
204
- var place = currentBlock;
205
- if (!place) {
206
- this.error(new Error("No lexical block to insert code"));
207
- }
208
- switch (constantReferenceType) {
209
- case "variable":
210
- var name = this.getPlaceholder();
211
- (0, _insert.prepend)(place, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, callExpr)));
212
- newExpr = (0, _gen.Identifier)(name);
213
- break;
214
- case "array":
215
- if (!place.$stringConcealingArray) {
216
- place.$stringConcealingArray = (0, _gen.ArrayExpression)([]);
217
- place.$stringConcealingArrayName = this.getPlaceholder();
218
- (0, _insert.prepend)(place, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(place.$stringConcealingArrayName, place.$stringConcealingArray)));
219
- }
220
- var arrayIndex = place.$stringConcealingArray.elements.length;
221
- place.$stringConcealingArray.elements.push(callExpr);
222
- var memberExpression = (0, _gen.MemberExpression)((0, _gen.Identifier)(place.$stringConcealingArrayName), (0, _gen.Literal)(arrayIndex), true);
223
- newExpr = memberExpression;
224
- break;
225
- case "object":
226
- if (!place.$stringConcealingObject) {
227
- place.$stringConcealingObject = (0, _gen.ObjectExpression)([]);
228
- place.$stringConcealingObjectName = this.getPlaceholder();
229
- (0, _insert.prepend)(place, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(place.$stringConcealingObjectName, place.$stringConcealingObject)));
103
+ // Ignore require() calls / Import statements
104
+ if ((0, _astUtils.isModuleImport)(path)) {
105
+ return;
106
+ }
107
+
108
+ // Minimum length of 3 characters
109
+ if (originalValue.length < 3) {
110
+ return;
111
+ }
112
+
113
+ // Check user setting
114
+ if (!(0, _probability.computeProbabilityMap)(me.options.stringConcealing, originalValue)) {
115
+ return;
116
+ }
117
+ var block = path.findParent(function (p) {
118
+ var _p$node;
119
+ return p.isBlock() && !!((_p$node = p.node) !== null && _p$node !== void 0 && _p$node[STRING_CONCEALING]);
120
+ });
121
+ var stringConcealingInterface = (_block = block) === null || _block === void 0 || (_block = _block.node) === null || _block === void 0 ? void 0 : _block[STRING_CONCEALING];
122
+ if (!block || !hasAllEncodings() && (0, _randomUtils.chance)(75 - blocks.length)) {
123
+ // Create a new encoder function
124
+ // Select random block parent (or Program)
125
+ block = path.findParent(function (p) {
126
+ return p.isBlock();
127
+ });
128
+ var stringConcealingNode = block.node;
129
+
130
+ // Ensure not to overwrite the previous encoders
131
+ if (!stringConcealingNode[STRING_CONCEALING]) {
132
+ // Create a new encoding function for this block
133
+ var encodingImplementation = createStringEncoding();
134
+ var fnName = me.getPlaceholder() + "_STR_" + blocks.length;
135
+ stringConcealingInterface = {
136
+ encodingImplementation: encodingImplementation,
137
+ fnName: fnName
138
+ };
139
+
140
+ // Save this info in the AST for future strings
141
+ stringConcealingNode[STRING_CONCEALING] = stringConcealingInterface;
142
+ blocks.push(block);
143
+ }
144
+ }
145
+ (0, _assert.ok)(stringConcealingInterface);
146
+ var encodedValue = stringConcealingInterface.encodingImplementation.encode(originalValue);
147
+
148
+ // If a decoder function is provided, use it to validate each encoded string
149
+ if (typeof stringConcealingInterface.encodingImplementation.decode === "function") {
150
+ var decodedValue = stringConcealingInterface.encodingImplementation.decode(encodedValue);
151
+ if (decodedValue !== originalValue) {
152
+ return;
153
+ }
154
+ }
155
+ var index = stringMap.get(encodedValue);
156
+ if (typeof index === "undefined") {
157
+ index = stringMap.size;
158
+ stringMap.set(encodedValue, index);
159
+ }
160
+ me.changeData.strings++;
161
+
162
+ // Ensure the string is computed so we can replace it with complex call expression
163
+ (0, _astUtils.ensureComputedExpression)(path);
164
+
165
+ // Replace the string literal with a call to the decoder function
166
+ path.replaceWith(t.callExpression(t.identifier(stringConcealingInterface.fnName), [(0, _node.numericLiteral)(index)]));
167
+
168
+ // Skip the transformation for the newly created node
169
+ path.skip();
170
+ }
230
171
  }
231
- var propName = this.gen.generate();
232
- var property = (0, _gen.Property)((0, _gen.Literal)(propName), callExpr, true);
233
- place.$stringConcealingObject.properties.push(property);
234
- var memberExpression = (0, _gen.MemberExpression)((0, _gen.Identifier)(place.$stringConcealingObjectName), (0, _gen.Literal)(propName), true);
235
- newExpr = memberExpression;
236
- break;
172
+ });
173
+ var bufferToStringName = me.getPlaceholder() + "_bufferToString";
174
+ var getGlobalFnName = me.getPlaceholder() + "_getGlobal";
175
+ var bufferToStringCode = _bufferToStringTemplate.BufferToStringTemplate.compile({
176
+ GetGlobalTemplate: (0, _getGlobalTemplate.createGetGlobalTemplate)(me, programPath),
177
+ getGlobalFnName: getGlobalFnName,
178
+ BufferToString: bufferToStringName
179
+ });
180
+ (0, _astUtils.prependProgram)(programPath, bufferToStringCode);
181
+
182
+ // Create the string array
183
+ (0, _astUtils.prependProgram)(programPath, t.variableDeclaration("var", [t.variableDeclarator(t.identifier(stringArrayName), t.arrayExpression(Array.from(stringMap.keys()).map(function (x) {
184
+ return t.stringLiteral(x);
185
+ })))]));
186
+ for (var _i = 0, _blocks = blocks; _i < _blocks.length; _i++) {
187
+ var block = _blocks[_i];
188
+ var _ref2 = block.node[STRING_CONCEALING],
189
+ encodingImplementation = _ref2.encodingImplementation,
190
+ fnName = _ref2.fnName;
191
+ var decodeFnName = fnName + "_decode";
192
+ (0, _assert.ok)(encodingImplementation.code instanceof _template["default"]);
193
+
194
+ // The decoder function
195
+ var decoder = encodingImplementation.code.compile({
196
+ fnName: decodeFnName,
197
+ __bufferToStringFunction__: bufferToStringName
198
+ });
199
+
200
+ // The main function to get the string value
201
+ var retrieveFunctionDeclaration = new _template["default"]("\n function ".concat(fnName, "(index) {\n return ").concat(decodeFnName, "(").concat(stringArrayName, "[index]);\n }\n ")).single();
202
+ (0, _astUtils.prepend)(block, [].concat(_toConsumableArray(decoder), [retrieveFunctionDeclaration]));
203
+ }
237
204
  }
238
205
  }
239
- this.replaceIdentifierOrLiteral(object, newExpr, parents);
240
- };
241
- }
242
- }
243
- exports.default = StringConcealing;
206
+ }
207
+ };
208
+ };
@@ -1,15 +1,16 @@
1
1
  "use strict";
2
2
 
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.default = void 0;
7
- var _transform = _interopRequireDefault(require("../transform"));
8
- var _random = require("../../util/random");
9
- var _compare = require("../../util/compare");
7
+ exports["default"] = void 0;
8
+ var t = _interopRequireWildcard(require("@babel/types"));
9
+ var _randomUtils = require("../../utils/random-utils");
10
10
  var _probability = require("../../probability");
11
- var _gen = require("../../util/gen");
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ var _constants = require("../../constants");
12
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
13
14
  function pad(x, len) {
14
15
  while (x.length < len) {
15
16
  x = "0" + x;
@@ -24,54 +25,45 @@ function even(x) {
24
25
  }
25
26
  function toHexRepresentation(str) {
26
27
  var escapedString = "";
27
- str.split("").forEach(char => {
28
- var code = char.charCodeAt(0);
28
+ str.split("").forEach(function (_char) {
29
+ var code = _char.charCodeAt(0);
29
30
  if (code < 128) {
30
31
  escapedString += "\\x" + even(pad(code.toString(16), 2));
31
32
  } else {
32
- escapedString += char;
33
+ escapedString += _char;
33
34
  }
34
35
  });
35
36
  return escapedString;
36
37
  }
37
38
  function toUnicodeRepresentation(str) {
38
39
  var escapedString = "";
39
- str.split("").forEach(char => {
40
- var code = char.charCodeAt(0);
40
+ str.split("").forEach(function (_char2) {
41
+ var code = _char2.charCodeAt(0);
41
42
  if (code < 128) {
42
43
  escapedString += "\\u" + even(pad(code.toString(16), 4));
43
44
  } else {
44
- escapedString += char;
45
+ escapedString += _char2;
45
46
  }
46
47
  });
47
48
  return escapedString;
48
49
  }
50
+ var _default = exports["default"] = function _default(me) {
51
+ return {
52
+ visitor: {
53
+ StringLiteral: {
54
+ exit: function exit(path) {
55
+ var value = path.node.value;
49
56
 
50
- /**
51
- * [String Encoding](https://docs.jscrambler.com/code-integrity/documentation/transformations/string-encoding) transforms a string into an encoded representation.
52
- *
53
- * - Potency Low
54
- * - Resilience Low
55
- * - Cost Low
56
- */
57
- class StringEncoding extends _transform.default {
58
- constructor(o) {
59
- super(o);
60
- }
61
- match(object, parents) {
62
- return object.type == "Literal" && typeof object.value === "string" && object.value.length > 0 && !(0, _compare.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
63
- }
64
- transform(object, parents) {
65
- // Allow percentages
66
- if (!(0, _probability.ComputeProbabilityMap)(this.options.stringEncoding, x => x, object.value)) return;
67
- var type = (0, _random.choice)(["hexadecimal", "unicode"]);
68
- var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(object.value);
69
- return () => {
70
- if (object.type !== "Literal") return;
71
-
72
- // ESCodeGen tries to escape backslashes, here is a work-around
73
- this.replace(object, (0, _gen.Identifier)(`'${escapedString}'`));
74
- };
75
- }
76
- }
77
- exports.default = StringEncoding;
57
+ // Allow percentages
58
+ if (!(0, _probability.computeProbabilityMap)(me.options.stringEncoding, value)) return;
59
+ var type = (0, _randomUtils.choice)(["hexadecimal", "unicode"]);
60
+ var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(value);
61
+ var id = t.identifier("\"".concat(escapedString, "\""));
62
+ id[_constants.GEN_NODE] = true;
63
+ path.replaceWith(id);
64
+ path.skip();
65
+ }
66
+ }
67
+ }
68
+ };
69
+ };