js-confuser 1.7.2 → 2.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +105 -0
- package/Migration.md +57 -0
- package/README.md +23 -913
- package/dist/constants.js +69 -13
- package/dist/index.js +108 -152
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -109
- package/dist/order.js +30 -30
- package/dist/presets.js +47 -45
- package/dist/probability.js +25 -32
- package/dist/templates/bufferToStringTemplate.js +9 -0
- package/dist/templates/deadCodeTemplates.js +9 -0
- package/dist/templates/getGlobalTemplate.js +19 -0
- package/dist/templates/integrityTemplate.js +30 -0
- package/dist/templates/setFunctionLengthTemplate.js +9 -0
- package/dist/templates/stringCompressionTemplate.js +10 -0
- package/dist/templates/tamperProtectionTemplates.js +21 -0
- package/dist/templates/template.js +213 -93
- package/dist/transforms/astScrambler.js +100 -0
- package/dist/transforms/calculator.js +70 -127
- package/dist/transforms/controlFlowFlattening.js +1182 -0
- package/dist/transforms/deadCode.js +62 -577
- package/dist/transforms/dispatcher.js +300 -309
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
- package/dist/transforms/extraction/objectExtraction.js +131 -215
- package/dist/transforms/finalizer.js +56 -59
- package/dist/transforms/flatten.js +275 -276
- package/dist/transforms/functionOutlining.js +230 -0
- package/dist/transforms/identifier/globalConcealing.js +217 -103
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +240 -187
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +263 -303
- package/dist/transforms/minify.js +431 -436
- package/dist/transforms/opaquePredicates.js +65 -118
- package/dist/transforms/pack.js +160 -0
- package/dist/transforms/plugin.js +179 -0
- package/dist/transforms/preparation.js +263 -163
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +142 -240
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +45 -173
- package/dist/transforms/string/stringCompression.js +81 -126
- package/dist/transforms/string/stringConcealing.js +189 -224
- package/dist/transforms/string/stringEncoding.js +32 -40
- package/dist/transforms/string/stringSplitting.js +54 -55
- package/dist/transforms/variableMasking.js +232 -0
- package/dist/utils/ControlObject.js +125 -0
- package/dist/utils/IntGen.js +46 -0
- package/dist/utils/NameGen.js +106 -0
- package/dist/utils/ast-utils.js +560 -0
- package/dist/utils/function-utils.js +56 -0
- package/dist/utils/gen-utils.js +48 -0
- package/dist/utils/node.js +77 -0
- package/dist/utils/object-utils.js +21 -0
- package/dist/utils/random-utils.js +91 -0
- package/dist/utils/static-utils.js +64 -0
- package/dist/validateOptions.js +122 -0
- package/index.d.ts +1 -17
- package/package.json +27 -22
- package/src/constants.ts +139 -77
- package/src/index.ts +70 -163
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +154 -623
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
- package/src/templates/deadCodeTemplates.ts +1185 -0
- package/src/templates/getGlobalTemplate.ts +72 -0
- package/src/templates/integrityTemplate.ts +69 -0
- package/src/templates/setFunctionLengthTemplate.ts +11 -0
- package/src/templates/stringCompressionTemplate.ts +42 -0
- package/src/templates/tamperProtectionTemplates.ts +116 -0
- package/src/templates/template.ts +183 -92
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -224
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -628
- package/src/transforms/dispatcher.ts +431 -636
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
- package/src/transforms/extraction/objectExtraction.ts +160 -333
- package/src/transforms/finalizer.ts +63 -64
- package/src/transforms/flatten.ts +439 -557
- package/src/transforms/functionOutlining.ts +225 -0
- package/src/transforms/identifier/globalConcealing.ts +261 -189
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +252 -258
- package/src/transforms/lock/integrity.ts +84 -260
- package/src/transforms/lock/lock.ts +342 -491
- package/src/transforms/minify.ts +523 -663
- package/src/transforms/opaquePredicates.ts +90 -229
- package/src/transforms/pack.ts +195 -0
- package/src/transforms/plugin.ts +185 -0
- package/src/transforms/preparation.ts +337 -215
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -386
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +26 -129
- package/src/transforms/string/stringCompression.ts +118 -236
- package/src/transforms/string/stringConcealing.ts +255 -339
- package/src/transforms/string/stringEncoding.ts +28 -47
- package/src/transforms/string/stringSplitting.ts +61 -75
- package/src/transforms/variableMasking.ts +257 -0
- package/src/utils/ControlObject.ts +141 -0
- package/src/utils/IntGen.ts +33 -0
- package/src/utils/NameGen.ts +106 -0
- package/src/utils/ast-utils.ts +667 -0
- package/src/utils/function-utils.ts +50 -0
- package/src/utils/gen-utils.ts +48 -0
- package/src/utils/node.ts +78 -0
- package/src/utils/object-utils.ts +21 -0
- package/src/utils/random-utils.ts +79 -0
- package/src/utils/static-utils.ts +66 -0
- package/src/validateOptions.ts +256 -0
- package/tsconfig.json +13 -8
- package/babel.config.js +0 -12
- package/dev.js +0 -8
- package/dist/compiler.js +0 -34
- package/dist/parser.js +0 -59
- package/dist/precedence.js +0 -66
- package/dist/templates/bufferToString.js +0 -108
- package/dist/templates/crash.js +0 -59
- package/dist/templates/es5.js +0 -137
- package/dist/templates/functionLength.js +0 -34
- package/dist/templates/globals.js +0 -9
- package/dist/transforms/antiTooling.js +0 -88
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
- package/dist/transforms/es5/antiClass.js +0 -164
- package/dist/transforms/es5/antiDestructuring.js +0 -193
- package/dist/transforms/es5/antiES6Object.js +0 -185
- package/dist/transforms/es5/antiSpreadOperator.js +0 -35
- package/dist/transforms/es5/antiTemplate.js +0 -66
- package/dist/transforms/es5/es5.js +0 -123
- package/dist/transforms/extraction/classExtraction.js +0 -83
- package/dist/transforms/identifier/globalAnalysis.js +0 -70
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -343
- package/dist/transforms/transform.js +0 -350
- package/dist/traverse.js +0 -110
- package/dist/util/compare.js +0 -145
- package/dist/util/gen.js +0 -564
- package/dist/util/guard.js +0 -9
- package/dist/util/identifiers.js +0 -355
- package/dist/util/insert.js +0 -362
- package/dist/util/math.js +0 -19
- package/dist/util/object.js +0 -40
- package/dist/util/random.js +0 -130
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -63
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -75
- package/docs/RGF.md +0 -419
- package/samples/example.js +0 -15
- package/samples/high.js +0 -1
- package/samples/input.js +0 -3
- package/samples/javascriptobfuscator.com.js +0 -8
- package/samples/jscrambler_advanced.js +0 -1894
- package/samples/jscrambler_light.js +0 -1134
- package/samples/low.js +0 -1
- package/samples/medium.js +0 -1
- package/samples/obfuscator.io.js +0 -1686
- package/samples/preemptive.com.js +0 -16
- package/src/compiler.ts +0 -35
- package/src/parser.ts +0 -49
- package/src/precedence.ts +0 -61
- package/src/templates/crash.ts +0 -55
- package/src/templates/es5.ts +0 -131
- package/src/templates/functionLength.ts +0 -32
- package/src/templates/globals.ts +0 -3
- package/src/transforms/antiTooling.ts +0 -102
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -272
- package/src/transforms/es5/antiDestructuring.ts +0 -294
- package/src/transforms/es5/antiES6Object.ts +0 -267
- package/src/transforms/es5/antiSpreadOperator.ts +0 -56
- package/src/transforms/es5/antiTemplate.ts +0 -98
- package/src/transforms/es5/es5.ts +0 -149
- package/src/transforms/extraction/classExtraction.ts +0 -168
- package/src/transforms/identifier/globalAnalysis.ts +0 -85
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -551
- package/src/transforms/transform.ts +0 -453
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -131
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -7
- package/src/util/identifiers.ts +0 -494
- package/src/util/insert.ts +0 -419
- package/src/util/math.ts +0 -15
- package/src/util/object.ts +0 -39
- package/src/util/random.ts +0 -141
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -49
- package/test/code/Dynamic.src.js +0 -118
- package/test/code/Dynamic.test.ts +0 -49
- package/test/code/ES6.src.js +0 -235
- package/test/code/ES6.test.ts +0 -42
- package/test/code/NewFeatures.test.ts +0 -19
- package/test/code/StrictMode.src.js +0 -65
- package/test/code/StrictMode.test.js +0 -37
- package/test/compare.test.ts +0 -104
- package/test/index.test.ts +0 -249
- package/test/options.test.ts +0 -132
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -14
- package/test/transforms/antiTooling.test.ts +0 -52
- package/test/transforms/calculator.test.ts +0 -78
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
- package/test/transforms/deadCode.test.ts +0 -85
- package/test/transforms/dispatcher.test.ts +0 -457
- package/test/transforms/es5/antiClass.test.ts +0 -427
- package/test/transforms/es5/antiDestructuring.test.ts +0 -157
- package/test/transforms/es5/antiES6Object.test.ts +0 -245
- package/test/transforms/es5/antiTemplate.test.ts +0 -116
- package/test/transforms/es5/es5.test.ts +0 -110
- package/test/transforms/extraction/classExtraction.test.ts +0 -86
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
- package/test/transforms/extraction/objectExtraction.test.ts +0 -491
- package/test/transforms/flatten.test.ts +0 -721
- package/test/transforms/hexadecimalNumbers.test.ts +0 -62
- package/test/transforms/identifier/globalConcealing.test.ts +0 -72
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -621
- package/test/transforms/lock/antiDebug.test.ts +0 -66
- package/test/transforms/lock/browserLock.test.ts +0 -129
- package/test/transforms/lock/countermeasures.test.ts +0 -100
- package/test/transforms/lock/integrity.test.ts +0 -161
- package/test/transforms/lock/lock.test.ts +0 -204
- package/test/transforms/lock/osLock.test.ts +0 -312
- package/test/transforms/lock/selfDefending.test.ts +0 -68
- package/test/transforms/minify.test.ts +0 -575
- package/test/transforms/opaquePredicates.test.ts +0 -43
- package/test/transforms/preparation.test.ts +0 -157
- package/test/transforms/renameLabels.test.ts +0 -95
- package/test/transforms/rgf.test.ts +0 -378
- package/test/transforms/shuffle.test.ts +0 -135
- package/test/transforms/stack.test.ts +0 -573
- package/test/transforms/string/stringCompression.test.ts +0 -120
- package/test/transforms/string/stringConcealing.test.ts +0 -299
- package/test/transforms/string/stringEncoding.test.ts +0 -95
- package/test/transforms/string/stringSplitting.test.ts +0 -135
- package/test/transforms/transform.test.ts +0 -66
- package/test/traverse.test.ts +0 -139
- package/test/util/compare.test.ts +0 -34
- package/test/util/gen.test.ts +0 -121
- package/test/util/identifiers.test.ts +0 -253
- package/test/util/insert.test.ts +0 -142
- package/test/util/math.test.ts +0 -5
- package/test/util/random.test.ts +0 -71
- /package/dist/{types.js → obfuscationResult.js} +0 -0
|
@@ -1,198 +1,75 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
7
|
+
exports["default"] = exports.INTEGRITY = void 0;
|
|
8
|
+
var _order = require("../../order");
|
|
9
|
+
var _randomUtils = require("../../utils/random-utils");
|
|
10
|
+
var _integrityTemplate = require("../../templates/integrityTemplate");
|
|
11
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
8
12
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var _compiler = require("../../compiler");
|
|
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); }
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
14
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
15
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
16
|
+
var INTEGRITY = exports.INTEGRITY = Symbol("Integrity");
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
20
|
-
* @param str
|
|
21
|
-
* @param seed
|
|
22
|
-
*/
|
|
23
|
-
function cyrb53(str) {
|
|
24
|
-
let seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
25
|
-
let h1 = 0xdeadbeef ^ seed,
|
|
26
|
-
h2 = 0x41c6ce57 ^ seed;
|
|
27
|
-
for (let i = 0, ch; i < str.length; i++) {
|
|
28
|
-
ch = str.charCodeAt(i);
|
|
29
|
-
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
30
|
-
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
31
|
-
}
|
|
32
|
-
h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909);
|
|
33
|
-
h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909);
|
|
34
|
-
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// In template form to be inserted into code
|
|
38
|
-
const HashTemplate = (0, _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 = (0, _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 = (0, _template.default)(`
|
|
70
|
-
function {name}(x){
|
|
71
|
-
return x.toString().replace(/ |\\n|;|,|\\{|\\}|\\(|\\)|\\.|\\[|\\]/g, "");
|
|
72
|
-
}
|
|
73
|
-
`);
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Integrity protects functions by using checksum techniques to verify their code has not changed.
|
|
77
|
-
*
|
|
78
|
-
* If an attacker modifies a function, the modified function will not execute.
|
|
79
|
-
*
|
|
80
|
-
* How it works:
|
|
81
|
-
*
|
|
82
|
-
* - By using `.toString()` JavaScript will expose a function's source code.
|
|
83
|
-
* - We can hash it and use an if statement in the code to ensure the function's code is unchanged.
|
|
18
|
+
* Integrity has two passes:
|
|
84
19
|
*
|
|
85
|
-
*
|
|
86
|
-
* -
|
|
87
|
-
* - Every function including ^ are generated out and evaluated for their .toString() value
|
|
88
|
-
* - Hashed using cyrb53's hashing algorithm
|
|
89
|
-
* - Check the checksum before running the code.
|
|
20
|
+
* - First in the 'lock' plugin to select functions and prepare them for Integrity
|
|
21
|
+
* - Secondly here to apply the integrity check
|
|
90
22
|
*
|
|
91
|
-
*
|
|
92
|
-
* - A hidden identifier is placed to keep track of the name.
|
|
23
|
+
* This transformation must run last as any changes to the code will break the hash
|
|
93
24
|
*/
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
_defineProperty(this, "stringFn", void 0);
|
|
100
|
-
_defineProperty(this, "seed", void 0);
|
|
101
|
-
_defineProperty(this, "lock", void 0);
|
|
102
|
-
this.lock = lock;
|
|
103
|
-
this.seed = (0, _random.getRandomInteger)(0, 1000);
|
|
104
|
-
}
|
|
105
|
-
match(object, parents) {
|
|
106
|
-
// ArrowFunctions are excluded!
|
|
107
|
-
return object.type == "Program" || (0, _insert.isFunction)(object) && object.type !== "ArrowFunctionExpression";
|
|
108
|
-
}
|
|
109
|
-
transform(object, parents) {
|
|
110
|
-
if (object.type == "Program") {
|
|
111
|
-
return () => {
|
|
112
|
-
var hashingUtils = [];
|
|
113
|
-
var imulName = this.getPlaceholder();
|
|
114
|
-
var imulVariableDeclaration = ImulTemplate.single({
|
|
115
|
-
name: imulName
|
|
116
|
-
});
|
|
117
|
-
imulVariableDeclaration.$dispatcherSkip = true;
|
|
118
|
-
this.imulFn = imulVariableDeclaration._hiddenId = (0, _gen.Identifier)(imulName);
|
|
119
|
-
hashingUtils.push(imulVariableDeclaration);
|
|
120
|
-
var hashName = this.getPlaceholder();
|
|
121
|
-
var hashFunctionDeclaration = HashTemplate.single({
|
|
122
|
-
name: hashName,
|
|
123
|
-
imul: imulName
|
|
124
|
-
});
|
|
125
|
-
this.hashFn = hashFunctionDeclaration._hiddenId = (0, _gen.Identifier)(hashName);
|
|
126
|
-
hashingUtils.push(hashFunctionDeclaration);
|
|
127
|
-
hashFunctionDeclaration.$dispatcherSkip = true;
|
|
128
|
-
var stringName = this.getPlaceholder();
|
|
129
|
-
var stringFunctionDeclaration = StringTemplate.single({
|
|
130
|
-
name: stringName
|
|
131
|
-
});
|
|
132
|
-
this.stringFn = stringFunctionDeclaration._hiddenId = (0, _gen.Identifier)(stringName);
|
|
133
|
-
hashingUtils.push(stringFunctionDeclaration);
|
|
134
|
-
stringFunctionDeclaration.$dispatcherSkip = true;
|
|
135
|
-
var functionExpression = (0, _gen.FunctionExpression)([], (0, _insert.clone)(object.body));
|
|
136
|
-
object.body = [(0, _gen.ExpressionStatement)((0, _gen.CallExpression)(functionExpression, []))];
|
|
137
|
-
object.$dispatcherSkip = true;
|
|
138
|
-
object._hiddenHashingUtils = hashingUtils;
|
|
139
|
-
var ok = this.transform(functionExpression, [object.body[0], object.body, object]);
|
|
140
|
-
if (ok) {
|
|
141
|
-
ok();
|
|
142
|
-
}
|
|
143
|
-
object.$eval = () => {
|
|
144
|
-
if ((0, _insert.isFunction)(functionExpression) && functionExpression.body.type == "BlockStatement") {
|
|
145
|
-
if (this.lock.counterMeasuresNode) {
|
|
146
|
-
functionExpression.body.body.unshift((0, _insert.clone)(this.lock.counterMeasuresNode[0]));
|
|
147
|
-
}
|
|
148
|
-
functionExpression.body.body.unshift(...hashingUtils);
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
};
|
|
25
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
26
|
+
var Plugin = _ref.Plugin;
|
|
27
|
+
var me = Plugin(_order.Order.Integrity, {
|
|
28
|
+
changeData: {
|
|
29
|
+
functions: 0
|
|
152
30
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
object.$eval = () => {
|
|
160
|
-
var functionName = this.generateIdentifier();
|
|
161
|
-
var hashName = this.generateIdentifier();
|
|
162
|
-
var functionDeclaration = {
|
|
163
|
-
...(0, _insert.clone)(object),
|
|
164
|
-
type: "FunctionDeclaration",
|
|
165
|
-
id: (0, _gen.Identifier)(functionName),
|
|
166
|
-
params: object.params || [],
|
|
167
|
-
body: object.body || (0, _gen.BlockStatement)([]),
|
|
168
|
-
expression: false,
|
|
169
|
-
$dispatcherSkip: true
|
|
170
|
-
};
|
|
171
|
-
var toString = (0, _compiler.compileJsSync)(functionDeclaration, this.options);
|
|
172
|
-
if (!toString) {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
var minified = toString.replace(/ |\n|;|,|\{|\}|\(|\)|\.|\[|\]/g, "");
|
|
176
|
-
var hash = cyrb53(minified, this.seed);
|
|
177
|
-
this.log((object.id ? object.id.name : "function") + " -> " + hash, minified);
|
|
178
|
-
var ifStatement = (0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(hashName), (0, _gen.Literal)(hash)), [(0, _template.default)(`return {functionName}.apply(this, arguments)`).single({
|
|
179
|
-
functionName: functionName
|
|
180
|
-
})]);
|
|
181
|
-
if (object.__hiddenCountermeasures && object.__hiddenCountermeasures.length) {
|
|
182
|
-
ifStatement.alternate = (0, _gen.BlockStatement)(object.__hiddenCountermeasures);
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
visitor: {
|
|
34
|
+
Program: {
|
|
35
|
+
enter: function enter(path) {
|
|
36
|
+
path.scope.crawl();
|
|
183
37
|
}
|
|
184
|
-
|
|
38
|
+
},
|
|
39
|
+
FunctionDeclaration: {
|
|
40
|
+
exit: function exit(funcDecPath) {
|
|
41
|
+
var integrityInterface = funcDecPath.node[INTEGRITY];
|
|
42
|
+
if (!integrityInterface) return;
|
|
43
|
+
var newFnPath = integrityInterface.fnPath;
|
|
44
|
+
if (newFnPath.removed) return;
|
|
45
|
+
var newFunctionDeclaration = newFnPath.node;
|
|
46
|
+
if (!newFunctionDeclaration || !t.isFunctionDeclaration(newFunctionDeclaration)) return;
|
|
47
|
+
var hashFnName = me.globalState.internals.integrityHashName;
|
|
48
|
+
var obfuscatedHashFnName = me.obfuscator.getObfuscatedVariableName(hashFnName, funcDecPath.find(function (p) {
|
|
49
|
+
return p.isProgram();
|
|
50
|
+
}).node);
|
|
51
|
+
var newFnName = newFunctionDeclaration.id.name;
|
|
52
|
+
var binding = newFnPath.scope.getBinding(newFnName);
|
|
185
53
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
54
|
+
// Function is redefined, do not apply integrity
|
|
55
|
+
if (!binding || binding.constantViolations.length > 0) return;
|
|
56
|
+
var code = me.obfuscator.generateCode(newFunctionDeclaration);
|
|
57
|
+
var codeTrimmed = code.replace(me.globalState.lock.integrity.sensitivityRegex, "");
|
|
58
|
+
var seed = (0, _randomUtils.getRandomInteger)(0, 10000000);
|
|
59
|
+
var hashCode = (0, _integrityTemplate.HashFunction)(codeTrimmed, seed);
|
|
60
|
+
|
|
61
|
+
// me.log(codeTrimmed, hashCode);
|
|
62
|
+
me.changeData.functions++;
|
|
63
|
+
funcDecPath.node.body = t.blockStatement(new _template["default"]("\n var hash = ".concat(obfuscatedHashFnName, "(").concat(newFunctionDeclaration.id.name, ", ").concat(seed, ");\n if(hash === ").concat(hashCode, ") {\n {originalBody}\n } else {\n {countermeasures} \n }\n ")).compile({
|
|
64
|
+
originalBody: funcDecPath.node.body.body,
|
|
65
|
+
countermeasures: function countermeasures() {
|
|
66
|
+
return me.globalState.lock.createCountermeasuresCode();
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
// Preserve directives
|
|
70
|
+
funcDecPath.node.body.directives);
|
|
193
71
|
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
exports.default = Integrity;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
};
|