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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +43 -43
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
- package/.github/workflows/node.js.yml +28 -28
- package/.prettierrc +4 -4
- package/CHANGELOG.md +1015 -987
- package/CODE_OF_CONDUCT.md +131 -131
- package/CONTRIBUTING.md +52 -52
- package/LICENSE +21 -21
- package/Migration.md +72 -72
- package/README.md +86 -86
- package/dist/constants.js +43 -43
- package/dist/index.js +14 -23
- package/dist/obfuscator.js +31 -25
- package/dist/order.js +4 -4
- package/dist/presets.js +31 -31
- package/dist/templates/integrityTemplate.js +4 -4
- package/dist/templates/template.js +1 -2
- package/dist/transforms/astScrambler.js +1 -2
- package/dist/transforms/calculator.js +1 -2
- package/dist/transforms/controlFlowFlattening.js +60 -41
- package/dist/transforms/deadCode.js +1 -2
- package/dist/transforms/dispatcher.js +4 -5
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +1 -2
- package/dist/transforms/extraction/objectExtraction.js +1 -2
- package/dist/transforms/finalizer.js +1 -2
- package/dist/transforms/flatten.js +1 -2
- package/dist/transforms/identifier/globalConcealing.js +15 -2
- package/dist/transforms/identifier/movedDeclarations.js +8 -7
- package/dist/transforms/identifier/renameVariables.js +7 -7
- package/dist/transforms/lock/integrity.js +8 -9
- package/dist/transforms/lock/lock.js +1 -2
- package/dist/transforms/minify.js +11 -29
- package/dist/transforms/opaquePredicates.js +1 -2
- package/dist/transforms/pack.js +1 -2
- package/dist/transforms/plugin.js +18 -19
- package/dist/transforms/preparation.js +16 -16
- package/dist/transforms/renameLabels.js +1 -2
- package/dist/transforms/rgf.js +8 -9
- package/dist/transforms/shuffle.js +1 -2
- package/dist/transforms/string/encoding.js +1 -2
- package/dist/transforms/string/stringCompression.js +3 -4
- package/dist/transforms/string/stringConcealing.js +1 -2
- package/dist/transforms/string/stringEncoding.js +1 -2
- package/dist/transforms/variableMasking.js +1 -2
- package/dist/utils/NameGen.js +2 -2
- package/dist/utils/PredicateGen.js +1 -2
- package/dist/utils/ast-utils.js +87 -88
- package/dist/utils/function-utils.js +8 -8
- package/dist/utils/node.js +5 -6
- package/dist/utils/object-utils.js +4 -4
- package/dist/utils/random-utils.js +20 -20
- package/dist/utils/static-utils.js +1 -2
- package/dist/validateOptions.js +4 -7
- package/index.d.ts +17 -17
- package/package.json +61 -59
- package/src/constants.ts +168 -168
- package/src/index.ts +118 -118
- package/src/obfuscationResult.ts +49 -49
- package/src/obfuscator.ts +501 -497
- package/src/options.ts +407 -407
- package/src/order.ts +54 -54
- package/src/presets.ts +125 -125
- package/src/templates/bufferToStringTemplate.ts +57 -57
- package/src/templates/deadCodeTemplates.ts +1185 -1185
- package/src/templates/getGlobalTemplate.ts +76 -76
- package/src/templates/integrityTemplate.ts +64 -64
- package/src/templates/setFunctionLengthTemplate.ts +11 -11
- package/src/templates/stringCompressionTemplate.ts +20 -20
- package/src/templates/tamperProtectionTemplates.ts +120 -120
- package/src/templates/template.ts +224 -224
- package/src/transforms/astScrambler.ts +99 -99
- package/src/transforms/calculator.ts +99 -99
- package/src/transforms/controlFlowFlattening.ts +1716 -1680
- package/src/transforms/deadCode.ts +82 -82
- package/src/transforms/dispatcher.ts +450 -450
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +156 -158
- package/src/transforms/extraction/objectExtraction.ts +186 -186
- package/src/transforms/finalizer.ts +74 -74
- package/src/transforms/flatten.ts +421 -418
- package/src/transforms/identifier/globalConcealing.ts +315 -295
- package/src/transforms/identifier/movedDeclarations.ts +252 -251
- package/src/transforms/identifier/renameVariables.ts +328 -321
- package/src/transforms/lock/integrity.ts +117 -117
- package/src/transforms/lock/lock.ts +418 -418
- package/src/transforms/minify.ts +615 -629
- package/src/transforms/opaquePredicates.ts +100 -100
- package/src/transforms/pack.ts +239 -239
- package/src/transforms/plugin.ts +173 -173
- package/src/transforms/preparation.ts +349 -347
- package/src/transforms/renameLabels.ts +175 -175
- package/src/transforms/rgf.ts +322 -322
- package/src/transforms/shuffle.ts +82 -82
- package/src/transforms/string/encoding.ts +144 -144
- package/src/transforms/string/stringCompression.ts +128 -128
- package/src/transforms/string/stringConcealing.ts +312 -312
- package/src/transforms/string/stringEncoding.ts +80 -80
- package/src/transforms/string/stringSplitting.ts +77 -77
- package/src/transforms/variableMasking.ts +257 -257
- package/src/utils/IntGen.ts +33 -33
- package/src/utils/NameGen.ts +116 -116
- package/src/utils/PredicateGen.ts +61 -61
- package/src/utils/ast-utils.ts +663 -663
- package/src/utils/function-utils.ts +50 -50
- package/src/utils/gen-utils.ts +48 -48
- package/src/utils/node.ts +78 -78
- package/src/utils/object-utils.ts +21 -21
- package/src/utils/random-utils.ts +93 -93
- package/src/utils/static-utils.ts +66 -66
- package/src/validateOptions.ts +256 -259
- package/tsconfig.json +13 -14
- package/dist/probability.js +0 -1
- package/dist/transforms/functionOutlining.js +0 -230
- package/dist/utils/ControlObject.js +0 -125
package/src/transforms/plugin.ts
CHANGED
|
@@ -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
|
+
}
|