js-confuser 1.7.1 → 1.7.3
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/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +73 -0
- package/README.md +32 -31
- package/dist/compiler.js +2 -8
- package/dist/constants.js +22 -10
- package/dist/index.js +15 -30
- package/dist/obfuscator.js +15 -62
- package/dist/options.js +33 -40
- package/dist/order.js +4 -7
- package/dist/parser.js +5 -13
- package/dist/precedence.js +6 -8
- package/dist/presets.js +4 -6
- package/dist/probability.js +13 -24
- package/dist/templates/bufferToString.js +121 -5
- package/dist/templates/core.js +35 -0
- package/dist/templates/crash.js +22 -11
- package/dist/templates/es5.js +125 -6
- package/dist/templates/functionLength.js +24 -6
- package/dist/templates/globals.js +9 -0
- package/dist/templates/template.js +189 -43
- package/dist/transforms/antiTooling.js +26 -22
- package/dist/transforms/calculator.js +19 -55
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +242 -333
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
- package/dist/transforms/deadCode.js +542 -31
- package/dist/transforms/dispatcher.js +112 -112
- package/dist/transforms/es5/antiClass.js +70 -44
- package/dist/transforms/es5/antiDestructuring.js +14 -38
- package/dist/transforms/es5/antiES6Object.js +39 -48
- package/dist/transforms/es5/antiSpreadOperator.js +5 -14
- package/dist/transforms/es5/antiTemplate.js +10 -19
- package/dist/transforms/es5/es5.js +7 -40
- package/dist/transforms/extraction/classExtraction.js +83 -0
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
- package/dist/transforms/extraction/objectExtraction.js +24 -56
- package/dist/transforms/finalizer.js +6 -20
- package/dist/transforms/flatten.js +51 -99
- package/dist/transforms/identifier/globalAnalysis.js +21 -26
- package/dist/transforms/identifier/globalConcealing.js +72 -56
- package/dist/transforms/identifier/movedDeclarations.js +66 -38
- package/dist/transforms/identifier/renameVariables.js +36 -68
- package/dist/transforms/identifier/variableAnalysis.js +21 -48
- package/dist/transforms/lock/antiDebug.js +20 -25
- package/dist/transforms/lock/integrity.js +53 -52
- package/dist/transforms/lock/lock.js +161 -126
- package/dist/transforms/minify.js +77 -108
- package/dist/transforms/opaquePredicates.js +12 -49
- package/dist/transforms/preparation.js +28 -49
- package/dist/transforms/renameLabels.js +5 -22
- package/dist/transforms/rgf.js +125 -72
- package/dist/transforms/shuffle.js +42 -47
- package/dist/transforms/stack.js +41 -98
- package/dist/transforms/string/encoding.js +76 -27
- package/dist/transforms/string/stringCompression.js +75 -68
- package/dist/transforms/string/stringConcealing.js +127 -135
- package/dist/transforms/string/stringEncoding.js +6 -26
- package/dist/transforms/string/stringSplitting.js +5 -30
- package/dist/transforms/transform.js +76 -104
- package/dist/traverse.js +11 -18
- package/dist/util/compare.js +27 -29
- package/dist/util/gen.js +32 -86
- package/dist/util/guard.js +5 -1
- package/dist/util/identifiers.js +9 -72
- package/dist/util/insert.js +27 -77
- package/dist/util/math.js +0 -3
- package/dist/util/object.js +3 -7
- package/dist/util/random.js +31 -36
- package/dist/util/scope.js +6 -3
- package/docs/Countermeasures.md +13 -6
- package/docs/Integrity.md +35 -28
- package/docs/RGF.md +6 -1
- package/docs/RenameVariables.md +116 -0
- package/docs/TamperProtection.md +100 -0
- package/docs/Template.md +117 -0
- package/package.json +3 -3
- package/src/constants.ts +17 -0
- package/src/index.ts +7 -5
- package/src/options.ts +60 -7
- package/src/order.ts +2 -2
- package/src/templates/bufferToString.ts +79 -11
- package/src/templates/core.ts +29 -0
- package/src/templates/crash.ts +6 -38
- package/src/templates/es5.ts +1 -1
- package/src/templates/functionLength.ts +21 -3
- package/src/templates/globals.ts +3 -0
- package/src/templates/template.ts +205 -46
- package/src/transforms/antiTooling.ts +33 -11
- package/src/transforms/calculator.ts +4 -2
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +12 -5
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
- package/src/transforms/deadCode.ts +74 -42
- package/src/transforms/dispatcher.ts +99 -73
- package/src/transforms/es5/antiClass.ts +25 -12
- package/src/transforms/es5/antiDestructuring.ts +1 -1
- package/src/transforms/es5/antiES6Object.ts +2 -2
- package/src/transforms/es5/antiTemplate.ts +1 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +11 -16
- package/src/transforms/extraction/objectExtraction.ts +4 -15
- package/src/transforms/flatten.ts +20 -5
- package/src/transforms/identifier/globalAnalysis.ts +18 -1
- package/src/transforms/identifier/globalConcealing.ts +119 -72
- package/src/transforms/identifier/movedDeclarations.ts +90 -24
- package/src/transforms/identifier/renameVariables.ts +16 -1
- package/src/transforms/lock/antiDebug.ts +2 -2
- package/src/transforms/lock/integrity.ts +13 -11
- package/src/transforms/lock/lock.ts +122 -30
- package/src/transforms/minify.ts +28 -13
- package/src/transforms/opaquePredicates.ts +2 -2
- package/src/transforms/preparation.ts +16 -0
- package/src/transforms/rgf.ts +139 -12
- package/src/transforms/shuffle.ts +3 -3
- package/src/transforms/stack.ts +19 -4
- package/src/transforms/string/encoding.ts +88 -51
- package/src/transforms/string/stringCompression.ts +86 -17
- package/src/transforms/string/stringConcealing.ts +148 -118
- package/src/transforms/string/stringEncoding.ts +1 -2
- package/src/transforms/string/stringSplitting.ts +1 -2
- package/src/transforms/transform.ts +63 -46
- package/src/types.ts +2 -0
- package/src/util/compare.ts +39 -5
- package/src/util/gen.ts +10 -3
- package/src/util/guard.ts +10 -0
- package/src/util/insert.ts +17 -0
- package/src/util/random.ts +81 -1
- package/src/util/scope.ts +14 -2
- package/test/code/Cash.test.ts +94 -5
- package/test/code/StrictMode.src.js +65 -0
- package/test/code/StrictMode.test.js +37 -0
- package/test/compare.test.ts +62 -2
- package/test/options.test.ts +129 -55
- package/test/templates/template.test.ts +211 -1
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
- package/test/transforms/dispatcher.test.ts +55 -0
- package/test/transforms/extraction/classExtraction.test.ts +86 -0
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
- package/test/transforms/extraction/objectExtraction.test.ts +2 -0
- package/test/transforms/identifier/globalConcealing.test.ts +89 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
- package/test/transforms/identifier/renameVariables.test.ts +75 -1
- package/test/transforms/lock/tamperProtection.test.ts +336 -0
- package/test/transforms/minify.test.ts +37 -0
- package/test/transforms/rgf.test.ts +50 -0
- package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
- package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
- package/dist/transforms/eval.js +0 -84
- package/dist/transforms/hexadecimalNumbers.js +0 -63
- package/dist/transforms/hideInitializingCode.js +0 -270
- package/dist/transforms/identifier/nameRecycling.js +0 -218
- package/dist/transforms/label.js +0 -67
- package/dist/transforms/preparation/nameConflicts.js +0 -116
- package/dist/transforms/preparation/preparation.js +0 -188
|
@@ -4,100 +4,76 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _assert = require("assert");
|
|
9
|
-
|
|
10
8
|
var _constants = require("../../constants");
|
|
11
|
-
|
|
12
9
|
var _compare = require("../../util/compare");
|
|
13
|
-
|
|
14
10
|
var _identifiers = require("../../util/identifiers");
|
|
15
|
-
|
|
16
11
|
var _insert = require("../../util/insert");
|
|
17
|
-
|
|
18
12
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
19
|
-
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
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; }
|
|
15
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
16
|
+
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
17
|
/**
|
|
25
18
|
* Keeps track of what identifiers are defined and referenced in each context.
|
|
26
19
|
*/
|
|
27
20
|
class VariableAnalysis extends _transform.default {
|
|
28
|
-
/**
|
|
29
|
-
* Node being the context.
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Context->Nodes referenced (does not include nested)
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Set of global identifiers to never be redefined
|
|
38
|
-
*
|
|
39
|
-
* - Used to not accidentally block access to a global variable
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Set of identifiers that are defined within the program
|
|
44
|
-
*/
|
|
45
21
|
constructor(o) {
|
|
46
22
|
super(o);
|
|
47
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Node being the context.
|
|
25
|
+
*/
|
|
48
26
|
_defineProperty(this, "defined", void 0);
|
|
49
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Context->Nodes referenced (does not include nested)
|
|
29
|
+
*/
|
|
50
30
|
_defineProperty(this, "references", void 0);
|
|
51
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Set of global identifiers to never be redefined
|
|
33
|
+
*
|
|
34
|
+
* - Used to not accidentally block access to a global variable
|
|
35
|
+
*/
|
|
52
36
|
_defineProperty(this, "globals", void 0);
|
|
53
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Set of identifiers that are defined within the program
|
|
39
|
+
*/
|
|
54
40
|
_defineProperty(this, "notGlobals", void 0);
|
|
55
|
-
|
|
56
41
|
this.defined = new Map();
|
|
57
42
|
this.references = new Map();
|
|
58
43
|
this.globals = new Set();
|
|
59
44
|
this.notGlobals = new Set();
|
|
60
45
|
}
|
|
61
|
-
|
|
62
46
|
match(object, parents) {
|
|
63
47
|
return object.type === "Identifier";
|
|
64
48
|
}
|
|
65
|
-
|
|
66
49
|
transform(object, parents) {
|
|
67
50
|
var name = object.name;
|
|
68
51
|
(0, _assert.ok)(typeof name === "string");
|
|
69
|
-
|
|
70
52
|
if (!(0, _compare.isValidIdentifier)(name)) {
|
|
71
53
|
return;
|
|
72
54
|
}
|
|
73
|
-
|
|
74
55
|
if (_constants.reservedIdentifiers.has(name)) {
|
|
75
56
|
return;
|
|
76
57
|
}
|
|
77
|
-
|
|
78
58
|
if (this.options.globalVariables.has(name)) {
|
|
79
59
|
return;
|
|
80
60
|
}
|
|
81
|
-
|
|
82
61
|
var info = (0, _identifiers.getIdentifierInfo)(object, parents);
|
|
83
|
-
|
|
84
62
|
if (!info.spec.isReferenced) {
|
|
85
63
|
return;
|
|
86
64
|
}
|
|
87
|
-
|
|
88
65
|
if (info.spec.isExported) {
|
|
89
66
|
return;
|
|
90
67
|
}
|
|
68
|
+
var isDefined = info.spec.isDefined;
|
|
91
69
|
|
|
92
|
-
|
|
93
|
-
|
|
70
|
+
// Keep track of defined names within the program
|
|
94
71
|
if (isDefined) {
|
|
95
72
|
this.notGlobals.add(object.name);
|
|
96
73
|
this.globals.delete(object.name);
|
|
97
74
|
} else if (!this.notGlobals.has(object.name)) {
|
|
98
75
|
this.globals.add(object.name);
|
|
99
76
|
}
|
|
100
|
-
|
|
101
77
|
var definingContexts = info.spec.isDefined ? (0, _insert.getAllDefiningContexts)(object, parents) : (0, _insert.getReferencingContexts)(object, parents, info);
|
|
102
78
|
(0, _assert.ok)(definingContexts.length);
|
|
103
79
|
definingContexts.forEach(definingContext => {
|
|
@@ -105,12 +81,12 @@ class VariableAnalysis extends _transform.default {
|
|
|
105
81
|
// isContext(definingContext),
|
|
106
82
|
// `${definingContext.type} is not a context`
|
|
107
83
|
// );
|
|
84
|
+
|
|
108
85
|
if (isDefined) {
|
|
109
86
|
// Add to defined Map
|
|
110
87
|
if (!this.defined.has(definingContext)) {
|
|
111
88
|
this.defined.set(definingContext, new Set());
|
|
112
89
|
}
|
|
113
|
-
|
|
114
90
|
this.defined.get(definingContext).add(name);
|
|
115
91
|
this.references.has(definingContext) && this.references.get(definingContext).delete(name);
|
|
116
92
|
} else {
|
|
@@ -119,13 +95,10 @@ class VariableAnalysis extends _transform.default {
|
|
|
119
95
|
if (!this.references.has(definingContext)) {
|
|
120
96
|
this.references.set(definingContext, new Set());
|
|
121
97
|
}
|
|
122
|
-
|
|
123
98
|
this.references.get(definingContext).add(name);
|
|
124
99
|
}
|
|
125
100
|
}
|
|
126
101
|
});
|
|
127
102
|
}
|
|
128
|
-
|
|
129
103
|
}
|
|
130
|
-
|
|
131
104
|
exports.default = VariableAnalysis;
|
|
@@ -4,69 +4,66 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _order = require("../../order");
|
|
9
|
-
|
|
10
8
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
11
|
-
|
|
12
9
|
var _traverse = require("../../traverse");
|
|
13
|
-
|
|
14
10
|
var _gen = require("../../util/gen");
|
|
15
|
-
|
|
16
11
|
var _insert = require("../../util/insert");
|
|
17
|
-
|
|
18
12
|
var _random = require("../../util/random");
|
|
19
|
-
|
|
20
13
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
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; }
|
|
16
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
17
|
+
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); }
|
|
18
|
+
var DevToolsDetection = new _template.default(`
|
|
19
|
+
try {
|
|
20
|
+
if ( setInterval ) {
|
|
21
|
+
setInterval(()=>{
|
|
22
|
+
{functionName}();
|
|
23
|
+
}, 4000);
|
|
24
|
+
}
|
|
25
|
+
} catch ( e ) {
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
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; }
|
|
25
|
-
|
|
26
|
-
var DevToolsDetection = (0, _template.default)("\n try {\n if ( setInterval ) {\n setInterval(()=>{\n {functionName}();\n }, 4000);\n }\n } catch ( e ) {\n\n }\n");
|
|
27
|
-
|
|
27
|
+
}
|
|
28
|
+
`);
|
|
28
29
|
class AntiDebug extends _transform.default {
|
|
29
30
|
constructor(o, lock) {
|
|
30
31
|
super(o, _order.ObfuscateOrder.Lock);
|
|
31
|
-
|
|
32
32
|
_defineProperty(this, "made", void 0);
|
|
33
|
-
|
|
34
33
|
_defineProperty(this, "lock", void 0);
|
|
35
|
-
|
|
36
34
|
this.lock = lock;
|
|
37
35
|
this.made = 0;
|
|
38
36
|
}
|
|
39
|
-
|
|
40
37
|
apply(tree) {
|
|
41
38
|
super.apply(tree);
|
|
42
39
|
var fnName = this.getPlaceholder();
|
|
43
40
|
var startTimeName = this.getPlaceholder();
|
|
44
41
|
var endTimeName = this.getPlaceholder();
|
|
45
42
|
var isDevName = this.getPlaceholder();
|
|
46
|
-
var functionDeclaration = (0, _gen.FunctionDeclaration)(fnName, [], [...
|
|
43
|
+
var functionDeclaration = (0, _gen.FunctionDeclaration)(fnName, [], [...new _template.default(`
|
|
44
|
+
var ${startTimeName} = new Date();
|
|
45
|
+
debugger;
|
|
46
|
+
var ${endTimeName} = new Date();
|
|
47
|
+
var ${isDevName} = ${endTimeName}-${startTimeName} > 1000;
|
|
48
|
+
`).compile(), (0, _gen.IfStatement)((0, _gen.Identifier)(isDevName), this.options.lock.countermeasures ? this.lock.getCounterMeasuresCode(tree.body, [tree]) : [(0, _gen.WhileStatement)((0, _gen.Identifier)(isDevName), [(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(startTimeName), (0, _gen.Identifier)(endTimeName)))])], null)]);
|
|
47
49
|
tree.body.unshift(...DevToolsDetection.compile({
|
|
48
50
|
functionName: fnName
|
|
49
51
|
}));
|
|
50
52
|
tree.body.push(functionDeclaration);
|
|
51
53
|
}
|
|
52
|
-
|
|
53
54
|
match(object, parents) {
|
|
54
55
|
return (0, _traverse.isBlock)(object);
|
|
55
56
|
}
|
|
56
|
-
|
|
57
57
|
transform(object, parents) {
|
|
58
58
|
return () => {
|
|
59
59
|
var body = (0, _insert.getBlockBody)(object.body);
|
|
60
60
|
[...body].forEach((stmt, i) => {
|
|
61
61
|
var addDebugger = Math.random() < 0.1 / (this.made || 1);
|
|
62
|
-
|
|
63
62
|
if (object.type == "Program" && i == 0) {
|
|
64
63
|
addDebugger = true;
|
|
65
64
|
}
|
|
66
|
-
|
|
67
65
|
if (addDebugger) {
|
|
68
66
|
var index = (0, _random.getRandomInteger)(0, body.length);
|
|
69
|
-
|
|
70
67
|
if (body[index].type != "DebuggerStatement") {
|
|
71
68
|
body.splice(index, 0, (0, _gen.DebuggerStatement)());
|
|
72
69
|
this.made++;
|
|
@@ -75,7 +72,5 @@ class AntiDebug extends _transform.default {
|
|
|
75
72
|
});
|
|
76
73
|
};
|
|
77
74
|
}
|
|
78
|
-
|
|
79
75
|
}
|
|
80
|
-
|
|
81
76
|
exports.default = AntiDebug;
|
|
@@ -4,25 +4,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
9
|
-
|
|
10
8
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
11
|
-
|
|
12
9
|
var _gen = require("../../util/gen");
|
|
13
|
-
|
|
14
10
|
var _insert = require("../../util/insert");
|
|
15
|
-
|
|
16
11
|
var _random = require("../../util/random");
|
|
17
|
-
|
|
18
12
|
var _assert = require("assert");
|
|
19
|
-
|
|
20
13
|
var _compiler = require("../../compiler");
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
|
|
24
|
-
function
|
|
25
|
-
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
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; }
|
|
16
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
17
|
+
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); }
|
|
26
18
|
/**
|
|
27
19
|
* Hashing Algorithm for function integrity
|
|
28
20
|
* @param str
|
|
@@ -31,25 +23,55 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
31
23
|
function cyrb53(str) {
|
|
32
24
|
let seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
33
25
|
let h1 = 0xdeadbeef ^ seed,
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
h2 = 0x41c6ce57 ^ seed;
|
|
36
27
|
for (let i = 0, ch; i < str.length; i++) {
|
|
37
28
|
ch = str.charCodeAt(i);
|
|
38
29
|
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
39
30
|
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
40
31
|
}
|
|
41
|
-
|
|
42
32
|
h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909);
|
|
43
33
|
h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909);
|
|
44
34
|
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const HashTemplate = (0, _template.default)("\nfunction {name}(str, seed) {\n var h1 = 0xdeadbeef ^ seed;\n var h2 = 0x41c6ce57 ^ seed;\n for (var i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = {imul}(h1 ^ ch, 2654435761);\n h2 = {imul}(h2 ^ ch, 1597334677);\n }\n h1 = {imul}(h1 ^ (h1>>>16), 2246822507) ^ {imul}(h2 ^ (h2>>>13), 3266489909);\n h2 = {imul}(h2 ^ (h2>>>16), 2246822507) ^ {imul}(h1 ^ (h1>>>13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1>>>0);\n};"); // Math.imul polyfill for ES5
|
|
35
|
+
}
|
|
49
36
|
|
|
50
|
-
|
|
37
|
+
// In template form to be inserted into code
|
|
38
|
+
const HashTemplate = new _template.default(`
|
|
39
|
+
function {name}(str, seed) {
|
|
40
|
+
var h1 = 0xdeadbeef ^ seed;
|
|
41
|
+
var h2 = 0x41c6ce57 ^ seed;
|
|
42
|
+
for (var i = 0, ch; i < str.length; i++) {
|
|
43
|
+
ch = str.charCodeAt(i);
|
|
44
|
+
h1 = {imul}(h1 ^ ch, 2654435761);
|
|
45
|
+
h2 = {imul}(h2 ^ ch, 1597334677);
|
|
46
|
+
}
|
|
47
|
+
h1 = {imul}(h1 ^ (h1>>>16), 2246822507) ^ {imul}(h2 ^ (h2>>>13), 3266489909);
|
|
48
|
+
h2 = {imul}(h2 ^ (h2>>>16), 2246822507) ^ {imul}(h1 ^ (h1>>>13), 3266489909);
|
|
49
|
+
return 4294967296 * (2097151 & h2) + (h1>>>0);
|
|
50
|
+
};`);
|
|
51
|
+
|
|
52
|
+
// Math.imul polyfill for ES5
|
|
53
|
+
const ImulTemplate = new _template.default(`
|
|
54
|
+
var {name} = Math.imul || function(opA, opB){
|
|
55
|
+
opB |= 0; // ensure that opB is an integer. opA will automatically be coerced.
|
|
56
|
+
// floating points give us 53 bits of precision to work with plus 1 sign bit
|
|
57
|
+
// automatically handled for our convienence:
|
|
58
|
+
// 1. 0x003fffff /*opA & 0x000fffff*/ * 0x7fffffff /*opB*/ = 0x1fffff7fc00001
|
|
59
|
+
// 0x1fffff7fc00001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/
|
|
60
|
+
var result = (opA & 0x003fffff) * opB;
|
|
61
|
+
// 2. We can remove an integer coersion from the statement above because:
|
|
62
|
+
// 0x1fffff7fc00001 + 0xffc00000 = 0x1fffffff800001
|
|
63
|
+
// 0x1fffffff800001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/
|
|
64
|
+
if (opA & 0xffc00000 /*!== 0*/) result += (opA & 0xffc00000) * opB |0;
|
|
65
|
+
return result |0;
|
|
66
|
+
};`);
|
|
67
|
+
|
|
68
|
+
// Simple function that returns .toString() value with spaces replaced out
|
|
69
|
+
const StringTemplate = new _template.default(`
|
|
70
|
+
function {name}(x){
|
|
71
|
+
return x.toString().replace(/ |\\n|;|,|\\{|\\}|\\(|\\)|\\.|\\[|\\]/g, "");
|
|
72
|
+
}
|
|
73
|
+
`);
|
|
51
74
|
|
|
52
|
-
const StringTemplate = (0, _template.default)("\n function {name}(x){\n return x.toString().replace(/ |\\n|;|,|\\{|\\}|\\(|\\)|\\.|\\[|\\]/g, \"\");\n }\n");
|
|
53
75
|
/**
|
|
54
76
|
* Integrity protects functions by using checksum techniques to verify their code has not changed.
|
|
55
77
|
*
|
|
@@ -69,30 +91,21 @@ const StringTemplate = (0, _template.default)("\n function {name}(x){\n retu
|
|
|
69
91
|
* - The hashing function is placed during this transformation,
|
|
70
92
|
* - A hidden identifier is placed to keep track of the name.
|
|
71
93
|
*/
|
|
72
|
-
|
|
73
94
|
class Integrity extends _transform.default {
|
|
74
95
|
constructor(o, lock) {
|
|
75
96
|
super(o);
|
|
76
|
-
|
|
77
97
|
_defineProperty(this, "hashFn", void 0);
|
|
78
|
-
|
|
79
98
|
_defineProperty(this, "imulFn", void 0);
|
|
80
|
-
|
|
81
99
|
_defineProperty(this, "stringFn", void 0);
|
|
82
|
-
|
|
83
100
|
_defineProperty(this, "seed", void 0);
|
|
84
|
-
|
|
85
101
|
_defineProperty(this, "lock", void 0);
|
|
86
|
-
|
|
87
102
|
this.lock = lock;
|
|
88
103
|
this.seed = (0, _random.getRandomInteger)(0, 1000);
|
|
89
104
|
}
|
|
90
|
-
|
|
91
105
|
match(object, parents) {
|
|
92
106
|
// ArrowFunctions are excluded!
|
|
93
107
|
return object.type == "Program" || (0, _insert.isFunction)(object) && object.type !== "ArrowFunctionExpression";
|
|
94
108
|
}
|
|
95
|
-
|
|
96
109
|
transform(object, parents) {
|
|
97
110
|
if (object.type == "Program") {
|
|
98
111
|
return () => {
|
|
@@ -101,7 +114,7 @@ class Integrity extends _transform.default {
|
|
|
101
114
|
var imulVariableDeclaration = ImulTemplate.single({
|
|
102
115
|
name: imulName
|
|
103
116
|
});
|
|
104
|
-
imulVariableDeclaration.$
|
|
117
|
+
imulVariableDeclaration.$multiTransformSkip = true;
|
|
105
118
|
this.imulFn = imulVariableDeclaration._hiddenId = (0, _gen.Identifier)(imulName);
|
|
106
119
|
hashingUtils.push(imulVariableDeclaration);
|
|
107
120
|
var hashName = this.getPlaceholder();
|
|
@@ -111,79 +124,69 @@ class Integrity extends _transform.default {
|
|
|
111
124
|
});
|
|
112
125
|
this.hashFn = hashFunctionDeclaration._hiddenId = (0, _gen.Identifier)(hashName);
|
|
113
126
|
hashingUtils.push(hashFunctionDeclaration);
|
|
114
|
-
hashFunctionDeclaration.$
|
|
127
|
+
hashFunctionDeclaration.$multiTransformSkip = true;
|
|
115
128
|
var stringName = this.getPlaceholder();
|
|
116
129
|
var stringFunctionDeclaration = StringTemplate.single({
|
|
117
130
|
name: stringName
|
|
118
131
|
});
|
|
119
132
|
this.stringFn = stringFunctionDeclaration._hiddenId = (0, _gen.Identifier)(stringName);
|
|
120
133
|
hashingUtils.push(stringFunctionDeclaration);
|
|
121
|
-
stringFunctionDeclaration.$
|
|
134
|
+
stringFunctionDeclaration.$multiTransformSkip = true;
|
|
122
135
|
var functionExpression = (0, _gen.FunctionExpression)([], (0, _insert.clone)(object.body));
|
|
123
136
|
object.body = [(0, _gen.ExpressionStatement)((0, _gen.CallExpression)(functionExpression, []))];
|
|
124
|
-
object.$
|
|
137
|
+
object.$multiTransformSkip = true;
|
|
125
138
|
object._hiddenHashingUtils = hashingUtils;
|
|
126
139
|
var ok = this.transform(functionExpression, [object.body[0], object.body, object]);
|
|
127
|
-
|
|
128
140
|
if (ok) {
|
|
129
141
|
ok();
|
|
130
142
|
}
|
|
131
|
-
|
|
132
143
|
object.$eval = () => {
|
|
133
144
|
if ((0, _insert.isFunction)(functionExpression) && functionExpression.body.type == "BlockStatement") {
|
|
134
145
|
if (this.lock.counterMeasuresNode) {
|
|
135
146
|
functionExpression.body.body.unshift((0, _insert.clone)(this.lock.counterMeasuresNode[0]));
|
|
136
147
|
}
|
|
137
|
-
|
|
138
148
|
functionExpression.body.body.unshift(...hashingUtils);
|
|
139
149
|
}
|
|
140
150
|
};
|
|
141
151
|
};
|
|
142
152
|
}
|
|
143
|
-
|
|
144
153
|
(0, _assert.ok)((0, _insert.isFunction)(object));
|
|
145
|
-
|
|
146
154
|
if (object.generator || object.async) {
|
|
147
155
|
return;
|
|
148
156
|
}
|
|
149
|
-
|
|
150
157
|
return () => {
|
|
151
158
|
object.__hiddenCountermeasures = this.lock.getCounterMeasuresCode(object, parents);
|
|
152
|
-
|
|
153
159
|
object.$eval = () => {
|
|
154
160
|
var functionName = this.generateIdentifier();
|
|
155
161
|
var hashName = this.generateIdentifier();
|
|
156
|
-
var functionDeclaration = {
|
|
162
|
+
var functionDeclaration = {
|
|
163
|
+
...(0, _insert.clone)(object),
|
|
157
164
|
type: "FunctionDeclaration",
|
|
158
165
|
id: (0, _gen.Identifier)(functionName),
|
|
159
166
|
params: object.params || [],
|
|
160
167
|
body: object.body || (0, _gen.BlockStatement)([]),
|
|
161
168
|
expression: false,
|
|
162
|
-
$
|
|
169
|
+
$multiTransformSkip: true
|
|
163
170
|
};
|
|
164
171
|
var toString = (0, _compiler.compileJsSync)(functionDeclaration, this.options);
|
|
165
|
-
|
|
166
172
|
if (!toString) {
|
|
167
173
|
return;
|
|
168
174
|
}
|
|
169
|
-
|
|
170
175
|
var minified = toString.replace(/ |\n|;|,|\{|\}|\(|\)|\.|\[|\]/g, "");
|
|
171
176
|
var hash = cyrb53(minified, this.seed);
|
|
172
177
|
this.log((object.id ? object.id.name : "function") + " -> " + hash, minified);
|
|
173
|
-
var ifStatement = (0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(hashName), (0, _gen.Literal)(hash)), [
|
|
178
|
+
var ifStatement = (0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(hashName), (0, _gen.Literal)(hash)), [new _template.default(`return {functionName}.apply(this, arguments)`).single({
|
|
174
179
|
functionName: functionName
|
|
175
180
|
})]);
|
|
176
|
-
|
|
177
181
|
if (object.__hiddenCountermeasures && object.__hiddenCountermeasures.length) {
|
|
178
182
|
ifStatement.alternate = (0, _gen.BlockStatement)(object.__hiddenCountermeasures);
|
|
179
183
|
}
|
|
184
|
+
object.body = (0, _gen.BlockStatement)([functionDeclaration, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(hashName, (0, _gen.CallExpression)((0, _insert.clone)(this.hashFn), [(0, _gen.CallExpression)((0, _insert.clone)(this.stringFn), [(0, _gen.Identifier)(functionName)]), (0, _gen.Literal)(this.seed)]))), ifStatement]);
|
|
180
185
|
|
|
181
|
-
|
|
182
|
-
|
|
186
|
+
// Make sure the countermeasures activation variable is present
|
|
183
187
|
if (this.lock.counterMeasuresActivated) {
|
|
184
188
|
object.body.body.unshift((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.lock.counterMeasuresActivated)));
|
|
185
189
|
}
|
|
186
|
-
|
|
187
190
|
if (object.type == "ArrowFunctionExpression") {
|
|
188
191
|
object.type = "FunctionExpression";
|
|
189
192
|
object.expression = false;
|
|
@@ -191,7 +194,5 @@ class Integrity extends _transform.default {
|
|
|
191
194
|
};
|
|
192
195
|
};
|
|
193
196
|
}
|
|
194
|
-
|
|
195
197
|
}
|
|
196
|
-
|
|
197
198
|
exports.default = Integrity;
|