js-confuser 2.0.0 → 2.0.1

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 (113) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +43 -43
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
  3. package/.github/workflows/node.js.yml +28 -28
  4. package/.prettierrc +4 -4
  5. package/CHANGELOG.md +1015 -987
  6. package/CODE_OF_CONDUCT.md +131 -131
  7. package/CONTRIBUTING.md +52 -52
  8. package/LICENSE +21 -21
  9. package/Migration.md +72 -72
  10. package/README.md +86 -86
  11. package/dist/constants.js +43 -43
  12. package/dist/index.js +14 -23
  13. package/dist/obfuscator.js +31 -25
  14. package/dist/order.js +4 -4
  15. package/dist/presets.js +31 -31
  16. package/dist/templates/integrityTemplate.js +4 -4
  17. package/dist/templates/template.js +1 -2
  18. package/dist/transforms/astScrambler.js +1 -2
  19. package/dist/transforms/calculator.js +1 -2
  20. package/dist/transforms/controlFlowFlattening.js +60 -41
  21. package/dist/transforms/deadCode.js +1 -2
  22. package/dist/transforms/dispatcher.js +4 -5
  23. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +1 -2
  24. package/dist/transforms/extraction/objectExtraction.js +1 -2
  25. package/dist/transforms/finalizer.js +1 -2
  26. package/dist/transforms/flatten.js +1 -2
  27. package/dist/transforms/identifier/globalConcealing.js +15 -2
  28. package/dist/transforms/identifier/movedDeclarations.js +8 -7
  29. package/dist/transforms/identifier/renameVariables.js +7 -7
  30. package/dist/transforms/lock/integrity.js +8 -9
  31. package/dist/transforms/lock/lock.js +1 -2
  32. package/dist/transforms/minify.js +11 -29
  33. package/dist/transforms/opaquePredicates.js +1 -2
  34. package/dist/transforms/pack.js +1 -2
  35. package/dist/transforms/plugin.js +18 -19
  36. package/dist/transforms/preparation.js +16 -16
  37. package/dist/transforms/renameLabels.js +1 -2
  38. package/dist/transforms/rgf.js +8 -9
  39. package/dist/transforms/shuffle.js +1 -2
  40. package/dist/transforms/string/encoding.js +1 -2
  41. package/dist/transforms/string/stringCompression.js +3 -4
  42. package/dist/transforms/string/stringConcealing.js +1 -2
  43. package/dist/transforms/string/stringEncoding.js +1 -2
  44. package/dist/transforms/variableMasking.js +1 -2
  45. package/dist/utils/NameGen.js +2 -2
  46. package/dist/utils/PredicateGen.js +1 -2
  47. package/dist/utils/ast-utils.js +87 -88
  48. package/dist/utils/function-utils.js +8 -8
  49. package/dist/utils/node.js +5 -6
  50. package/dist/utils/object-utils.js +4 -4
  51. package/dist/utils/random-utils.js +20 -20
  52. package/dist/utils/static-utils.js +1 -2
  53. package/dist/validateOptions.js +4 -7
  54. package/index.d.ts +17 -17
  55. package/package.json +61 -59
  56. package/src/constants.ts +168 -168
  57. package/src/index.ts +118 -118
  58. package/src/obfuscationResult.ts +49 -49
  59. package/src/obfuscator.ts +501 -497
  60. package/src/options.ts +407 -407
  61. package/src/order.ts +54 -54
  62. package/src/presets.ts +125 -125
  63. package/src/templates/bufferToStringTemplate.ts +57 -57
  64. package/src/templates/deadCodeTemplates.ts +1185 -1185
  65. package/src/templates/getGlobalTemplate.ts +76 -76
  66. package/src/templates/integrityTemplate.ts +64 -64
  67. package/src/templates/setFunctionLengthTemplate.ts +11 -11
  68. package/src/templates/stringCompressionTemplate.ts +20 -20
  69. package/src/templates/tamperProtectionTemplates.ts +120 -120
  70. package/src/templates/template.ts +224 -224
  71. package/src/transforms/astScrambler.ts +99 -99
  72. package/src/transforms/calculator.ts +99 -99
  73. package/src/transforms/controlFlowFlattening.ts +1716 -1680
  74. package/src/transforms/deadCode.ts +82 -82
  75. package/src/transforms/dispatcher.ts +450 -450
  76. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +156 -158
  77. package/src/transforms/extraction/objectExtraction.ts +186 -186
  78. package/src/transforms/finalizer.ts +74 -74
  79. package/src/transforms/flatten.ts +421 -418
  80. package/src/transforms/identifier/globalConcealing.ts +315 -295
  81. package/src/transforms/identifier/movedDeclarations.ts +252 -251
  82. package/src/transforms/identifier/renameVariables.ts +328 -321
  83. package/src/transforms/lock/integrity.ts +117 -117
  84. package/src/transforms/lock/lock.ts +418 -418
  85. package/src/transforms/minify.ts +615 -629
  86. package/src/transforms/opaquePredicates.ts +100 -100
  87. package/src/transforms/pack.ts +239 -239
  88. package/src/transforms/plugin.ts +173 -173
  89. package/src/transforms/preparation.ts +349 -347
  90. package/src/transforms/renameLabels.ts +175 -175
  91. package/src/transforms/rgf.ts +322 -322
  92. package/src/transforms/shuffle.ts +82 -82
  93. package/src/transforms/string/encoding.ts +144 -144
  94. package/src/transforms/string/stringCompression.ts +128 -128
  95. package/src/transforms/string/stringConcealing.ts +312 -312
  96. package/src/transforms/string/stringEncoding.ts +80 -80
  97. package/src/transforms/string/stringSplitting.ts +77 -77
  98. package/src/transforms/variableMasking.ts +257 -257
  99. package/src/utils/IntGen.ts +33 -33
  100. package/src/utils/NameGen.ts +116 -116
  101. package/src/utils/PredicateGen.ts +61 -61
  102. package/src/utils/ast-utils.ts +663 -663
  103. package/src/utils/function-utils.ts +50 -50
  104. package/src/utils/gen-utils.ts +48 -48
  105. package/src/utils/node.ts +78 -78
  106. package/src/utils/object-utils.ts +21 -21
  107. package/src/utils/random-utils.ts +93 -93
  108. package/src/utils/static-utils.ts +66 -66
  109. package/src/validateOptions.ts +256 -259
  110. package/tsconfig.json +13 -14
  111. package/dist/probability.js +0 -1
  112. package/dist/transforms/functionOutlining.js +0 -230
  113. package/dist/utils/ControlObject.js +0 -125
