js-confuser 1.4.3 → 1.5.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.
- package/CHANGELOG.md +4 -1
- package/README.md +5 -2
- package/dev.js +4 -5
- package/dist/compiler.js +1 -1
- package/dist/constants.js +1 -1
- package/dist/index.js +5 -5
- package/dist/obfuscator.js +11 -3
- package/dist/options.js +1 -1
- package/dist/parser.js +2 -2
- package/dist/precedence.js +1 -1
- package/dist/presets.js +3 -3
- package/dist/probability.js +7 -1
- package/dist/transforms/calculator.js +15 -3
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +79 -17
- package/dist/transforms/dispatcher.js +3 -1
- package/dist/transforms/flatten.js +2 -2
- package/dist/transforms/hideInitializingCode.js +8 -3
- package/dist/transforms/identifier/globalConcealing.js +3 -1
- package/dist/transforms/identifier/nameRecycling.js +2 -1
- package/dist/transforms/lock/integrity.js +2 -1
- package/dist/transforms/lock/lock.js +2 -2
- package/dist/transforms/rgf.js +11 -8
- package/dist/transforms/stack.js +2 -1
- package/dist/transforms/string/stringConcealing.js +3 -3
- package/dist/transforms/transform.js +32 -8
- package/dist/traverse.js +4 -2
- package/dist/types.js +5 -1
- package/dist/util/compare.js +4 -4
- package/dist/util/gen.js +66 -47
- package/dist/util/identifiers.js +4 -4
- package/dist/util/insert.js +25 -16
- package/dist/util/object.js +3 -1
- package/dist/util/random.js +5 -5
- package/dist/util/scope.js +1 -1
- package/package.json +11 -11
- package/samples/high.js +1 -198
- package/samples/low.js +1 -26
- package/samples/medium.js +1 -40
- package/src/presets.ts +3 -3
- package/src/transforms/calculator.ts +36 -5
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +86 -0
- package/src/transforms/transform.ts +10 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# `1.5.0`
|
|
2
2
|
Hexadecimal Numbers
|
|
3
3
|
|
|
4
4
|
- The hexadecimal representation can now be used. [#29](https://github.com/MichaelXF/js-confuser/issues/29)
|
|
@@ -8,6 +8,9 @@ Hexadecimal Numbers
|
|
|
8
8
|
|
|
9
9
|
Uses the hexadecimal representation (`50` -> `0x32`) for numbers. (`true/false`) -->
|
|
10
10
|
|
|
11
|
+
- Slight improvement to `Control Flow Flattening`
|
|
12
|
+
- Slight improvement to `Calculator`
|
|
13
|
+
|
|
11
14
|
# `1.4.3`
|
|
12
15
|
Minify Fix
|
|
13
16
|
|
package/README.md
CHANGED
|
@@ -115,9 +115,9 @@ JsConfuser.obfuscate(`<source code>`, {
|
|
|
115
115
|
|
|
116
116
|
Remove's whitespace from the final output. Enabled by default. (`true/false`)
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
### `hexadecimalNumbers`
|
|
119
119
|
|
|
120
|
-
Uses the hexadecimal representation (`50` -> `0x32`) for numbers. (`true/false`)
|
|
120
|
+
Uses the hexadecimal representation (`50` -> `0x32`) for numbers. (`true/false`)
|
|
121
121
|
|
|
122
122
|
### `minify`
|
|
123
123
|
|
|
@@ -532,6 +532,7 @@ function iVQoGQD(...iVQoGQD){
|
|
|
532
532
|
|
|
533
533
|
calculator: true,
|
|
534
534
|
compact: true,
|
|
535
|
+
hexadecimalNumbers: true,
|
|
535
536
|
controlFlowFlattening: 0.75,
|
|
536
537
|
deadCode: 0.2,
|
|
537
538
|
dispatcher: true,
|
|
@@ -566,6 +567,7 @@ function iVQoGQD(...iVQoGQD){
|
|
|
566
567
|
|
|
567
568
|
calculator: true,
|
|
568
569
|
compact: true,
|
|
570
|
+
hexadecimalNumbers: true,
|
|
569
571
|
controlFlowFlattening: 0.5,
|
|
570
572
|
deadCode: 0.025,
|
|
571
573
|
dispatcher: 0.75,
|
|
@@ -594,6 +596,7 @@ function iVQoGQD(...iVQoGQD){
|
|
|
594
596
|
|
|
595
597
|
calculator: true,
|
|
596
598
|
compact: true,
|
|
599
|
+
hexadecimalNumbers: true,
|
|
597
600
|
controlFlowFlattening: 0.25,
|
|
598
601
|
deadCode: 0.01,
|
|
599
602
|
dispatcher: 0.5,
|
package/dev.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
require("@babel/register")({
|
|
2
|
-
presets: [
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
extensions: [".js", ".jsx", ".ts", ".tsx"],
|
|
2
|
+
presets: ["@babel/preset-typescript"],
|
|
3
|
+
extensions: [".js", ".ts"],
|
|
4
|
+
cache: true,
|
|
5
|
+
retainLines: true,
|
|
7
6
|
});
|
|
8
7
|
|
|
9
8
|
module.exports = require("./dev.ts");
|
package/dist/compiler.js
CHANGED
package/dist/constants.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.reservedKeywords = exports.reservedIdentifiers = void 0;
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Keywords disallowed for variable names in ES5 and under.
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.obfuscate = obfuscate;
|
|
7
|
-
exports.obfuscateAST = obfuscateAST;
|
|
8
6
|
Object.defineProperty(exports, "Obfuscator", {
|
|
9
7
|
enumerable: true,
|
|
10
8
|
get: function () {
|
|
@@ -17,13 +15,15 @@ Object.defineProperty(exports, "Transform", {
|
|
|
17
15
|
return _transform.default;
|
|
18
16
|
}
|
|
19
17
|
});
|
|
18
|
+
exports.default = exports.debugTransformations = exports.debugObfuscation = void 0;
|
|
19
|
+
exports.obfuscate = obfuscate;
|
|
20
|
+
exports.obfuscateAST = obfuscateAST;
|
|
20
21
|
Object.defineProperty(exports, "presets", {
|
|
21
22
|
enumerable: true,
|
|
22
23
|
get: function () {
|
|
23
24
|
return _presets.default;
|
|
24
25
|
}
|
|
25
26
|
});
|
|
26
|
-
exports.default = exports.debugObfuscation = exports.debugTransformations = void 0;
|
|
27
27
|
|
|
28
28
|
var _compiler = _interopRequireWildcard(require("./compiler"));
|
|
29
29
|
|
|
@@ -43,9 +43,9 @@ var _options = require("./options");
|
|
|
43
43
|
|
|
44
44
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
45
45
|
|
|
46
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var
|
|
46
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
47
47
|
|
|
48
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
48
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* **JsConfuser**: Obfuscates JavaScript.
|
package/dist/obfuscator.js
CHANGED
|
@@ -78,7 +78,10 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
78
78
|
*/
|
|
79
79
|
class Obfuscator extends _events.EventEmitter {
|
|
80
80
|
constructor(options) {
|
|
81
|
+
var _this;
|
|
82
|
+
|
|
81
83
|
super();
|
|
84
|
+
_this = this;
|
|
82
85
|
this.options = options;
|
|
83
86
|
|
|
84
87
|
_defineProperty(this, "varCount", void 0);
|
|
@@ -97,10 +100,14 @@ class Obfuscator extends _events.EventEmitter {
|
|
|
97
100
|
this.push(new _preparation.default(this));
|
|
98
101
|
this.push(new _renameLabels.default(this));
|
|
99
102
|
|
|
100
|
-
const test = (map
|
|
103
|
+
const test = function (map) {
|
|
101
104
|
if ((0, _probability.isProbabilityMapProbable)(map)) {
|
|
105
|
+
for (var _len = arguments.length, transformers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
106
|
+
transformers[_key - 1] = arguments[_key];
|
|
107
|
+
}
|
|
108
|
+
|
|
102
109
|
// options.verbose && console.log("+ Added " + transformer.name);
|
|
103
|
-
transformers.forEach(Transformer =>
|
|
110
|
+
transformers.forEach(Transformer => _this.push(new Transformer(_this)));
|
|
104
111
|
} else {// options.verbose && console.log("- Skipped adding " + transformer.name);
|
|
105
112
|
}
|
|
106
113
|
}; // Optimization: Only add needed transformers. If a probability always return false, no need in running that extra code.
|
|
@@ -156,7 +163,8 @@ class Obfuscator extends _events.EventEmitter {
|
|
|
156
163
|
this.state = "transform";
|
|
157
164
|
}
|
|
158
165
|
|
|
159
|
-
async apply(tree
|
|
166
|
+
async apply(tree) {
|
|
167
|
+
let debugMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
160
168
|
(0, _assert.ok)(tree.type == "Program", "The root node must be type 'Program'");
|
|
161
169
|
(0, _assert.ok)(Array.isArray(tree.body), "The root's body property must be an array");
|
|
162
170
|
(0, _assert.ok)(Array.isArray(this.array));
|
package/dist/options.js
CHANGED
package/dist/parser.js
CHANGED
|
@@ -9,9 +9,9 @@ exports.parseSync = parseSync;
|
|
|
9
9
|
|
|
10
10
|
var assert = _interopRequireWildcard(require("assert"));
|
|
11
11
|
|
|
12
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var
|
|
12
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
13
13
|
|
|
14
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
14
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
15
15
|
|
|
16
16
|
const acorn = require("acorn");
|
|
17
17
|
/**
|
package/dist/precedence.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.OPERATOR_PRECEDENCE = exports.NEEDS_PARENTHESES = exports.EXPRESSIONS_PRECEDENCE = void 0;
|
|
7
7
|
const OPERATOR_PRECEDENCE = {
|
|
8
8
|
"||": 3,
|
|
9
9
|
"&&": 4,
|
package/dist/presets.js
CHANGED
|
@@ -33,7 +33,7 @@ const highPreset = {
|
|
|
33
33
|
preset: "high",
|
|
34
34
|
calculator: true,
|
|
35
35
|
compact: true,
|
|
36
|
-
hexadecimalNumbers:
|
|
36
|
+
hexadecimalNumbers: true,
|
|
37
37
|
controlFlowFlattening: 0.75,
|
|
38
38
|
deadCode: 0.2,
|
|
39
39
|
dispatcher: true,
|
|
@@ -70,7 +70,7 @@ const mediumPreset = {
|
|
|
70
70
|
preset: "medium",
|
|
71
71
|
calculator: true,
|
|
72
72
|
compact: true,
|
|
73
|
-
hexadecimalNumbers:
|
|
73
|
+
hexadecimalNumbers: true,
|
|
74
74
|
controlFlowFlattening: 0.5,
|
|
75
75
|
deadCode: 0.025,
|
|
76
76
|
dispatcher: 0.75,
|
|
@@ -98,7 +98,7 @@ const lowPreset = {
|
|
|
98
98
|
preset: "low",
|
|
99
99
|
calculator: true,
|
|
100
100
|
compact: true,
|
|
101
|
-
hexadecimalNumbers:
|
|
101
|
+
hexadecimalNumbers: true,
|
|
102
102
|
controlFlowFlattening: 0.25,
|
|
103
103
|
deadCode: 0.01,
|
|
104
104
|
dispatcher: 0.5,
|
package/dist/probability.js
CHANGED
|
@@ -16,7 +16,9 @@ var _object = require("./util/object");
|
|
|
16
16
|
* @param runner Custom function to determine return value
|
|
17
17
|
* @param customFnArgs Args given to user-implemented function, such as a variable name.
|
|
18
18
|
*/
|
|
19
|
-
function ComputeProbabilityMap(map
|
|
19
|
+
function ComputeProbabilityMap(map) {
|
|
20
|
+
let runner = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x => x;
|
|
21
|
+
|
|
20
22
|
if (!map) {
|
|
21
23
|
return runner();
|
|
22
24
|
}
|
|
@@ -30,6 +32,10 @@ function ComputeProbabilityMap(map, runner = x => x, ...customFnArgs) {
|
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
if (typeof map === "function") {
|
|
35
|
+
for (var _len = arguments.length, customFnArgs = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
|
36
|
+
customFnArgs[_key - 2] = arguments[_key];
|
|
37
|
+
}
|
|
38
|
+
|
|
33
39
|
return map(...customFnArgs);
|
|
34
40
|
}
|
|
35
41
|
|
|
@@ -19,6 +19,8 @@ var _assert = require("assert");
|
|
|
19
19
|
|
|
20
20
|
var _precedence = require("../precedence");
|
|
21
21
|
|
|
22
|
+
var _template = _interopRequireDefault(require("../templates/template"));
|
|
23
|
+
|
|
22
24
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
25
|
|
|
24
26
|
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; }
|
|
@@ -35,9 +37,15 @@ class Calculator extends _transform.default {
|
|
|
35
37
|
|
|
36
38
|
_defineProperty(this, "calculatorFn", void 0);
|
|
37
39
|
|
|
40
|
+
_defineProperty(this, "calculatorOpVar", void 0);
|
|
41
|
+
|
|
42
|
+
_defineProperty(this, "calculatorSetOpFn", void 0);
|
|
43
|
+
|
|
38
44
|
this.ops = Object.create(null);
|
|
39
45
|
this.statesUsed = new Set();
|
|
40
46
|
this.calculatorFn = this.getPlaceholder();
|
|
47
|
+
this.calculatorOpVar = this.getPlaceholder();
|
|
48
|
+
this.calculatorSetOpFn = this.getPlaceholder();
|
|
41
49
|
this.gen = this.getGenerator();
|
|
42
50
|
}
|
|
43
51
|
|
|
@@ -48,7 +56,6 @@ class Calculator extends _transform.default {
|
|
|
48
56
|
return;
|
|
49
57
|
}
|
|
50
58
|
|
|
51
|
-
var opArg = this.getPlaceholder();
|
|
52
59
|
var leftArg = this.getPlaceholder();
|
|
53
60
|
var rightArg = this.getPlaceholder();
|
|
54
61
|
var switchCases = [];
|
|
@@ -58,7 +65,12 @@ class Calculator extends _transform.default {
|
|
|
58
65
|
var body = [(0, _gen.ReturnStatement)(factory(operator, (0, _gen.Identifier)(leftArg), (0, _gen.Identifier)(rightArg)))];
|
|
59
66
|
switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
|
|
60
67
|
});
|
|
61
|
-
var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [
|
|
68
|
+
var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(this.calculatorOpVar), switchCases)]);
|
|
69
|
+
(0, _insert.prepend)(tree, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.calculatorOpVar)));
|
|
70
|
+
(0, _insert.prepend)(tree, (0, _template.default)("function {name}(a){\n a = {b} + ({b}=a, 0);\n return a;\n }").single({
|
|
71
|
+
name: this.calculatorSetOpFn,
|
|
72
|
+
b: this.calculatorOpVar
|
|
73
|
+
}));
|
|
62
74
|
(0, _insert.prepend)(tree, func);
|
|
63
75
|
}
|
|
64
76
|
|
|
@@ -99,7 +111,7 @@ class Calculator extends _transform.default {
|
|
|
99
111
|
this.log(operator, "calc(".concat(newState, ", left, right)"));
|
|
100
112
|
}
|
|
101
113
|
|
|
102
|
-
this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [(0, _gen.Literal)(this.ops[operator]),
|
|
114
|
+
this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [object.left, object.right, (0, _random.choice)([(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(this.calculatorOpVar), (0, _gen.Literal)(this.ops[operator])), (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorSetOpFn), [(0, _gen.Literal)(this.ops[operator])])])]));
|
|
103
115
|
};
|
|
104
116
|
}
|
|
105
117
|
|
|
@@ -71,6 +71,8 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
transform(object, parents) {
|
|
74
|
+
var _this = this;
|
|
75
|
+
|
|
74
76
|
return () => {
|
|
75
77
|
if (object.body.length < 3) {
|
|
76
78
|
return;
|
|
@@ -194,21 +196,29 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
194
196
|
var resultVar = this.getPlaceholder();
|
|
195
197
|
var argVar = this.getPlaceholder();
|
|
196
198
|
var testVar = this.getPlaceholder();
|
|
199
|
+
var stringBankVar = this.getPlaceholder();
|
|
200
|
+
var stringBank = Object.create(null);
|
|
201
|
+
var stringBankByLabels = Object.create(null);
|
|
202
|
+
let stringBankGen = this.getGenerator();
|
|
197
203
|
var needsTestVar = false;
|
|
198
204
|
var needsResultAndArgVar = false;
|
|
205
|
+
var needsStringBankVar = false;
|
|
199
206
|
var fnToLabel = Object.create(null);
|
|
200
207
|
fnNames.forEach(fnName => {
|
|
201
208
|
fnToLabel[fnName] = this.getPlaceholder();
|
|
202
209
|
});
|
|
203
210
|
|
|
204
|
-
const flattenBody = (body
|
|
211
|
+
const flattenBody = function (body) {
|
|
212
|
+
let startingLabel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this.getPlaceholder();
|
|
205
213
|
var chunks = [];
|
|
206
214
|
var currentBody = [];
|
|
207
215
|
var currentLabel = startingLabel;
|
|
208
216
|
|
|
209
|
-
const finishCurrentChunk = (pointingLabel, newLabel
|
|
217
|
+
const finishCurrentChunk = function (pointingLabel, newLabel) {
|
|
218
|
+
let addGotoStatement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
219
|
+
|
|
210
220
|
if (!newLabel) {
|
|
211
|
-
newLabel =
|
|
221
|
+
newLabel = _this.getPlaceholder();
|
|
212
222
|
}
|
|
213
223
|
|
|
214
224
|
if (!pointingLabel) {
|
|
@@ -226,6 +236,25 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
226
236
|
label: currentLabel,
|
|
227
237
|
body: [...currentBody]
|
|
228
238
|
});
|
|
239
|
+
(0, _traverse.walk)(currentBody, [], (o, p) => {
|
|
240
|
+
if (o.type == "Literal" && typeof o.value == "string" && !o.regex && Math.random() / (Object.keys(stringBank).length / 2 + 1) > 0.5) {
|
|
241
|
+
needsStringBankVar = true;
|
|
242
|
+
|
|
243
|
+
if (!stringBankByLabels[currentLabel]) {
|
|
244
|
+
stringBankByLabels[currentLabel] = new Set();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
stringBankByLabels[currentLabel].add(o.value);
|
|
248
|
+
|
|
249
|
+
if (typeof stringBank[o.value] === "undefined") {
|
|
250
|
+
stringBank[o.value] = stringBankGen.generate();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return () => {
|
|
254
|
+
_this.replaceIdentifierOrLiteral(o, (0, _gen.MemberExpression)((0, _gen.Identifier)(stringBankVar), (0, _gen.Literal)(stringBank[o.value]), true), p);
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
});
|
|
229
258
|
currentLabel = newLabel;
|
|
230
259
|
currentBody = [];
|
|
231
260
|
};
|
|
@@ -243,7 +272,8 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
243
272
|
}
|
|
244
273
|
|
|
245
274
|
if (stmt.$callExpression && fnToLabel[stmt.$fnName]) {
|
|
246
|
-
var afterPath =
|
|
275
|
+
var afterPath = _this.getPlaceholder();
|
|
276
|
+
|
|
247
277
|
var args = [];
|
|
248
278
|
|
|
249
279
|
switch (stmt.$callExpression) {
|
|
@@ -300,10 +330,15 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
300
330
|
|
|
301
331
|
var isLoop = !isSwitchStatement;
|
|
302
332
|
var supportContinueStatement = isLoop;
|
|
303
|
-
|
|
304
|
-
var
|
|
305
|
-
|
|
306
|
-
var
|
|
333
|
+
|
|
334
|
+
var testPath = _this.getPlaceholder();
|
|
335
|
+
|
|
336
|
+
var updatePath = _this.getPlaceholder();
|
|
337
|
+
|
|
338
|
+
var bodyPath = _this.getPlaceholder();
|
|
339
|
+
|
|
340
|
+
var afterPath = _this.getPlaceholder();
|
|
341
|
+
|
|
307
342
|
var possible = true;
|
|
308
343
|
var toReplace = [];
|
|
309
344
|
(0, _traverse.walk)(control.body, [], (o, p) => {
|
|
@@ -329,15 +364,19 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
329
364
|
return;
|
|
330
365
|
}
|
|
331
366
|
|
|
332
|
-
toReplace.forEach(v =>
|
|
367
|
+
toReplace.forEach(v => _this.replace(v[0], v[1]));
|
|
333
368
|
|
|
334
369
|
if (isSwitchStatement) {
|
|
335
|
-
var switchVarName =
|
|
370
|
+
var switchVarName = _this.getPlaceholder();
|
|
371
|
+
|
|
336
372
|
currentBody.push((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(switchVarName, control.discriminant)));
|
|
337
|
-
|
|
373
|
+
|
|
374
|
+
var afterPath = _this.getPlaceholder();
|
|
375
|
+
|
|
338
376
|
finishCurrentChunk();
|
|
339
377
|
control.cases.forEach((switchCase, i) => {
|
|
340
|
-
var entryPath =
|
|
378
|
+
var entryPath = _this.getPlaceholder();
|
|
379
|
+
|
|
341
380
|
currentBody.push((0, _gen.IfStatement)((0, _gen.BinaryExpression)("===", (0, _gen.Identifier)(switchVarName), switchCase.test), [{
|
|
342
381
|
type: "GotoStatement",
|
|
343
382
|
label: entryPath
|
|
@@ -375,7 +414,9 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
375
414
|
}])); // create new label called `bodyPath` and have test body point to afterPath (goto afterPath)
|
|
376
415
|
|
|
377
416
|
finishCurrentChunk(afterPath, bodyPath);
|
|
378
|
-
|
|
417
|
+
|
|
418
|
+
var innerBothPath = _this.getPlaceholder();
|
|
419
|
+
|
|
379
420
|
chunks.push(...flattenBody([...control.body.body, {
|
|
380
421
|
type: "GotoStatement",
|
|
381
422
|
label: updatePath
|
|
@@ -399,9 +440,13 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
399
440
|
finishCurrentChunk();
|
|
400
441
|
var hasAlternate = !!stmt.alternate;
|
|
401
442
|
(0, _assert.ok)(!(hasAlternate && stmt.alternate.type !== "BlockStatement"));
|
|
402
|
-
|
|
403
|
-
var
|
|
404
|
-
|
|
443
|
+
|
|
444
|
+
var yesPath = _this.getPlaceholder();
|
|
445
|
+
|
|
446
|
+
var noPath = _this.getPlaceholder();
|
|
447
|
+
|
|
448
|
+
var afterPath = _this.getPlaceholder();
|
|
449
|
+
|
|
405
450
|
currentBody.push((0, _gen.IfStatement)((0, _gen.Identifier)(testVar), [{
|
|
406
451
|
type: "GotoStatement",
|
|
407
452
|
label: yesPath
|
|
@@ -582,6 +627,7 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
582
627
|
var made = 1;
|
|
583
628
|
var breaksInsertion = [];
|
|
584
629
|
var staticStateValues = [...labelToStates[chunk.label]];
|
|
630
|
+
var potentialBranches = new Set();
|
|
585
631
|
chunk.body.forEach((stmt, stmtIndex) => {
|
|
586
632
|
var addBreak = false;
|
|
587
633
|
(0, _traverse.walk)(stmt, [], (o, p) => {
|
|
@@ -611,6 +657,7 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
611
657
|
p[blockIndex].body.splice(childIndex + 1, 0, (0, _gen.BreakStatement)(switchLabel));
|
|
612
658
|
}
|
|
613
659
|
|
|
660
|
+
potentialBranches.add(o.label);
|
|
614
661
|
var mutatingStateValues = [...labelToStates[chunk.label]];
|
|
615
662
|
var nextStateValues = labelToStates[o.label];
|
|
616
663
|
(0, _assert.ok)(nextStateValues, o.label);
|
|
@@ -630,10 +677,21 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
630
677
|
breaksInsertion.reverse();
|
|
631
678
|
breaksInsertion.forEach(index => {
|
|
632
679
|
chunk.body.splice(index + 1, 0, (0, _gen.BreakStatement)(switchLabel));
|
|
633
|
-
});
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
for (var branch of Array.from(potentialBranches)) {
|
|
683
|
+
var strings = stringBankByLabels[branch];
|
|
684
|
+
|
|
685
|
+
if (strings) {
|
|
686
|
+
chunk.body.unshift((0, _gen.ExpressionStatement)((0, _gen.SequenceExpression)(Array.from(strings).map(strValue => {
|
|
687
|
+
return (0, _gen.AssignmentExpression)("=", (0, _gen.MemberExpression)((0, _gen.Identifier)(stringBankVar), (0, _gen.Literal)(stringBank[strValue]), true), (0, _gen.Literal)(strValue));
|
|
688
|
+
}))));
|
|
689
|
+
}
|
|
690
|
+
} // var c = Identifier("undefined");
|
|
634
691
|
// this.addComment(c, stateValues.join(", "));
|
|
635
692
|
// transitionStatements.push(c);
|
|
636
693
|
|
|
694
|
+
|
|
637
695
|
var caseObject = {
|
|
638
696
|
body: chunk.body,
|
|
639
697
|
state: state,
|
|
@@ -675,6 +733,10 @@ class ControlFlowFlattening extends _transform.default {
|
|
|
675
733
|
declarations.push((0, _gen.VariableDeclarator)(argVar));
|
|
676
734
|
}
|
|
677
735
|
|
|
736
|
+
if (needsStringBankVar) {
|
|
737
|
+
declarations.push((0, _gen.VariableDeclarator)(stringBankVar, (0, _gen.ObjectExpression)(stringBankByLabels[startLabel] ? Array.from(stringBankByLabels[startLabel]).map(strValue => (0, _gen.Property)((0, _gen.Literal)(stringBank[strValue]), (0, _gen.Literal)(strValue), false)) : [])));
|
|
738
|
+
}
|
|
739
|
+
|
|
678
740
|
declarations.push(...stateVars.map((stateVar, i) => {
|
|
679
741
|
return (0, _gen.VariableDeclarator)(stateVar, (0, _gen.Literal)(initStateValues[i]));
|
|
680
742
|
}));
|
|
@@ -255,7 +255,9 @@ class Dispatcher extends _transform.default {
|
|
|
255
255
|
(0, _insert.prepend)(object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(payloadArg, (0, _gen.ArrayExpression)([]))));
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
-
identifiers.forEach(
|
|
258
|
+
identifiers.forEach(_ref => {
|
|
259
|
+
let [o, p] = _ref;
|
|
260
|
+
|
|
259
261
|
if (o.type != "Identifier") {
|
|
260
262
|
return;
|
|
261
263
|
}
|
|
@@ -21,9 +21,9 @@ var _transform = _interopRequireDefault(require("./transform"));
|
|
|
21
21
|
|
|
22
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
23
|
|
|
24
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var
|
|
24
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
25
|
|
|
26
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
26
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
27
27
|
|
|
28
28
|
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; }
|
|
29
29
|
|
|
@@ -131,14 +131,17 @@ class HideInitializingCode extends _transform.default {
|
|
|
131
131
|
var fnsToMake = (0, _random.getRandomInteger)(1, 5);
|
|
132
132
|
var numberLiteralsMade = 1;
|
|
133
133
|
|
|
134
|
-
function numberLiteral(num
|
|
134
|
+
function numberLiteral(num) {
|
|
135
|
+
let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
136
|
+
|
|
135
137
|
if (depth > 6 || Math.random() > 0.8 / depth || Math.random() > 80 / numberLiteralsMade) {
|
|
136
138
|
return (0, _gen.Literal)(num);
|
|
137
139
|
}
|
|
138
140
|
|
|
139
141
|
numberLiteralsMade++;
|
|
140
142
|
|
|
141
|
-
function ternaryCall(name
|
|
143
|
+
function ternaryCall(name) {
|
|
144
|
+
let param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _random.getRandomInteger)(-250, 250);
|
|
142
145
|
return (0, _gen.ConditionalExpression)((0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)(name)), (0, _gen.Literal)("function")), (0, _gen.CallExpression)((0, _gen.Identifier)(name), [numberLiteral(param, depth + 1)]), (0, _gen.Identifier)(name));
|
|
143
146
|
}
|
|
144
147
|
|
|
@@ -232,7 +235,9 @@ class HideInitializingCode extends _transform.default {
|
|
|
232
235
|
return (0, _gen.ConditionalExpression)((0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)(name)), (0, _gen.Literal)("function")), (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(name), (0, _gen.Identifier)("call"), false), [(0, _gen.ThisExpression)(), numberLiteral(param)]), (0, _gen.Identifier)(name));
|
|
233
236
|
}
|
|
234
237
|
|
|
235
|
-
function ternaryHell(expr
|
|
238
|
+
function ternaryHell(expr) {
|
|
239
|
+
let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
240
|
+
|
|
236
241
|
if (!depth || depth > 5 || Math.random() > 0.99 / (depth / 2)) {
|
|
237
242
|
return expr;
|
|
238
243
|
}
|
|
@@ -155,7 +155,9 @@ class GlobalConcealing extends _transform.default {
|
|
|
155
155
|
|
|
156
156
|
used.add(state);
|
|
157
157
|
newNames[name] = state;
|
|
158
|
-
locations.forEach(
|
|
158
|
+
locations.forEach(_ref => {
|
|
159
|
+
let [node, parents] = _ref;
|
|
160
|
+
|
|
159
161
|
if (!parents.find(x => x.$dispatcherSkip)) {
|
|
160
162
|
// Do not replace
|
|
161
163
|
if (parents[0]) {
|
|
@@ -161,7 +161,8 @@ class NameRecycling extends _transform.default {
|
|
|
161
161
|
var newName = newNames[name];
|
|
162
162
|
|
|
163
163
|
if (newName) {
|
|
164
|
-
locations.forEach(
|
|
164
|
+
locations.forEach(_ref => {
|
|
165
|
+
let [object, parents] = _ref;
|
|
165
166
|
object.name = newName;
|
|
166
167
|
var declaratorIndex = parents.findIndex(p => p.type == "VariableDeclarator");
|
|
167
168
|
|
|
@@ -28,7 +28,8 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
28
28
|
* @param str
|
|
29
29
|
* @param seed
|
|
30
30
|
*/
|
|
31
|
-
function cyrb53(str
|
|
31
|
+
function cyrb53(str) {
|
|
32
|
+
let seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
32
33
|
let h1 = 0xdeadbeef ^ seed,
|
|
33
34
|
h2 = 0x41c6ce57 ^ seed;
|
|
34
35
|
|
|
@@ -31,9 +31,9 @@ var _compare = require("../../util/compare");
|
|
|
31
31
|
|
|
32
32
|
var _assert = require("assert");
|
|
33
33
|
|
|
34
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var
|
|
34
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
35
35
|
|
|
36
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
36
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
37
37
|
|
|
38
38
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
39
39
|
|