js-confuser 1.5.8 → 1.6.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/workflows/node.js.yml +2 -2
- package/CHANGELOG.md +69 -0
- package/README.md +143 -7
- package/dist/index.js +33 -4
- package/dist/obfuscator.js +30 -31
- package/dist/options.js +4 -5
- package/dist/order.js +4 -6
- package/dist/probability.js +2 -4
- package/dist/templates/bufferToString.js +13 -0
- package/dist/templates/crash.js +2 -2
- package/dist/templates/es5.js +18 -0
- package/dist/transforms/antiTooling.js +1 -1
- package/dist/transforms/calculator.js +77 -21
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +980 -367
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +8 -3
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +25 -26
- package/dist/transforms/deadCode.js +33 -25
- package/dist/transforms/dispatcher.js +7 -6
- package/dist/transforms/es5/antiClass.js +6 -2
- package/dist/transforms/es5/antiDestructuring.js +3 -1
- package/dist/transforms/es5/es5.js +31 -34
- package/dist/transforms/eval.js +11 -0
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +8 -5
- package/dist/transforms/extraction/objectExtraction.js +6 -1
- package/dist/transforms/finalizer.js +82 -0
- package/dist/transforms/flatten.js +82 -55
- package/dist/transforms/hexadecimalNumbers.js +34 -9
- package/dist/transforms/identifier/globalAnalysis.js +88 -0
- package/dist/transforms/identifier/globalConcealing.js +10 -83
- package/dist/transforms/identifier/movedDeclarations.js +2 -8
- package/dist/transforms/identifier/renameVariables.js +39 -27
- package/dist/transforms/identifier/variableAnalysis.js +58 -62
- package/dist/transforms/minify.js +80 -61
- package/dist/transforms/opaquePredicates.js +1 -1
- package/dist/transforms/preparation/preparation.js +2 -2
- package/dist/transforms/preparation.js +231 -0
- package/dist/transforms/renameLabels.js +1 -1
- package/dist/transforms/rgf.js +4 -5
- package/dist/transforms/stack.js +87 -26
- package/dist/transforms/string/encoding.js +150 -179
- package/dist/transforms/string/stringCompression.js +14 -15
- package/dist/transforms/string/stringConcealing.js +25 -8
- package/dist/transforms/string/stringEncoding.js +13 -24
- package/dist/transforms/transform.js +11 -18
- package/dist/traverse.js +24 -18
- package/dist/util/compare.js +2 -2
- package/dist/util/gen.js +15 -0
- package/dist/util/insert.js +31 -7
- package/dist/util/random.js +15 -0
- package/package.json +5 -5
- package/src/index.ts +57 -19
- package/src/obfuscator.ts +26 -29
- package/src/options.ts +17 -21
- package/src/order.ts +4 -8
- package/src/probability.ts +2 -3
- package/src/templates/bufferToString.ts +68 -0
- package/src/templates/crash.ts +5 -9
- package/src/templates/es5.ts +131 -0
- package/src/transforms/antiTooling.ts +1 -1
- package/src/transforms/calculator.ts +122 -59
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +1583 -571
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +18 -3
- package/src/transforms/deadCode.ts +383 -26
- package/src/transforms/dispatcher.ts +8 -6
- package/src/transforms/es5/antiClass.ts +10 -1
- package/src/transforms/es5/antiDestructuring.ts +3 -1
- package/src/transforms/es5/es5.ts +32 -77
- package/src/transforms/eval.ts +18 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -6
- package/src/transforms/extraction/objectExtraction.ts +12 -5
- package/src/transforms/finalizer.ts +75 -0
- package/src/transforms/flatten.ts +194 -151
- package/src/transforms/identifier/globalAnalysis.ts +85 -0
- package/src/transforms/identifier/globalConcealing.ts +14 -103
- package/src/transforms/identifier/movedDeclarations.ts +4 -11
- package/src/transforms/identifier/renameVariables.ts +37 -30
- package/src/transforms/identifier/variableAnalysis.ts +66 -73
- package/src/transforms/minify.ts +116 -77
- package/src/transforms/opaquePredicates.ts +2 -2
- package/src/transforms/preparation.ts +238 -0
- package/src/transforms/renameLabels.ts +2 -2
- package/src/transforms/rgf.ts +6 -7
- package/src/transforms/stack.ts +97 -37
- package/src/transforms/string/encoding.ts +115 -212
- package/src/transforms/string/stringCompression.ts +27 -18
- package/src/transforms/string/stringConcealing.ts +41 -11
- package/src/transforms/string/stringEncoding.ts +18 -18
- package/src/transforms/transform.ts +15 -21
- package/src/traverse.ts +24 -12
- package/src/types.ts +11 -2
- package/src/util/compare.ts +2 -2
- package/src/util/gen.ts +21 -1
- package/src/util/insert.ts +49 -9
- package/src/util/random.ts +13 -0
- package/test/code/Cash.test.ts +1 -1
- package/test/code/Dynamic.test.ts +12 -10
- package/test/code/ES6.src.js +136 -0
- package/test/code/ES6.test.ts +28 -2
- package/test/code/NewFeatures.test.ts +19 -0
- package/test/index.test.ts +15 -2
- package/test/probability.test.ts +44 -0
- package/test/templates/template.test.ts +1 -1
- package/test/transforms/antiTooling.test.ts +52 -0
- package/test/transforms/calculator.test.ts +40 -0
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +713 -149
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +173 -0
- package/test/transforms/deadCode.test.ts +66 -15
- package/test/transforms/dispatcher.test.ts +44 -1
- package/test/transforms/es5/antiClass.test.ts +33 -0
- package/test/transforms/es5/antiDestructuring.test.ts +16 -0
- package/test/transforms/eval.test.ts +53 -0
- package/test/transforms/extraction/objectExtraction.test.ts +21 -0
- package/test/transforms/flatten.test.ts +195 -3
- package/test/transforms/identifier/movedDeclarations.test.ts +27 -0
- package/test/transforms/identifier/renameVariables.test.ts +108 -0
- package/test/transforms/lock/antiDebug.test.ts +2 -2
- package/test/transforms/minify.test.ts +151 -0
- package/test/transforms/preparation.test.ts +157 -0
- package/test/transforms/rgf.test.ts +56 -29
- package/test/transforms/stack.test.ts +91 -21
- package/test/transforms/string/stringCompression.test.ts +39 -0
- package/test/transforms/string/stringConcealing.test.ts +115 -0
- package/test/transforms/string/stringEncoding.test.ts +53 -2
- package/test/transforms/transform.test.ts +66 -0
- package/test/traverse.test.ts +139 -0
- package/test/util/compare.test.ts +23 -1
- package/src/transforms/controlFlowFlattening/choiceFlowObfuscation.ts +0 -87
- package/src/transforms/controlFlowFlattening/controlFlowObfuscation.ts +0 -203
- package/src/transforms/controlFlowFlattening/switchCaseObfuscation.ts +0 -130
- package/src/transforms/hexadecimalNumbers.ts +0 -31
- package/src/transforms/hideInitializingCode.ts +0 -432
- package/src/transforms/label.ts +0 -64
- package/src/transforms/preparation/nameConflicts.ts +0 -102
- package/src/transforms/preparation/preparation.ts +0 -176
- package/test/transforms/controlFlowFlattening/controlFlowObfuscation.test.ts +0 -101
- package/test/transforms/controlFlowFlattening/switchCaseObfuscation.test.ts +0 -120
- package/test/transforms/hideInitializingCode.test.ts +0 -336
- package/test/transforms/preparation/nameConflicts.test.ts +0 -52
- package/test/transforms/preparation/preparation.test.ts +0 -62
|
@@ -10,200 +10,171 @@ var _template = _interopRequireDefault(require("../../templates/template"));
|
|
|
10
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
11
|
|
|
12
12
|
const Encoding = {
|
|
13
|
-
|
|
14
|
-
encode(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return function (a, b) {
|
|
41
|
-
for (var c = b; c > 0; c--) a.pop();
|
|
42
|
-
}(e, c[l]), h.fromCharCode.apply(h, e);
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
template: (0, _template.default)("\n function {name}(a, LL = [\"fromCharCode\", \"apply\"]) {\n var c, d, e, f, g, h = String, l = \"length\", w = 255, x = \"charCodeAt\", y = \"slice\", z = \"replace\";\n for (\"<~\" === a[y](0, 2) && \"~>\" === a[y](-2), a = a[y](2, -2)[z](/s/g, \"\")[z](\"z\", \"!!!!!\"), \n c = \"uuuuu\"[y](a[l] % 5 || 5), a += c, e = [], f = 0, g = a[l]; g > f; f += 5) d = 52200625 * (a[x](f) - 33) + 614125 * (a[x](f + 1) - 33) + 7225 * (a[x](f + 2) - 33) + 85 * (a[x](f + 3) - 33) + (a[x](f + 4) - 33), \n e.push(w & d >> 24, w & d >> 16, w & d >> 8, w & d);\n return function(a, b) {\n for (var c = b; c > 0; c--) a.pop();\n }(e, c[l]), h[LL[0]][LL[1]](h, e);\n }\n ")
|
|
46
|
-
},
|
|
47
|
-
base32: {
|
|
48
|
-
encode: function (s) {
|
|
49
|
-
var a = "!\"#$%&'()*+,-./0123456789:;<=>?@";
|
|
50
|
-
var len = s.length;
|
|
51
|
-
var o = "";
|
|
52
|
-
var w,
|
|
53
|
-
c,
|
|
54
|
-
r = 0,
|
|
55
|
-
sh = 0,
|
|
56
|
-
i;
|
|
57
|
-
|
|
58
|
-
for (i = 0; i < len; i += 5) {
|
|
59
|
-
// mask top 5 bits
|
|
60
|
-
c = s.charCodeAt(i);
|
|
61
|
-
w = 0xf8 & c;
|
|
62
|
-
o += a.charAt(w >> 3);
|
|
63
|
-
r = 0x07 & c;
|
|
64
|
-
sh = 2;
|
|
65
|
-
|
|
66
|
-
if (i + 1 < len) {
|
|
67
|
-
c = s.charCodeAt(i + 1); // mask top 2 bits
|
|
68
|
-
|
|
69
|
-
w = 0xc0 & c;
|
|
70
|
-
o += a.charAt((r << 2) + (w >> 6));
|
|
71
|
-
o += a.charAt((0x3e & c) >> 1);
|
|
72
|
-
r = c & 0x01;
|
|
73
|
-
sh = 4;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (i + 2 < len) {
|
|
77
|
-
c = s.charCodeAt(i + 2); // mask top 4 bits
|
|
78
|
-
|
|
79
|
-
w = 0xf0 & c;
|
|
80
|
-
o += a.charAt((r << 4) + (w >> 4));
|
|
81
|
-
r = 0x0f & c;
|
|
82
|
-
sh = 1;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (i + 3 < len) {
|
|
86
|
-
c = s.charCodeAt(i + 3); // mask top 1 bit
|
|
87
|
-
|
|
88
|
-
w = 0x80 & c;
|
|
89
|
-
o += a.charAt((r << 1) + (w >> 7));
|
|
90
|
-
o += a.charAt((0x7c & c) >> 2);
|
|
91
|
-
r = 0x03 & c;
|
|
92
|
-
sh = 3;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (i + 4 < len) {
|
|
96
|
-
c = s.charCodeAt(i + 4); // mask top 3 bits
|
|
97
|
-
|
|
98
|
-
w = 0xe0 & c;
|
|
99
|
-
o += a.charAt((r << 3) + (w >> 5));
|
|
100
|
-
o += a.charAt(0x1f & c);
|
|
101
|
-
r = 0;
|
|
102
|
-
sh = 0;
|
|
13
|
+
base91: {
|
|
14
|
+
encode(str) {
|
|
15
|
+
const table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
|
|
16
|
+
const raw = Buffer.from(str, "utf-8");
|
|
17
|
+
const len = raw.length;
|
|
18
|
+
let ret = "";
|
|
19
|
+
let n = 0;
|
|
20
|
+
let b = 0;
|
|
21
|
+
|
|
22
|
+
for (let i = 0; i < len; i++) {
|
|
23
|
+
b |= raw[i] << n;
|
|
24
|
+
n += 8;
|
|
25
|
+
|
|
26
|
+
if (n > 13) {
|
|
27
|
+
let v = b & 8191;
|
|
28
|
+
|
|
29
|
+
if (v > 88) {
|
|
30
|
+
b >>= 13;
|
|
31
|
+
n -= 13;
|
|
32
|
+
} else {
|
|
33
|
+
v = b & 16383;
|
|
34
|
+
b >>= 14;
|
|
35
|
+
n -= 14;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
ret += table[v % 91] + table[v / 91 | 0];
|
|
103
39
|
}
|
|
104
|
-
} // Calculate length of pad by getting the
|
|
105
|
-
// number of words to reach an 8th octet.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (r != 0) {
|
|
109
|
-
o += a.charAt(r << sh);
|
|
110
40
|
}
|
|
111
41
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
var v,
|
|
116
|
-
x,
|
|
117
|
-
bits = 0,
|
|
118
|
-
o = "",
|
|
119
|
-
len = s.length,
|
|
120
|
-
d = String,
|
|
121
|
-
e = "charCodeAt",
|
|
122
|
-
f = "fromCharCode",
|
|
123
|
-
i;
|
|
124
|
-
|
|
125
|
-
for (i = 0; i < len; i += 1) {
|
|
126
|
-
v = s[e](i) - 33, v >= 0 && v < 32 ? (bits += (x = x << 5 | v, 5), bits >= 8 ? bits -= (o += d[f](x >> bits - 8 & 0xff), 8) : 0) : 0;
|
|
42
|
+
if (n) {
|
|
43
|
+
ret += table[b % 91];
|
|
44
|
+
if (n > 7 || b > 90) ret += table[b / 91 | 0];
|
|
127
45
|
}
|
|
128
46
|
|
|
129
|
-
return
|
|
47
|
+
return ret;
|
|
130
48
|
},
|
|
131
|
-
template: (0, _template.default)("\n function {name}(s) {\n var v,\n x,\n b = 0,\n o = \"\",\n len = s.length,\n d = String,\n e = \"charCodeAt\",\n f = \"fromCharCode\", i;\n \n for (i = 0; i < len; i += 1) {\n (v = s[e](i) - 33),\n v >= 0 && v < 32\n ? ((b += ((x = (x << 5) | v), 5)),\n b >= 8\n ? (b -= ((o += d[f]((x >> (b - 8)) & 0xff)), 8))\n : 0)\n : 0;\n }\n return o;\n }\n ")
|
|
132
|
-
},
|
|
133
|
-
hexTable: {
|
|
134
|
-
encode: function (str) {
|
|
135
|
-
var output = "";
|
|
136
49
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
50
|
+
decode(str) {
|
|
51
|
+
const table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
|
|
52
|
+
const raw = "" + (str || "");
|
|
53
|
+
const len = raw.length;
|
|
54
|
+
const ret = [];
|
|
55
|
+
let b = 0;
|
|
56
|
+
let n = 0;
|
|
57
|
+
let v = -1;
|
|
58
|
+
|
|
59
|
+
for (let i = 0; i < len; i++) {
|
|
60
|
+
const p = table.indexOf(raw[i]);
|
|
61
|
+
if (p === -1) continue;
|
|
62
|
+
|
|
63
|
+
if (v < 0) {
|
|
64
|
+
v = p;
|
|
65
|
+
} else {
|
|
66
|
+
v += p * 91;
|
|
67
|
+
b |= v << n;
|
|
68
|
+
n += (v & 8191) > 88 ? 13 : 14;
|
|
69
|
+
|
|
70
|
+
do {
|
|
71
|
+
ret.push(b & 0xff);
|
|
72
|
+
b >>= 8;
|
|
73
|
+
n -= 8;
|
|
74
|
+
} while (n > 7);
|
|
75
|
+
|
|
76
|
+
v = -1;
|
|
142
77
|
}
|
|
143
|
-
|
|
144
|
-
chunk = chunk + "~";
|
|
145
|
-
var uniqueChars = new Set([]);
|
|
146
|
-
|
|
147
|
-
for (var char of chunk) {
|
|
148
|
-
uniqueChars.add(char);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
var keys = Array.from(uniqueChars).sort();
|
|
152
|
-
var table = {},
|
|
153
|
-
i = 0;
|
|
154
|
-
|
|
155
|
-
for (var key of keys) {
|
|
156
|
-
table[key] = i++;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
var idx = [];
|
|
160
|
-
|
|
161
|
-
for (var char of chunk) {
|
|
162
|
-
idx.push(table[char]);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
var table64 = "0x";
|
|
166
|
-
|
|
167
|
-
for (var i = keys.length - 1; i >= 0; i--) {
|
|
168
|
-
table64 += keys[i].charCodeAt(0).toString(16).toUpperCase();
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
var idxInt = 0;
|
|
172
|
-
|
|
173
|
-
for (var i = idx.length - 1; i >= 0; i--) {
|
|
174
|
-
idxInt = idxInt << 3 | idx[i];
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
var idx64 = "0x" + idxInt.toString(16).toUpperCase(); // console.log(chunk, table, idx, table64, idx64);
|
|
178
|
-
|
|
179
|
-
output += table64 + "," + idx64 + ",";
|
|
180
78
|
}
|
|
181
79
|
|
|
182
|
-
if (
|
|
183
|
-
|
|
80
|
+
if (v > -1) {
|
|
81
|
+
ret.push((b | v << n) & 0xff);
|
|
184
82
|
}
|
|
185
83
|
|
|
186
|
-
return "
|
|
84
|
+
return Buffer.from(ret).toString("utf-8");
|
|
187
85
|
},
|
|
188
|
-
decode: function (str) {
|
|
189
|
-
var output = "";
|
|
190
|
-
str = str.substring(1, str.length - 1);
|
|
191
|
-
var chunks = str.split(",");
|
|
192
|
-
|
|
193
|
-
for (var i = 0; i < chunks.length; i += 2) {
|
|
194
|
-
var arr = [chunks[i], chunks[i + 1]];
|
|
195
|
-
var [table, idx] = arr.map(Number); // console.log(table, idx);
|
|
196
|
-
|
|
197
|
-
while (idx) {
|
|
198
|
-
output += String.fromCharCode(table >> 8 * (idx & 7) & 0xff);
|
|
199
|
-
idx >>= 3;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
86
|
|
|
203
|
-
|
|
204
|
-
},
|
|
205
|
-
template: (0, _template.default)("\n function {name}(str){\n var output = \"\";\n \n str = str.substring(1, str.length - 1);\n var chunks = str.split(\",\");\n \n for (var i = 0; i < chunks.length; i += 2) {\n var arr = [chunks[i], chunks[i + 1]];\n \n var [table, idx] = arr.map(Number);\n \n // console.log(table, idx);\n while (idx) {\n output += String.fromCharCode((table >> (8 * (idx & 7))) & 0xff);\n idx >>= 3;\n }\n }\n \n return output.replace(/~/g, \"\");\n }\n \n ")
|
|
87
|
+
template: (0, _template.default)(" \n function {name}(str){\n const table =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~\"';\n\n const raw = \"\" + (str || \"\");\n const len = raw.length;\n const ret = [];\n\n let b = 0;\n let n = 0;\n let v = -1;\n\n for (let i = 0; i < len; i++) {\n const p = table.indexOf(raw[i]);\n if (p === -1) continue;\n if (v < 0) {\n v = p;\n } else {\n v += p * 91;\n b |= v << n;\n n += (v & 8191) > 88 ? 13 : 14;\n do {\n ret.push(b & 0xff);\n b >>= 8;\n n -= 8;\n } while (n > 7);\n v = -1;\n }\n }\n\n if (v > -1) {\n ret.push((b | (v << n)) & 0xff);\n }\n\n return {bufferToString}(ret);\n }\n ")
|
|
206
88
|
}
|
|
89
|
+
/* ascii85: { This implementation is flaky and causes decoding errors
|
|
90
|
+
encode(a) {
|
|
91
|
+
var b, c, d, e, f, g, h, i, j, k;
|
|
92
|
+
// @ts-ignore
|
|
93
|
+
for (
|
|
94
|
+
// @ts-ignore
|
|
95
|
+
!/[^\x00-\xFF]/.test(a),
|
|
96
|
+
b = "\x00\x00\x00\x00".slice(a.length % 4 || 4),
|
|
97
|
+
a += b,
|
|
98
|
+
c = [],
|
|
99
|
+
d = 0,
|
|
100
|
+
e = a.length;
|
|
101
|
+
e > d;
|
|
102
|
+
d += 4
|
|
103
|
+
)
|
|
104
|
+
(f =
|
|
105
|
+
(a.charCodeAt(d) << 24) +
|
|
106
|
+
(a.charCodeAt(d + 1) << 16) +
|
|
107
|
+
(a.charCodeAt(d + 2) << 8) +
|
|
108
|
+
a.charCodeAt(d + 3)),
|
|
109
|
+
0 !== f
|
|
110
|
+
? ((k = f % 85),
|
|
111
|
+
(f = (f - k) / 85),
|
|
112
|
+
(j = f % 85),
|
|
113
|
+
(f = (f - j) / 85),
|
|
114
|
+
(i = f % 85),
|
|
115
|
+
(f = (f - i) / 85),
|
|
116
|
+
(h = f % 85),
|
|
117
|
+
(f = (f - h) / 85),
|
|
118
|
+
(g = f % 85),
|
|
119
|
+
c.push(g + 33, h + 33, i + 33, j + 33, k + 33))
|
|
120
|
+
: c.push(122);
|
|
121
|
+
return (
|
|
122
|
+
(function (a, b) {
|
|
123
|
+
for (var c = b; c > 0; c--) a.pop();
|
|
124
|
+
})(c, b.length),
|
|
125
|
+
"<~" + String.fromCharCode.apply(String, c) + "~>"
|
|
126
|
+
);
|
|
127
|
+
},
|
|
128
|
+
decode(a) {
|
|
129
|
+
var c,
|
|
130
|
+
d,
|
|
131
|
+
e,
|
|
132
|
+
f,
|
|
133
|
+
g,
|
|
134
|
+
h = String,
|
|
135
|
+
l = "length",
|
|
136
|
+
w = 255,
|
|
137
|
+
x = "charCodeAt",
|
|
138
|
+
y = "slice",
|
|
139
|
+
z = "replace";
|
|
140
|
+
for (
|
|
141
|
+
"<~" === a[y](0, 2) && "~>" === a[y](-2),
|
|
142
|
+
a = a[y](2, -2)[z](/s/g, "")[z]("z", "!!!!!"),
|
|
143
|
+
c = "uuuuu"[y](a[l] % 5 || 5),
|
|
144
|
+
a += c,
|
|
145
|
+
e = [],
|
|
146
|
+
f = 0,
|
|
147
|
+
g = a[l];
|
|
148
|
+
g > f;
|
|
149
|
+
f += 5
|
|
150
|
+
)
|
|
151
|
+
(d =
|
|
152
|
+
52200625 * (a[x](f) - 33) +
|
|
153
|
+
614125 * (a[x](f + 1) - 33) +
|
|
154
|
+
7225 * (a[x](f + 2) - 33) +
|
|
155
|
+
85 * (a[x](f + 3) - 33) +
|
|
156
|
+
(a[x](f + 4) - 33)),
|
|
157
|
+
e.push(w & (d >> 24), w & (d >> 16), w & (d >> 8), w & d);
|
|
158
|
+
return (
|
|
159
|
+
(function (a, b) {
|
|
160
|
+
for (var c = b; c > 0; c--) a.pop();
|
|
161
|
+
})(e, c[l]),
|
|
162
|
+
h.fromCharCode.apply(h, e)
|
|
163
|
+
);
|
|
164
|
+
},
|
|
165
|
+
template: Template(`
|
|
166
|
+
function {name}(a, LL = ["fromCharCode", "apply"]) {
|
|
167
|
+
var c, d, e, f, g, h = String, l = "length", w = 255, x = "charCodeAt", y = "slice", z = "replace";
|
|
168
|
+
for ("<~" === a[y](0, 2) && "~>" === a[y](-2), a = a[y](2, -2)[z](/\s/g, "")[z]("z", "!!!!!"),
|
|
169
|
+
c = "uuuuu"[y](a[l] % 5 || 5), a += c, e = [], f = 0, g = a[l]; g > f; f += 5) d = 52200625 * (a[x](f) - 33) + 614125 * (a[x](f + 1) - 33) + 7225 * (a[x](f + 2) - 33) + 85 * (a[x](f + 3) - 33) + (a[x](f + 4) - 33),
|
|
170
|
+
e.push(w & d >> 24, w & d >> 16, w & d >> 8, w & d);
|
|
171
|
+
return function(a, b) {
|
|
172
|
+
for (var c = b; c > 0; c--) a.pop();
|
|
173
|
+
}(e, c[l]), h[LL[0]][LL[1]](h, e);
|
|
174
|
+
}
|
|
175
|
+
`),
|
|
176
|
+
}, */
|
|
177
|
+
|
|
207
178
|
};
|
|
208
179
|
var _default = Encoding;
|
|
209
180
|
exports.default = _default;
|
|
@@ -23,6 +23,8 @@ var _transform = _interopRequireDefault(require("../transform"));
|
|
|
23
23
|
|
|
24
24
|
var _stringConcealing = require("./stringConcealing");
|
|
25
25
|
|
|
26
|
+
var _random = require("../../util/random");
|
|
27
|
+
|
|
26
28
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
27
29
|
|
|
28
30
|
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; }
|
|
@@ -74,7 +76,7 @@ class StringCompression extends _transform.default {
|
|
|
74
76
|
|
|
75
77
|
_defineProperty(this, "string", void 0);
|
|
76
78
|
|
|
77
|
-
_defineProperty(this, "delimiter", "
|
|
79
|
+
_defineProperty(this, "delimiter", "|");
|
|
78
80
|
|
|
79
81
|
_defineProperty(this, "fnName", void 0);
|
|
80
82
|
|
|
@@ -98,7 +100,7 @@ class StringCompression extends _transform.default {
|
|
|
98
100
|
var encoded = LZ_encode(this.string);
|
|
99
101
|
|
|
100
102
|
if (LZ_decode(encoded) !== this.string) {
|
|
101
|
-
this.error(new Error("String failed to be decoded"));
|
|
103
|
+
this.error(new Error("String failed to be decoded. Try disabling the 'stringCompression' option."));
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
var getStringParamName = this.getPlaceholder();
|
|
@@ -130,33 +132,30 @@ class StringCompression extends _transform.default {
|
|
|
130
132
|
return;
|
|
131
133
|
}
|
|
132
134
|
|
|
133
|
-
if (!(0, _probability.ComputeProbabilityMap)(
|
|
135
|
+
if (!(0, _probability.ComputeProbabilityMap)(this.options.stringCompression, x => x, object.value)) {
|
|
134
136
|
return;
|
|
135
|
-
}
|
|
137
|
+
} // HARD CODED LIMIT of 10,000 (after 1,000 elements)
|
|
136
138
|
|
|
137
|
-
|
|
139
|
+
|
|
140
|
+
if (this.map.size > 1000 && !(0, _random.chance)(this.map.size / 100)) return;
|
|
141
|
+
var index = this.map.get(object.value); // New string, add it!
|
|
138
142
|
|
|
139
143
|
if (typeof index !== "number") {
|
|
144
|
+
// Ensure the string gets properly decoded
|
|
140
145
|
if (LZ_decode(LZ_encode(object.value)) !== object.value) {
|
|
141
146
|
this.ignore.add(object.value);
|
|
142
147
|
return;
|
|
143
148
|
}
|
|
144
149
|
|
|
145
|
-
var before = this.string;
|
|
146
150
|
index = this.map.size;
|
|
147
151
|
this.map.set(object.value, index);
|
|
148
|
-
this.string += object.value + this.delimiter;
|
|
149
|
-
|
|
150
|
-
if (LZ_decode(LZ_encode(this.string)) !== this.string) {
|
|
151
|
-
this.string = before;
|
|
152
|
-
this.map.delete(object.value);
|
|
153
|
-
this.ignore.add(object.value);
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
152
|
+
this.string += object.value + this.delimiter;
|
|
156
153
|
}
|
|
157
154
|
|
|
158
155
|
(0, _assert.ok)(typeof index === "number");
|
|
159
|
-
|
|
156
|
+
return () => {
|
|
157
|
+
this.replaceIdentifierOrLiteral(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.fnName), [(0, _gen.Literal)(index)]), parents);
|
|
158
|
+
};
|
|
160
159
|
}
|
|
161
160
|
|
|
162
161
|
}
|
|
@@ -26,6 +26,10 @@ var _transform = _interopRequireDefault(require("../transform"));
|
|
|
26
26
|
|
|
27
27
|
var _encoding = _interopRequireDefault(require("./encoding"));
|
|
28
28
|
|
|
29
|
+
var _probability = require("../../probability");
|
|
30
|
+
|
|
31
|
+
var _bufferToString = require("../../templates/bufferToString");
|
|
32
|
+
|
|
29
33
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
30
34
|
|
|
31
35
|
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; }
|
|
@@ -95,6 +99,11 @@ class StringConcealing extends _transform.default {
|
|
|
95
99
|
apply(tree) {
|
|
96
100
|
super.apply(tree);
|
|
97
101
|
var cacheName = this.getPlaceholder();
|
|
102
|
+
var bufferToStringName = this.getPlaceholder(); // This helper functions convert UInt8 Array to UTf-string
|
|
103
|
+
|
|
104
|
+
(0, _insert.prepend)(tree, ..._bufferToString.BufferToStringTemplate.compile({
|
|
105
|
+
name: bufferToStringName
|
|
106
|
+
}));
|
|
98
107
|
Object.keys(this.encoding).forEach(type => {
|
|
99
108
|
var {
|
|
100
109
|
template
|
|
@@ -102,7 +111,8 @@ class StringConcealing extends _transform.default {
|
|
|
102
111
|
var decodeFn = this.getPlaceholder();
|
|
103
112
|
var getterFn = this.encoding[type];
|
|
104
113
|
(0, _insert.append)(tree, template.single({
|
|
105
|
-
name: decodeFn
|
|
114
|
+
name: decodeFn,
|
|
115
|
+
bufferToString: bufferToStringName
|
|
106
116
|
}));
|
|
107
117
|
(0, _insert.append)(tree, (0, _template.default)("\n \n function ".concat(getterFn, "(x, y, z, a = ").concat(decodeFn, ", b = ").concat(cacheName, "){\n if ( z ) {\n return y[").concat(cacheName, "[z]] = ").concat(getterFn, "(x, y);\n } else if ( y ) {\n [b, y] = [a(b), x || z]\n }\n \n return y ? x[b[y]] : ").concat(cacheName, "[x] || (z=(b[x], a), ").concat(cacheName, "[x] = z(").concat(this.arrayName, "[x]))\n }\n \n ")).single());
|
|
108
118
|
});
|
|
@@ -122,12 +132,19 @@ class StringConcealing extends _transform.default {
|
|
|
122
132
|
// Empty strings are discarded
|
|
123
133
|
if (!object.value || this.ignore.has(object.value) || object.value.length == 0) {
|
|
124
134
|
return;
|
|
125
|
-
}
|
|
135
|
+
} // Allow user to choose which strings get changed
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
if (!(0, _probability.ComputeProbabilityMap)(this.options.stringConcealing, x => x, object.value)) {
|
|
139
|
+
return;
|
|
140
|
+
} // HARD CODED LIMIT of 10,000 (after 1,000 elements)
|
|
141
|
+
|
|
126
142
|
|
|
143
|
+
if (this.set.size > 1000 && !(0, _random.chance)(this.set.size / 100)) return;
|
|
127
144
|
var types = Object.keys(this.encoding);
|
|
128
145
|
var type = (0, _random.choice)(types);
|
|
129
146
|
|
|
130
|
-
if (!type || !this.hasAllEncodings &&
|
|
147
|
+
if (!type || !this.hasAllEncodings && (0, _random.chance)(10)) {
|
|
131
148
|
var allowed = Object.keys(_encoding.default).filter(type => !this.encoding[type]);
|
|
132
149
|
|
|
133
150
|
if (!allowed.length) {
|
|
@@ -165,16 +182,16 @@ class StringConcealing extends _transform.default {
|
|
|
165
182
|
(0, _assert.ok)(index != -1, "index == -1");
|
|
166
183
|
var callExpr = (0, _gen.CallExpression)((0, _gen.Identifier)(fnName), [(0, _gen.Literal)(index)]); // use `.apply` to fool automated de-obfuscators
|
|
167
184
|
|
|
168
|
-
if (
|
|
169
|
-
callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.
|
|
185
|
+
if ((0, _random.chance)(10)) {
|
|
186
|
+
callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.Literal)("apply"), true), [(0, _gen.Identifier)("undefined"), (0, _gen.ArrayExpression)([(0, _gen.Literal)(index)])]);
|
|
170
187
|
} // use `.call`
|
|
171
|
-
else if (
|
|
172
|
-
callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.
|
|
188
|
+
else if ((0, _random.chance)(10)) {
|
|
189
|
+
callExpr = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(fnName), (0, _gen.Literal)("call"), true), [(0, _gen.Identifier)("undefined"), (0, _gen.Literal)(index)]);
|
|
173
190
|
}
|
|
174
191
|
|
|
175
192
|
var referenceType = "call";
|
|
176
193
|
|
|
177
|
-
if (parents.length &&
|
|
194
|
+
if (parents.length && (0, _random.chance)(50 - this.variablesMade)) {
|
|
178
195
|
referenceType = "constantReference";
|
|
179
196
|
}
|
|
180
197
|
|
|
@@ -9,15 +9,15 @@ var _transform = _interopRequireDefault(require("../transform"));
|
|
|
9
9
|
|
|
10
10
|
var _random = require("../../util/random");
|
|
11
11
|
|
|
12
|
-
var _order = require("../../order");
|
|
13
|
-
|
|
14
12
|
var _compare = require("../../util/compare");
|
|
15
13
|
|
|
16
14
|
var _stringConcealing = require("./stringConcealing");
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
var _probability = require("../../probability");
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
var _gen = require("../../util/gen");
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
21
|
|
|
22
22
|
function pad(x, len) {
|
|
23
23
|
while (x.length < len) {
|
|
@@ -73,34 +73,23 @@ function toUnicodeRepresentation(str) {
|
|
|
73
73
|
|
|
74
74
|
class StringEncoding extends _transform.default {
|
|
75
75
|
constructor(o) {
|
|
76
|
-
super(o
|
|
77
|
-
|
|
78
|
-
_defineProperty(this, "seen", void 0);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
apply(tree) {
|
|
82
|
-
this.seen = new Set();
|
|
83
|
-
super.apply(tree);
|
|
76
|
+
super(o);
|
|
84
77
|
}
|
|
85
78
|
|
|
86
79
|
match(object, parents) {
|
|
87
|
-
return object.type == "Literal" && typeof object.value === "string" && !(0, _stringConcealing.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
|
|
80
|
+
return object.type == "Literal" && typeof object.value === "string" && object.value.length > 0 && !(0, _stringConcealing.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
|
|
88
81
|
}
|
|
89
82
|
|
|
90
83
|
transform(object, parents) {
|
|
91
|
-
//
|
|
92
|
-
if (this.
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
this.seen.add(object);
|
|
84
|
+
// Allow percentages
|
|
85
|
+
if (!(0, _probability.ComputeProbabilityMap)(this.options.stringEncoding, x => x, object.value)) return;
|
|
97
86
|
var type = (0, _random.choice)(["hexadecimal", "unicode"]);
|
|
98
|
-
var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(object.value);
|
|
87
|
+
var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(object.value);
|
|
88
|
+
return () => {
|
|
89
|
+
if (object.type !== "Literal") return; // ESCodeGen tries to escape backslashes, here is a work-around
|
|
99
90
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
name: "'".concat(escapedString, "'")
|
|
103
|
-
});
|
|
91
|
+
this.replace(object, (0, _gen.Identifier)("'".concat(escapedString, "'")));
|
|
92
|
+
};
|
|
104
93
|
}
|
|
105
94
|
|
|
106
95
|
}
|
|
@@ -81,10 +81,6 @@ class Transform {
|
|
|
81
81
|
/**
|
|
82
82
|
* Transforms to run after.
|
|
83
83
|
*/
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Transformations to run at the same time (can cause conflicts so use sparingly)
|
|
87
|
-
*/
|
|
88
84
|
constructor(obfuscator) {
|
|
89
85
|
let priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
|
|
90
86
|
|
|
@@ -98,15 +94,12 @@ class Transform {
|
|
|
98
94
|
|
|
99
95
|
_defineProperty(this, "after", void 0);
|
|
100
96
|
|
|
101
|
-
_defineProperty(this, "concurrent", void 0);
|
|
102
|
-
|
|
103
97
|
(0, _assert.ok)(obfuscator instanceof _obfuscator.default, "obfuscator should be an Obfuscator");
|
|
104
98
|
this.obfuscator = obfuscator;
|
|
105
99
|
this.options = this.obfuscator.options;
|
|
106
100
|
this.priority = priority;
|
|
107
101
|
this.before = [];
|
|
108
102
|
this.after = [];
|
|
109
|
-
this.concurrent = [];
|
|
110
103
|
}
|
|
111
104
|
/**
|
|
112
105
|
* The transformation name.
|
|
@@ -136,12 +129,12 @@ class Transform {
|
|
|
136
129
|
|
|
137
130
|
|
|
138
131
|
this.before.forEach(x => x.apply(tree));
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
132
|
+
/**
|
|
133
|
+
* Run this transformation
|
|
134
|
+
*/
|
|
142
135
|
|
|
143
|
-
|
|
144
|
-
return
|
|
136
|
+
(0, _traverse.default)(tree, (object, parents) => {
|
|
137
|
+
return this.input(object, parents);
|
|
145
138
|
});
|
|
146
139
|
/**
|
|
147
140
|
* Cleanup transformations
|
|
@@ -206,14 +199,13 @@ class Transform {
|
|
|
206
199
|
}
|
|
207
200
|
/**
|
|
208
201
|
* Returns an independent name generator with it's own counter.
|
|
209
|
-
* @param
|
|
202
|
+
* @param overrideMode - Override the user's `identifierGenerator` option
|
|
210
203
|
* @returns
|
|
211
204
|
*/
|
|
212
205
|
|
|
213
206
|
|
|
214
|
-
getGenerator() {
|
|
215
|
-
|
|
216
|
-
var count = offset;
|
|
207
|
+
getGenerator(overrideMode) {
|
|
208
|
+
var count = 0;
|
|
217
209
|
var identifiers = new Set();
|
|
218
210
|
return {
|
|
219
211
|
generate: () => {
|
|
@@ -221,7 +213,7 @@ class Transform {
|
|
|
221
213
|
|
|
222
214
|
do {
|
|
223
215
|
count++;
|
|
224
|
-
retValue = this.generateIdentifier(-1, count);
|
|
216
|
+
retValue = this.generateIdentifier(-1, count, overrideMode);
|
|
225
217
|
} while (identifiers.has(retValue));
|
|
226
218
|
|
|
227
219
|
identifiers.add(retValue);
|
|
@@ -239,6 +231,7 @@ class Transform {
|
|
|
239
231
|
generateIdentifier() {
|
|
240
232
|
let length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;
|
|
241
233
|
let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
|
|
234
|
+
let overrideMode = arguments.length > 2 ? arguments[2] : undefined;
|
|
242
235
|
|
|
243
236
|
if (length == -1) {
|
|
244
237
|
length = (0, _random.getRandomInteger)(6, 8);
|
|
@@ -255,7 +248,7 @@ class Transform {
|
|
|
255
248
|
var identifier;
|
|
256
249
|
|
|
257
250
|
do {
|
|
258
|
-
identifier = (0, _probability.ComputeProbabilityMap)(this.options.identifierGenerator, function () {
|
|
251
|
+
identifier = (0, _probability.ComputeProbabilityMap)(overrideMode || this.options.identifierGenerator, function () {
|
|
259
252
|
let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "randomized";
|
|
260
253
|
|
|
261
254
|
switch (mode) {
|