@@ -1,173 +1,173 @@
1
- import { NodePath, Visitor } from "@babel/traverse";
2
- import Obfuscator from "../obfuscator";
3
- import { getRandomString } from "../utils/random-utils";
4
- import { Order } from "../order";
5
- import * as t from "@babel/types";
6
- import { FN_LENGTH, NodeSymbol, SKIP } from "../constants";
7
- import { SetFunctionLengthTemplate } from "../templates/setFunctionLengthTemplate";
8
- import { prepend, prependProgram } from "../utils/ast-utils";
9
- import { numericLiteral } from "../utils/node";
10
-
11
- export interface PluginObject {
12
- visitor?: Visitor;
13
- finalASTHandler?: (ast: t.File) => t.File;
14
-
15
- post?: () => void;
16
- }
17
-
18
- export type PluginArg = {
19
- Plugin: <T extends Partial<PluginInstance> = {}>(
20
- order: Order,
21
- merge?: T
22
- ) => PluginInstance & T;
23
- };
24
-
25
- export type PluginFunction = (pluginArg: PluginArg) => PluginObject;
26
-
27
- export class PluginInstance {
28
- constructor(
29
- public pluginOptions: { name?: string; order?: number },
30
- public obfuscator: Obfuscator
31
- ) {
32
- this.computeProbabilityMap = obfuscator.computeProbabilityMap.bind(
33
- this.obfuscator
34
- );
35
- }
36
-
37
- public changeData: { [key: string]: number } = {};
38
- public computeProbabilityMap: Obfuscator["computeProbabilityMap"];
39
-
40
- get name() {
41
- return this.pluginOptions.name || "unnamed";
42
- }
43
-
44
- get order() {
45
- return this.pluginOptions.order;
46
- }
47
-
48
- get options() {
49
- return this.obfuscator.options;
50
- }
51
-
52
- get globalState() {
53
- return this.obfuscator.globalState;
54
- }
55
-
56
- skip<T extends t.Node>(path: NodePath<T> | T | NodePath<T>[]): T {
57
- if (Array.isArray(path)) {
58
- path.forEach((p) => this.skip(p));
59
- } else {
60
- let any = path as any;
61
- let node = any.isNodeType ? any.node : any;
62
-
63
- (node as NodeSymbol)[SKIP] = this.order;
64
-
65
- return node;
66
- }
67
- }
68
-
69
- /**
70
- * Returns `true` if the given path has been skipped by this plugin.
71
- */
72
- isSkipped(path: NodePath) {
73
- return (path.node as NodeSymbol)[SKIP] === this.order;
74
- }
75
-
76
- private setFunctionLengthName: string;
77
- setFunctionLength(path: NodePath<t.Function>, originalLength: number) {
78
- (path.node as NodeSymbol)[FN_LENGTH] = originalLength;
79
-
80
- // Skip if user disabled this feature
81
- if (!this.options.preserveFunctionLength) return;
82
-
83
- // Skip if function has no parameters
84
- if (originalLength === 0) return;
85
-
86
- // Create the function length setter if it doesn't exist
87
- if (!this.setFunctionLengthName) {
88
- this.setFunctionLengthName = this.getPlaceholder("fnLength");
89
-
90
- this.skip(
91
- prependProgram(
92
- path,
93
- SetFunctionLengthTemplate.compile({
94
- fnName: this.setFunctionLengthName,
95
- })
96
- )
97
- );
98
- }
99
-
100
- const createCallArguments = (node: t.Expression): t.Expression[] => {
101
- var args = [node];
102
-
103
- // 1 is the default value in the setFunction template, can exclude it
104
- if (originalLength !== 1) {
105
- args.push(numericLiteral(originalLength));
106
- }
107
- return args;
108
- };
109
-
110
- if (t.isFunctionDeclaration(path.node)) {
111
- prepend(
112
- path.parentPath,
113
- t.expressionStatement(
114
- t.callExpression(
115
- t.identifier(this.setFunctionLengthName),
116
- createCallArguments(t.identifier(path.node.id.name))
117
- )
118
- )
119
- );
120
- } else if (
121
- t.isFunctionExpression(path.node) ||
122
- t.isArrowFunctionExpression(path.node)
123
- ) {
124
- path.replaceWith(
125
- t.callExpression(
126
- t.identifier(this.setFunctionLengthName),
127
- createCallArguments(path.node)
128
- )
129
- );
130
- } else {
131
- // TODO
132
- }
133
- }
134
-
135
- /**
136
- * Returns a random string.
137
- *
138
- * Used for creating temporary variables names, typically before RenameVariables has ran.
139
- *
140
- * These long temp names will be converted to short, mangled names by RenameVariables.
141
- */
142
- getPlaceholder(suffix = "") {
143
- return "__p_" + getRandomString(4) + (suffix ? "_" + suffix : "");
144
- }
145
-
146
- /**
147
- * Logs a message to the console, only if `verbose` is enabled.
148
- * @param messages
149
- */
150
- log(...messages: any[]) {
151
- if (this.options.verbose) {
152
- console.log(`[${this.name}]`, ...messages);
153
- }
154
- }
155
-
156
- /**
157
- * Logs a warning to the console, only if `verbose` is enabled.
158
- * @param messages
159
- */
160
- warn(...messages: any[]) {
161
- if (this.options.verbose) {
162
- console.log(`WARN [${this.name}]`, ...messages);
163
- }
164
- }
165
-
166
- /**
167
- * Throws an error with the given message.
168
- * @param messages
169
- */
170
- error(...messages: any[]): never {
171
- throw new Error(`[${this.name}] ${messages.join(" ")}`);
172
- }
173
- }
1
+ import { NodePath, Visitor } from "@babel/traverse";
2
+ import Obfuscator from "../obfuscator";
3
+ import { getRandomString } from "../utils/random-utils";
4
+ import { Order } from "../order";
5
+ import * as t from "@babel/types";
6
+ import { FN_LENGTH, NodeSymbol, SKIP } from "../constants";
7
+ import { SetFunctionLengthTemplate } from "../templates/setFunctionLengthTemplate";
8
+ import { prepend, prependProgram } from "../utils/ast-utils";
9
+ import { numericLiteral } from "../utils/node";
10
+
11
+ export interface PluginObject {
12
+ visitor?: Visitor;
13
+ finalASTHandler?: (ast: t.File) => t.File;
14
+
15
+ post?: () => void;
16
+ }
17
+
18
+ export type PluginArg = {
19
+ Plugin: <T extends Partial<PluginInstance> = {}>(
20
+ order: Order,
21
+ merge?: T
22
+ ) => PluginInstance & T;
23
+ };
24
+
25
+ export type PluginFunction = (pluginArg: PluginArg) => PluginObject;
26
+
27
+ export class PluginInstance {
28
+ constructor(
29
+ public pluginOptions: { name?: string; order?: number },
30
+ public obfuscator: Obfuscator
31
+ ) {
32
+ this.computeProbabilityMap = obfuscator.computeProbabilityMap.bind(
33
+ this.obfuscator
34
+ );
35
+ }
36
+
37
+ public changeData: { [key: string]: number } = {};
38
+ public computeProbabilityMap: Obfuscator["computeProbabilityMap"];
39
+
40
+ get name() {
41
+ return this.pluginOptions.name || "unnamed";
42
+ }
43
+
44
+ get order() {
45
+ return this.pluginOptions.order;
46
+ }
47
+
48
+ get options() {
49
+ return this.obfuscator.options;
50
+ }
51
+
52
+ get globalState() {
53
+ return this.obfuscator.globalState;
54
+ }
55
+
56
+ skip<T extends t.Node>(path: NodePath<T> | T | NodePath<T>[]): T {
57
+ if (Array.isArray(path)) {
58
+ path.forEach((p) => this.skip(p));
59
+ } else {
60
+ let any = path as any;
61
+ let node = any.isNodeType ? any.node : any;
62
+
63
+ (node as NodeSymbol)[SKIP] = this.order;
64
+
65
+ return node;
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Returns `true` if the given path has been skipped by this plugin.
71
+ */
72
+ isSkipped(path: NodePath) {
73
+ return (path.node as NodeSymbol)[SKIP] === this.order;
74
+ }
75
+
76
+ private setFunctionLengthName: string;
77
+ setFunctionLength(path: NodePath<t.Function>, originalLength: number) {
78
+ (path.node as NodeSymbol)[FN_LENGTH] = originalLength;
79
+
80
+ // Skip if user disabled this feature
81
+ if (!this.options.preserveFunctionLength) return;
82
+
83
+ // Skip if function has no parameters
84
+ if (originalLength === 0) return;
85
+
86
+ // Create the function length setter if it doesn't exist
87
+ if (!this.setFunctionLengthName) {
88
+ this.setFunctionLengthName = this.getPlaceholder("fnLength");
89
+
90
+ this.skip(
91
+ prependProgram(
92
+ path,
93
+ SetFunctionLengthTemplate.compile({
94
+ fnName: this.setFunctionLengthName,
95
+ })
96
+ )
97
+ );
98
+ }
99
+
100
+ const createCallArguments = (node: t.Expression): t.Expression[] => {
101
+ var args = [node];
102
+
103
+ // 1 is the default value in the setFunction template, can exclude it
104
+ if (originalLength !== 1) {
105
+ args.push(numericLiteral(originalLength));
106
+ }
107
+ return args;
108
+ };
109
+
110
+ if (t.isFunctionDeclaration(path.node)) {
111
+ prepend(
112
+ path.parentPath,
113
+ t.expressionStatement(
114
+ t.callExpression(
115
+ t.identifier(this.setFunctionLengthName),
116
+ createCallArguments(t.identifier(path.node.id.name))
117
+ )
118
+ )
119
+ );
120
+ } else if (
121
+ t.isFunctionExpression(path.node) ||
122
+ t.isArrowFunctionExpression(path.node)
123
+ ) {
124
+ path.replaceWith(
125
+ t.callExpression(
126
+ t.identifier(this.setFunctionLengthName),
127
+ createCallArguments(path.node)
128
+ )
129
+ );
130
+ } else {
131
+ // TODO
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Returns a random string.
137
+ *
138
+ * Used for creating temporary variables names, typically before RenameVariables has ran.
139
+ *
140
+ * These long temp names will be converted to short, mangled names by RenameVariables.
141
+ */
142
+ getPlaceholder(suffix = "") {
143
+ return "__p_" + getRandomString(4) + (suffix ? "_" + suffix : "");
144
+ }
145
+
146
+ /**
147
+ * Logs a message to the console, only if `verbose` is enabled.
148
+ * @param messages
149
+ */
150
+ log(...messages: any[]) {
151
+ if (this.options.verbose) {
152
+ console.log(`[${this.name}]`, ...messages);
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Logs a warning to the console, only if `verbose` is enabled.
158
+ * @param messages
159
+ */
160
+ warn(...messages: any[]) {
161
+ if (this.options.verbose) {
162
+ console.log(`WARN [${this.name}]`, ...messages);
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Throws an error with the given message.
168
+ * @param messages
169
+ */
170
+ error(...messages: any[]): never {
171
+ throw new Error(`[${this.name}] ${messages.join(" ")}`);
172
+ }
173
+ }