obscura-js 0.1.1 → 0.3.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/dist/src/antiDebug/integrityTag.d.ts +5 -5
- package/dist/src/antiDebug/integrityTag.d.ts.map +1 -1
- package/dist/src/antiDebug/integrityTag.js +22 -13
- package/dist/src/antiDebug/integrityTag.js.map +1 -1
- package/dist/src/antiDebug/nativeBinding.d.ts +2 -2
- package/dist/src/antiDebug/nativeBinding.js +3 -3
- package/dist/src/antiDebug/nativeBinding.js.map +1 -1
- package/dist/src/obfuscation/cff.d.ts.map +1 -1
- package/dist/src/obfuscation/cff.js +13 -5
- package/dist/src/obfuscation/cff.js.map +1 -1
- package/dist/src/obfuscation/deadCode.d.ts +3 -2
- package/dist/src/obfuscation/deadCode.d.ts.map +1 -1
- package/dist/src/obfuscation/deadCode.js +215 -15
- package/dist/src/obfuscation/deadCode.js.map +1 -1
- package/dist/src/obfuscation/functionTable.d.ts +2 -2
- package/dist/src/obfuscation/functionTable.js +4 -4
- package/dist/src/obfuscation/functionTable.js.map +1 -1
- package/dist/src/obfuscation/mba.d.ts +5 -1
- package/dist/src/obfuscation/mba.d.ts.map +1 -1
- package/dist/src/obfuscation/mba.js +15 -4
- package/dist/src/obfuscation/mba.js.map +1 -1
- package/dist/src/obfuscation/stringPool.d.ts +1 -1
- package/dist/src/obfuscation/stringPool.d.ts.map +1 -1
- package/dist/src/obfuscation/stringPool.js +8 -7
- package/dist/src/obfuscation/stringPool.js.map +1 -1
- package/package.json +2 -2
|
@@ -7,15 +7,15 @@ import type { IntegrityTagOptions } from "../types";
|
|
|
7
7
|
* array/object literal in the AST. At runtime, code can verify the
|
|
8
8
|
* symbol is present to detect tampering (cloning, serialisation, etc.).
|
|
9
9
|
*
|
|
10
|
-
* The runtime helper `
|
|
10
|
+
* The runtime helper `__obscura_tag` is prepended to the output:
|
|
11
11
|
*
|
|
12
|
-
* const
|
|
13
|
-
* function
|
|
14
|
-
* Object.defineProperty(v,
|
|
12
|
+
* const __obscura_sym = Symbol('jas');
|
|
13
|
+
* function __obscura_tag(v, checksum) {
|
|
14
|
+
* Object.defineProperty(v, __obscura_sym, { value: checksum, enumerable: false });
|
|
15
15
|
* return v;
|
|
16
16
|
* }
|
|
17
17
|
*
|
|
18
|
-
* Arrays are replaced by:
|
|
18
|
+
* Arrays are replaced by: __obscura_tag([...], <checksum>)
|
|
19
19
|
*/
|
|
20
20
|
export declare function applyIntegrityTag(ast: t.File, options?: IntegrityTagOptions): void;
|
|
21
21
|
//# sourceMappingURL=integrityTag.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrityTag.d.ts","sourceRoot":"","sources":["../../../src/antiDebug/integrityTag.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"integrityTag.d.ts","sourceRoot":"","sources":["../../../src/antiDebug/integrityTag.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAqEtF"}
|
|
@@ -46,42 +46,51 @@ const t = __importStar(require("@babel/types"));
|
|
|
46
46
|
* array/object literal in the AST. At runtime, code can verify the
|
|
47
47
|
* symbol is present to detect tampering (cloning, serialisation, etc.).
|
|
48
48
|
*
|
|
49
|
-
* The runtime helper `
|
|
49
|
+
* The runtime helper `__obscura_tag` is prepended to the output:
|
|
50
50
|
*
|
|
51
|
-
* const
|
|
52
|
-
* function
|
|
53
|
-
* Object.defineProperty(v,
|
|
51
|
+
* const __obscura_sym = Symbol('jas');
|
|
52
|
+
* function __obscura_tag(v, checksum) {
|
|
53
|
+
* Object.defineProperty(v, __obscura_sym, { value: checksum, enumerable: false });
|
|
54
54
|
* return v;
|
|
55
55
|
* }
|
|
56
56
|
*
|
|
57
|
-
* Arrays are replaced by:
|
|
57
|
+
* Arrays are replaced by: __obscura_tag([...], <checksum>)
|
|
58
58
|
*/
|
|
59
59
|
function applyIntegrityTag(ast, options = {}) {
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
60
|
+
// Randomize Symbol description when not explicitly provided — avoids a fixed "jas" fingerprint
|
|
61
|
+
const defaultDesc = Math.floor(Math.random() * 0xffffffff)
|
|
62
|
+
.toString(36)
|
|
63
|
+
.slice(0, 6);
|
|
64
|
+
const description = options.tagDescription ?? defaultDesc;
|
|
65
|
+
const symVar = "__obscura_sym";
|
|
66
|
+
const tagFn = "__obscura_tag";
|
|
67
|
+
// Randomized mixing constants for checksum computation
|
|
68
|
+
const K1 = (Math.floor(Math.random() * 0xffff) | 1) >>> 0; // odd, non-zero
|
|
69
|
+
const K2 = (Math.floor(Math.random() * 0xffff) | 1) >>> 0;
|
|
63
70
|
let hasArrays = false;
|
|
64
71
|
(0, traverse_1.default)(ast, {
|
|
65
72
|
ArrayExpression(path) {
|
|
66
73
|
// Skip if already tagged or inside the helper declarations
|
|
67
74
|
if (t.isCallExpression(path.parent))
|
|
68
75
|
return;
|
|
69
|
-
|
|
76
|
+
// Multi-step checksum: mix element count with two random constants
|
|
77
|
+
const len = path.node.elements.length;
|
|
78
|
+
const checksum = (((len ^ K1) * K2) ^ (K1 >>> 3)) >>> 0;
|
|
70
79
|
path.replaceWith(t.callExpression(t.identifier(tagFn), [
|
|
71
80
|
t.cloneNode(path.node, true),
|
|
72
|
-
t.numericLiteral(checksum
|
|
81
|
+
t.numericLiteral(checksum),
|
|
73
82
|
]));
|
|
74
83
|
hasArrays = true;
|
|
75
84
|
},
|
|
76
85
|
});
|
|
77
86
|
if (!hasArrays)
|
|
78
87
|
return;
|
|
79
|
-
// const
|
|
88
|
+
// const __obscura_sym = Symbol('jas');
|
|
80
89
|
const symDecl = t.variableDeclaration("const", [
|
|
81
90
|
t.variableDeclarator(t.identifier(symVar), t.callExpression(t.identifier("Symbol"), [t.stringLiteral(description)])),
|
|
82
91
|
]);
|
|
83
|
-
// function
|
|
84
|
-
// Object.defineProperty(v,
|
|
92
|
+
// function __obscura_tag(v, checksum) {
|
|
93
|
+
// Object.defineProperty(v, __obscura_sym, { value: checksum, enumerable: false });
|
|
85
94
|
// return v;
|
|
86
95
|
// }
|
|
87
96
|
const tagDecl = t.functionDeclaration(t.identifier(tagFn), [t.identifier("v"), t.identifier("checksum")], t.blockStatement([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrityTag.js","sourceRoot":"","sources":["../../../src/antiDebug/integrityTag.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,
|
|
1
|
+
{"version":3,"file":"integrityTag.js","sourceRoot":"","sources":["../../../src/antiDebug/integrityTag.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,8 @@ import type { NativeBindingOptions } from "../types";
|
|
|
8
8
|
* cannot affect these captured references.
|
|
9
9
|
*
|
|
10
10
|
* Example output:
|
|
11
|
-
* const
|
|
12
|
-
* const
|
|
11
|
+
* const __obscura_Math_floor = Math.floor.bind(Math);
|
|
12
|
+
* const __obscura_Math_random = Math.random.bind(Math);
|
|
13
13
|
*/
|
|
14
14
|
export declare function applyNativeBinding(ast: t.File, options?: NativeBindingOptions): void;
|
|
15
15
|
//# sourceMappingURL=nativeBinding.d.ts.map
|
|
@@ -54,8 +54,8 @@ const DEFAULT_METHODS = [
|
|
|
54
54
|
* cannot affect these captured references.
|
|
55
55
|
*
|
|
56
56
|
* Example output:
|
|
57
|
-
* const
|
|
58
|
-
* const
|
|
57
|
+
* const __obscura_Math_floor = Math.floor.bind(Math);
|
|
58
|
+
* const __obscura_Math_random = Math.random.bind(Math);
|
|
59
59
|
*/
|
|
60
60
|
function applyNativeBinding(ast, options = {}) {
|
|
61
61
|
const methods = options.methods ?? DEFAULT_METHODS;
|
|
@@ -63,7 +63,7 @@ function applyNativeBinding(ast, options = {}) {
|
|
|
63
63
|
const parts = methodPath.split(".");
|
|
64
64
|
// receiver is the object before the last segment (e.g. Math for Math.floor)
|
|
65
65
|
const receiverPath = parts.slice(0, -1).join(".");
|
|
66
|
-
const constName = `
|
|
66
|
+
const constName = `__obscura_${parts.join("_")}`;
|
|
67
67
|
// Build member expression: Math.floor
|
|
68
68
|
const memberExpr = parts.reduce((acc, part) => t.memberExpression(acc, t.identifier(part)), t.identifier(parts[0]));
|
|
69
69
|
// Actually rebuild correctly:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeBinding.js","sourceRoot":"","sources":["../../../src/antiDebug/nativeBinding.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,gDAsCC;AAhED,gDAAkC;AAGlC,gDAAgD;AAChD,MAAM,eAAe,GAAG;IACtB,YAAY;IACZ,aAAa;IACb,WAAW;IACX,YAAY;IACZ,uBAAuB;IACvB,aAAa;IACb,uBAAuB;IACvB,yBAAyB;CAC1B,CAAC;AAEF;;;;;;;;;;GAUG;AACH,SAAgB,kBAAkB,CAAC,GAAW,EAAE,UAAgC,EAAE;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,MAAM,YAAY,GAA4B,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACvE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,4EAA4E;QAC5E,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"nativeBinding.js","sourceRoot":"","sources":["../../../src/antiDebug/nativeBinding.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,gDAsCC;AAhED,gDAAkC;AAGlC,gDAAgD;AAChD,MAAM,eAAe,GAAG;IACtB,YAAY;IACZ,aAAa;IACb,WAAW;IACX,YAAY;IACZ,uBAAuB;IACvB,aAAa;IACb,uBAAuB;IACvB,yBAAyB;CAC1B,CAAC;AAEF;;;;;;;;;;GAUG;AACH,SAAgB,kBAAkB,CAAC,GAAW,EAAE,UAAgC,EAAE;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,MAAM,YAAY,GAA4B,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACvE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,4EAA4E;QAC5E,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,aAAa,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAEjD,sCAAsC;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAC7B,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAC1D,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,CAAC;QACF,8BAA8B;QAC9B,IAAI,GAAG,GAAiB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,GAAG,GAAG,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,mDAAmD;QACnD,IAAI,QAAQ,GAAiB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,QAAQ,GAAG,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,iDAAiD;QAClE,KAAK,YAAY,CAAC;QAElB,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7F,OAAO,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE;YACpC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;SACxD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEF,GAAG,CAAC,OAAO,CAAC,IAAsB,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cff.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/cff.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,CAAC,CAAC,IAAI,EACX,OAAO,GAAE,4BAAiC,GACzC,IAAI,
|
|
1
|
+
{"version":3,"file":"cff.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/cff.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,CAAC,CAAC,IAAI,EACX,OAAO,GAAE,4BAAiC,GACzC,IAAI,CA2FN"}
|
|
@@ -63,7 +63,7 @@ const t = __importStar(require("@babel/types"));
|
|
|
63
63
|
*/
|
|
64
64
|
function applyControlFlowFlattening(ast, options = {}) {
|
|
65
65
|
const passes = options.passes ?? 1;
|
|
66
|
-
const stateVar = "
|
|
66
|
+
const stateVar = "__obscura_s";
|
|
67
67
|
/**
|
|
68
68
|
* If `stmt` is a let/const VariableDeclaration, extract the declarators into
|
|
69
69
|
* `hoisted` (as var-declared names only) and return ExpressionStatements for
|
|
@@ -100,21 +100,29 @@ function applyControlFlowFlattening(ast, options = {}) {
|
|
|
100
100
|
if (body.some((s) => t.isSwitchStatement(s)))
|
|
101
101
|
return;
|
|
102
102
|
const hoisted = [];
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
// Fisher-Yates shuffle to assign random case numbers (not sequential)
|
|
104
|
+
const stateNums = Array.from({ length: body.length }, (_, i) => i);
|
|
105
|
+
for (let i = stateNums.length - 1; i > 0; i--) {
|
|
106
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
107
|
+
[stateNums[i], stateNums[j]] = [stateNums[j], stateNums[i]];
|
|
108
|
+
}
|
|
109
|
+
const cases = body.map((stmt, stepIdx) => {
|
|
110
|
+
const actualState = stateNums[stepIdx];
|
|
111
|
+
const nextActual = stepIdx === body.length - 1 ? -1 : stateNums[stepIdx + 1];
|
|
112
|
+
const nextState = t.numericLiteral(nextActual);
|
|
105
113
|
const converted = extractHoisted(stmt, hoisted);
|
|
106
114
|
const caseBody = [];
|
|
107
115
|
if (!t.isEmptyStatement(converted))
|
|
108
116
|
caseBody.push(converted);
|
|
109
117
|
caseBody.push(t.expressionStatement(t.assignmentExpression("=", t.identifier(stateVar), nextState)), t.breakStatement());
|
|
110
|
-
return t.switchCase(t.numericLiteral(
|
|
118
|
+
return t.switchCase(t.numericLiteral(actualState), caseBody);
|
|
111
119
|
});
|
|
112
120
|
// default: return;
|
|
113
121
|
cases.push(t.switchCase(null, [t.returnStatement()]));
|
|
114
122
|
const dispatcher = t.whileStatement(t.booleanLiteral(true), t.blockStatement([t.switchStatement(t.identifier(stateVar), cases)]));
|
|
115
123
|
const prelude = [
|
|
116
124
|
t.variableDeclaration("let", [
|
|
117
|
-
t.variableDeclarator(t.identifier(stateVar), t.numericLiteral(0)),
|
|
125
|
+
t.variableDeclarator(t.identifier(stateVar), t.numericLiteral(stateNums[0])),
|
|
118
126
|
]),
|
|
119
127
|
];
|
|
120
128
|
if (hoisted.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cff.js","sourceRoot":"","sources":["../../../src/obfuscation/cff.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,
|
|
1
|
+
{"version":3,"file":"cff.js","sourceRoot":"","sources":["../../../src/obfuscation/cff.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,9 @@ import type { DeadCodeOptions } from "../types";
|
|
|
3
3
|
/**
|
|
4
4
|
* Pass: Dead Code Injection
|
|
5
5
|
*
|
|
6
|
-
* Inserts unreachable/useless code blocks throughout the program body
|
|
7
|
-
* inflate file size and confuse static analysis
|
|
6
|
+
* Inserts unreachable/useless code blocks throughout the program body AND
|
|
7
|
+
* inside function bodies to inflate file size and confuse static analysis.
|
|
8
|
+
* Templates use opaque predicates requiring multi-step analysis to refute.
|
|
8
9
|
*/
|
|
9
10
|
export declare function applyDeadCode(ast: t.File, options?: DeadCodeOptions): void;
|
|
10
11
|
//# sourceMappingURL=deadCode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deadCode.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/deadCode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deadCode.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/deadCode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAmVhD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,eAAoB,GAAG,IAAI,CAkC9E"}
|
|
@@ -32,39 +32,239 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.applyDeadCode = applyDeadCode;
|
|
40
|
+
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
37
41
|
const t = __importStar(require("@babel/types"));
|
|
38
|
-
/**
|
|
42
|
+
/** Generate a random hex identifier that looks like obfuscated code */
|
|
43
|
+
function randHexId() {
|
|
44
|
+
const a = Math.floor(Math.random() * 0xffff)
|
|
45
|
+
.toString(16)
|
|
46
|
+
.padStart(4, "0");
|
|
47
|
+
const b = Math.floor(Math.random() * 0xffff)
|
|
48
|
+
.toString(16)
|
|
49
|
+
.padStart(4, "0");
|
|
50
|
+
return `_0x${a}${b}`;
|
|
51
|
+
}
|
|
52
|
+
/** Realistic-looking internal variable name (looks like real utility code) */
|
|
53
|
+
const INTERNAL_PREFIXES = [
|
|
54
|
+
"_mask",
|
|
55
|
+
"_shift",
|
|
56
|
+
"_val",
|
|
57
|
+
"_buf",
|
|
58
|
+
"_idx",
|
|
59
|
+
"_key",
|
|
60
|
+
"_hash",
|
|
61
|
+
"_state",
|
|
62
|
+
"_tmp",
|
|
63
|
+
"_acc",
|
|
64
|
+
"_crc",
|
|
65
|
+
"_flag",
|
|
66
|
+
];
|
|
67
|
+
function randInternalId() {
|
|
68
|
+
const p = INTERNAL_PREFIXES[Math.floor(Math.random() * INTERNAL_PREFIXES.length)];
|
|
69
|
+
const n = Math.floor(Math.random() * 0xfff)
|
|
70
|
+
.toString(16)
|
|
71
|
+
.padStart(3, "0");
|
|
72
|
+
return `${p}_${n}`;
|
|
73
|
+
}
|
|
74
|
+
/** Well-known hash/mixing constants — makes computations look purposeful */
|
|
75
|
+
const MIX_CONSTS = [0x9e3779b9, 0x85ebca6b, 0xc2b2ae35, 0xbf58476d, 0x6b3a4ba9];
|
|
76
|
+
function pickConst() {
|
|
77
|
+
return MIX_CONSTS[Math.floor(Math.random() * MIX_CONSTS.length)];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Dead code statement templates.
|
|
81
|
+
*
|
|
82
|
+
* Each template produces a block that looks like real processing logic but
|
|
83
|
+
* is provably unreachable. Conditions require multi-step static analysis to
|
|
84
|
+
* verify — they cannot be detected by naive pattern matching alone.
|
|
85
|
+
*/
|
|
39
86
|
const DEAD_TEMPLATES = [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
87
|
+
// T1: Bitmask computation — condition checks for a value that was never produced
|
|
88
|
+
// { var _mask_XXX = (A & B) ^ C; if (_mask_XXX === computed+0x1337) { ... } }
|
|
89
|
+
() => {
|
|
90
|
+
const a = Math.floor(Math.random() * 0xffff);
|
|
91
|
+
const b = Math.floor(Math.random() * 0xffff);
|
|
92
|
+
const c = Math.floor(Math.random() * 0xffff);
|
|
93
|
+
const actual = ((a & b) ^ c) | 0;
|
|
94
|
+
const falseTarget = (actual + 0x1337) | 0; // always different from actual
|
|
95
|
+
const id1 = randInternalId();
|
|
96
|
+
const id2 = randInternalId();
|
|
97
|
+
return t.blockStatement([
|
|
98
|
+
t.variableDeclaration("var", [
|
|
99
|
+
t.variableDeclarator(t.identifier(id1), t.binaryExpression("^", t.binaryExpression("&", t.numericLiteral(a), t.numericLiteral(b)), t.numericLiteral(c))),
|
|
100
|
+
]),
|
|
101
|
+
t.ifStatement(t.binaryExpression("===", t.identifier(id1), t.numericLiteral(falseTarget)), t.blockStatement([
|
|
102
|
+
t.variableDeclaration("var", [
|
|
103
|
+
t.variableDeclarator(t.identifier(id2), t.binaryExpression("|", t.binaryExpression(">>>", t.identifier(id1), t.numericLiteral(16)), t.binaryExpression("&", t.identifier(id1), t.numericLiteral(0xffff)))),
|
|
104
|
+
]),
|
|
105
|
+
t.expressionStatement(t.assignmentExpression("=", t.identifier(id1), t.binaryExpression("^", t.identifier(id2), t.numericLiteral(pickConst() & 0xffff)))),
|
|
106
|
+
])),
|
|
107
|
+
]);
|
|
108
|
+
},
|
|
109
|
+
// T2: Accumulator loop over empty range — stays 0, then guarded as non-zero
|
|
110
|
+
// { var _acc = 0, _i = 0; for (; _i < 0; _i++) { _acc = _acc ^ _i * K; }
|
|
111
|
+
// if (_acc !== 0) { _acc ^= K2; } }
|
|
112
|
+
() => {
|
|
113
|
+
const k = pickConst();
|
|
114
|
+
const accId = randInternalId();
|
|
115
|
+
const iId = randHexId();
|
|
116
|
+
return t.blockStatement([
|
|
117
|
+
t.variableDeclaration("var", [
|
|
118
|
+
t.variableDeclarator(t.identifier(accId), t.numericLiteral(0)),
|
|
119
|
+
t.variableDeclarator(t.identifier(iId), t.numericLiteral(0)),
|
|
120
|
+
]),
|
|
121
|
+
t.forStatement(null, t.binaryExpression("<", t.identifier(iId), t.numericLiteral(0)), t.updateExpression("++", t.identifier(iId)), t.blockStatement([
|
|
122
|
+
t.expressionStatement(t.assignmentExpression("=", t.identifier(accId), t.binaryExpression(">>>", t.binaryExpression("^", t.identifier(accId), t.binaryExpression("*", t.identifier(iId), t.numericLiteral(k >>> 0))), t.numericLiteral(0)))),
|
|
123
|
+
])),
|
|
124
|
+
t.ifStatement(t.binaryExpression("!==", t.identifier(accId), t.numericLiteral(0)), t.blockStatement([
|
|
125
|
+
t.expressionStatement(t.assignmentExpression("^=", t.identifier(accId), t.numericLiteral(k & 0xffff))),
|
|
126
|
+
])),
|
|
127
|
+
]);
|
|
128
|
+
},
|
|
129
|
+
// T3: Unsigned shift result checked as negative — (x >>> 0) is always >= 0
|
|
130
|
+
// { var _hash = seed ^ K; _hash ^= _hash >>> 16;
|
|
131
|
+
// var _u32 = _hash >>> 0; if (_u32 < 0) { ... } }
|
|
132
|
+
() => {
|
|
133
|
+
const seed = Math.floor(Math.random() * 0xffff);
|
|
134
|
+
const kc = pickConst();
|
|
135
|
+
const id1 = randInternalId();
|
|
136
|
+
const id2 = randInternalId();
|
|
137
|
+
const bodyConst = Math.floor(Math.random() * 0xffff);
|
|
138
|
+
return t.blockStatement([
|
|
139
|
+
t.variableDeclaration("var", [
|
|
140
|
+
t.variableDeclarator(t.identifier(id1), t.binaryExpression("^", t.numericLiteral(seed), t.numericLiteral(kc >>> 0))),
|
|
141
|
+
]),
|
|
142
|
+
t.expressionStatement(t.assignmentExpression("=", t.identifier(id1), t.binaryExpression("^", t.identifier(id1), t.binaryExpression(">>>", t.identifier(id1), t.numericLiteral(16))))),
|
|
143
|
+
t.variableDeclaration("var", [
|
|
144
|
+
t.variableDeclarator(t.identifier(id2), t.binaryExpression(">>>", t.identifier(id1), t.numericLiteral(0))),
|
|
145
|
+
]),
|
|
146
|
+
// (>>> 0) converts to uint32 — result is NEVER < 0
|
|
147
|
+
t.ifStatement(t.binaryExpression("<", t.identifier(id2), t.numericLiteral(0)), t.blockStatement([
|
|
148
|
+
t.expressionStatement(t.assignmentExpression("=", t.identifier(id1), t.binaryExpression("^", t.identifier(id2), t.numericLiteral(bodyConst)))),
|
|
149
|
+
])),
|
|
150
|
+
]);
|
|
151
|
+
},
|
|
152
|
+
// T4: n ^ n is always 0 — threshold check never reached
|
|
153
|
+
// { var _flag = (n ^ n) | 0; if ((_flag >>> 1) >= 0x40000000) { ... } }
|
|
154
|
+
() => {
|
|
155
|
+
const n = Math.floor(Math.random() * 0xffff);
|
|
156
|
+
const id = randInternalId();
|
|
157
|
+
return t.blockStatement([
|
|
158
|
+
t.variableDeclaration("var", [
|
|
159
|
+
t.variableDeclarator(t.identifier(id), t.binaryExpression("|", t.binaryExpression("^", t.numericLiteral(n), t.numericLiteral(n)), t.numericLiteral(0))),
|
|
160
|
+
]),
|
|
161
|
+
// 0 >>> 1 = 0, which is never >= 0x40000000
|
|
162
|
+
t.ifStatement(t.binaryExpression(">=", t.binaryExpression(">>>", t.identifier(id), t.numericLiteral(1)), t.numericLiteral(0x40000000)), t.blockStatement([
|
|
163
|
+
t.expressionStatement(t.assignmentExpression("+=", t.identifier(id), t.numericLiteral(pickConst() & 0xffff))),
|
|
164
|
+
])),
|
|
165
|
+
]);
|
|
166
|
+
},
|
|
167
|
+
// T5: try/catch with dead while — ptr (0x7fffffff) is never less than end (0x1fffffff)
|
|
168
|
+
() => {
|
|
169
|
+
const ptrId = randInternalId();
|
|
170
|
+
const endId = randInternalId();
|
|
171
|
+
const k = pickConst() & 0xffff;
|
|
172
|
+
return t.tryStatement(t.blockStatement([
|
|
173
|
+
t.variableDeclaration("var", [
|
|
174
|
+
t.variableDeclarator(t.identifier(ptrId), t.numericLiteral(0x7fffffff)),
|
|
175
|
+
t.variableDeclarator(t.identifier(endId),
|
|
176
|
+
// 0x7fffffff >>> 2 = 0x1fffffff
|
|
177
|
+
t.binaryExpression(">>>", t.numericLiteral(0x7fffffff), t.numericLiteral(2))),
|
|
178
|
+
]),
|
|
179
|
+
// 0x7fffffff < 0x1fffffff is always false
|
|
180
|
+
t.whileStatement(t.binaryExpression("<", t.identifier(ptrId), t.identifier(endId)), t.blockStatement([
|
|
181
|
+
t.expressionStatement(t.assignmentExpression("=", t.identifier(ptrId), t.binaryExpression("^", t.binaryExpression(">>>", t.identifier(ptrId), t.numericLiteral(1)), t.numericLiteral(k)))),
|
|
182
|
+
])),
|
|
183
|
+
]), t.catchClause(t.identifier("_e"), t.blockStatement([])));
|
|
184
|
+
},
|
|
185
|
+
// T6: switch — value is (base >> shift), cases are base >> shift + 0x100 / 0x200
|
|
186
|
+
// so neither case is ever matched
|
|
187
|
+
() => {
|
|
188
|
+
const base = Math.floor(Math.random() * 0xfe) + 1;
|
|
189
|
+
const shift = (Math.floor(Math.random() * 4) + 4); // 4-7
|
|
190
|
+
const computed = base >> shift; // small value (0-15)
|
|
191
|
+
const case1 = computed + 0x100;
|
|
192
|
+
const case2 = computed + 0x200;
|
|
193
|
+
const varId = randInternalId();
|
|
194
|
+
const tmpId = randHexId();
|
|
195
|
+
return t.blockStatement([
|
|
196
|
+
t.variableDeclaration("var", [
|
|
197
|
+
t.variableDeclarator(t.identifier(varId), t.binaryExpression(">>", t.numericLiteral(base), t.numericLiteral(shift))),
|
|
198
|
+
]),
|
|
199
|
+
t.switchStatement(t.identifier(varId), [
|
|
200
|
+
t.switchCase(t.numericLiteral(case1), [
|
|
201
|
+
t.variableDeclaration("var", [
|
|
202
|
+
t.variableDeclarator(t.identifier(tmpId), t.binaryExpression("^", t.identifier(varId), t.numericLiteral(pickConst() & 0xffff))),
|
|
203
|
+
]),
|
|
204
|
+
t.breakStatement(),
|
|
205
|
+
]),
|
|
206
|
+
t.switchCase(t.numericLiteral(case2), [
|
|
207
|
+
t.expressionStatement(t.assignmentExpression("=", t.identifier(varId), t.numericLiteral(0))),
|
|
208
|
+
t.breakStatement(),
|
|
209
|
+
]),
|
|
210
|
+
]),
|
|
211
|
+
]);
|
|
212
|
+
},
|
|
213
|
+
// T7: Named IIFE performing FNV-like hash — result immediately discarded
|
|
214
|
+
// (function _0xXXXX() { var _hash = seed; _hash ^= _hash >>> 16; _hash = (_hash * K) >>> 0; return _hash; })()
|
|
215
|
+
() => {
|
|
216
|
+
const seed = (Math.floor(Math.random() * 0xffffffff) >>> 0) + 1;
|
|
217
|
+
const fnId = randHexId();
|
|
218
|
+
const resId = randInternalId();
|
|
219
|
+
const k = pickConst() >>> 0;
|
|
220
|
+
return t.expressionStatement(t.callExpression(t.functionExpression(t.identifier(fnId), [], t.blockStatement([
|
|
221
|
+
t.variableDeclaration("var", [
|
|
222
|
+
t.variableDeclarator(t.identifier(resId), t.numericLiteral(seed)),
|
|
223
|
+
]),
|
|
224
|
+
t.expressionStatement(t.assignmentExpression("^=", t.identifier(resId), t.binaryExpression(">>>", t.identifier(resId), t.numericLiteral(16)))),
|
|
225
|
+
t.expressionStatement(t.assignmentExpression("=", t.identifier(resId), t.binaryExpression(">>>", t.binaryExpression("*", t.identifier(resId), t.numericLiteral(k)), t.numericLiteral(0)))),
|
|
226
|
+
t.returnStatement(t.identifier(resId)),
|
|
227
|
+
])), []));
|
|
228
|
+
},
|
|
51
229
|
];
|
|
52
230
|
/**
|
|
53
231
|
* Pass: Dead Code Injection
|
|
54
232
|
*
|
|
55
|
-
* Inserts unreachable/useless code blocks throughout the program body
|
|
56
|
-
* inflate file size and confuse static analysis
|
|
233
|
+
* Inserts unreachable/useless code blocks throughout the program body AND
|
|
234
|
+
* inside function bodies to inflate file size and confuse static analysis.
|
|
235
|
+
* Templates use opaque predicates requiring multi-step analysis to refute.
|
|
57
236
|
*/
|
|
58
237
|
function applyDeadCode(ast, options = {}) {
|
|
59
238
|
const targetLines = options.targetLines ?? 50;
|
|
60
239
|
const body = ast.program.body;
|
|
240
|
+
// Phase 1: inject into the top-level program body
|
|
61
241
|
let injected = 0;
|
|
62
242
|
let insertAt = 0;
|
|
63
243
|
while (injected < targetLines && insertAt <= body.length) {
|
|
64
|
-
const template = DEAD_TEMPLATES[
|
|
244
|
+
const template = DEAD_TEMPLATES[Math.floor(Math.random() * DEAD_TEMPLATES.length)];
|
|
65
245
|
body.splice(insertAt, 0, template());
|
|
66
246
|
injected++;
|
|
67
247
|
insertAt += 2; // skip one real statement between injections
|
|
68
248
|
}
|
|
249
|
+
// Phase 2: inject 1-2 dead statements inside each eligible function body
|
|
250
|
+
// This makes dead code appear nested in real logic, not just top-level noise.
|
|
251
|
+
(0, traverse_1.default)(ast, {
|
|
252
|
+
Function(path) {
|
|
253
|
+
if (!t.isBlockStatement(path.node.body))
|
|
254
|
+
return;
|
|
255
|
+
const fnBody = path.node.body.body;
|
|
256
|
+
// Only inject into non-trivial functions
|
|
257
|
+
if (fnBody.length < 2)
|
|
258
|
+
return;
|
|
259
|
+
const count = Math.floor(Math.random() * 2) + 1; // 1 or 2
|
|
260
|
+
for (let i = 0; i < count; i++) {
|
|
261
|
+
const template = DEAD_TEMPLATES[Math.floor(Math.random() * DEAD_TEMPLATES.length)];
|
|
262
|
+
// Insert near the start (positions 0–2) so it blends with initialization code
|
|
263
|
+
const pos = Math.min(Math.floor(Math.random() * 3), fnBody.length);
|
|
264
|
+
fnBody.splice(pos, 0, template());
|
|
265
|
+
}
|
|
266
|
+
path.skip(); // avoid double-visiting nested functions
|
|
267
|
+
},
|
|
268
|
+
});
|
|
69
269
|
}
|
|
70
270
|
//# sourceMappingURL=deadCode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deadCode.js","sourceRoot":"","sources":["../../../src/obfuscation/deadCode.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,sCAaC;AAvDD,gDAAkC;AAGlC,qCAAqC;AACrC,MAAM,cAAc,GAA0B;IAC5C,GAAG,EAAE,CACH,CAAC,CAAC,WAAW,CACX,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EACnE,CAAC,CAAC,cAAc,CAAC;QACf,CAAC,CAAC,mBAAmB,CACnB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;YACjF,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC;SAC/B,CAAC,CACH;KACF,CAAC,CACH;IACH,GAAG,EAAE,CACH,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,EACvB,CAAC,CAAC,cAAc,CAAC;QACf,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;KAC5E,CAAC,CACH;IACH,GAAG,EAAE,CACH,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE;QAC3B,CAAC,CAAC,kBAAkB,CAClB,CAAC,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EACzE,CAAC,CAAC,gBAAgB,CAChB,GAAG,EACH,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,EAClD,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CACpB,CACF;KACF,CAAC;CACL,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,GAAW,EAAE,UAA2B,EAAE;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAqB,CAAC;IAE/C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,OAAO,QAAQ,GAAG,WAAW,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,QAAQ,EAAE,CAAC;QACX,QAAQ,IAAI,CAAC,CAAC,CAAC,6CAA6C;IAC9D,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"deadCode.js","sourceRoot":"","sources":["../../../src/obfuscation/deadCode.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,8 @@ import type { FunctionTableOptions } from "../types";
|
|
|
11
11
|
* foo(1);
|
|
12
12
|
*
|
|
13
13
|
* After:
|
|
14
|
-
* const
|
|
15
|
-
*
|
|
14
|
+
* const __obscura_ft = [function foo(x) { return x; }];
|
|
15
|
+
* __obscura_ft[0](1);
|
|
16
16
|
*/
|
|
17
17
|
export declare function applyFunctionTable(ast: t.File, options?: FunctionTableOptions): void;
|
|
18
18
|
//# sourceMappingURL=functionTable.d.ts.map
|
|
@@ -50,12 +50,12 @@ const t = __importStar(require("@babel/types"));
|
|
|
50
50
|
* foo(1);
|
|
51
51
|
*
|
|
52
52
|
* After:
|
|
53
|
-
* const
|
|
54
|
-
*
|
|
53
|
+
* const __obscura_ft = [function foo(x) { return x; }];
|
|
54
|
+
* __obscura_ft[0](1);
|
|
55
55
|
*/
|
|
56
56
|
function applyFunctionTable(ast, options = {}) {
|
|
57
57
|
const minFunctions = options.minFunctions ?? 2;
|
|
58
|
-
const tableId = "
|
|
58
|
+
const tableId = "__obscura_ft";
|
|
59
59
|
// Collect top-level named function declarations first, then remove only if threshold is met
|
|
60
60
|
const functions = [];
|
|
61
61
|
const nameToIndex = new Map();
|
|
@@ -96,7 +96,7 @@ function applyFunctionTable(ast, options = {}) {
|
|
|
96
96
|
});
|
|
97
97
|
path.remove();
|
|
98
98
|
}
|
|
99
|
-
// Prepend: const
|
|
99
|
+
// Prepend: const __obscura_ft = [fn0, fn1, ...]
|
|
100
100
|
const tableDeclaration = t.variableDeclaration("const", [
|
|
101
101
|
t.variableDeclarator(t.identifier(tableId), t.arrayExpression(functions.map((f) => f.fn))),
|
|
102
102
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functionTable.js","sourceRoot":"","sources":["../../../src/obfuscation/functionTable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,gDA6DC;AA/ED,+DAA0D;AAC1D,gDAAkC;AAGlC;;;;;;;;;;;;;GAaG;AACH,SAAgB,kBAAkB,CAAC,GAAW,EAAE,UAAgC,EAAE;IAChF,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"functionTable.js","sourceRoot":"","sources":["../../../src/obfuscation/functionTable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,gDA6DC;AA/ED,+DAA0D;AAC1D,gDAAkC;AAGlC;;;;;;;;;;;;;GAaG;AACH,SAAgB,kBAAkB,CAAC,GAAW,EAAE,UAAgC,EAAE;IAChF,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,cAAc,CAAC;IAE/B,4FAA4F;IAC5F,MAAM,SAAS,GAA+C,EAAE,CAAC;IACjE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,aAAa,GAAsC,EAAE,CAAC;IAE5D,IAAA,kBAAQ,EAAC,GAAG,EAAE;QACZ,mBAAmB,CAAC,IAAI;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO;YAC1B,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAO;YAC1E,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,aAAa,CAAC,MAAM,GAAG,YAAY;QAAE,OAAO;IAEhD,8CAA8C;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,wEAAwE;IACxE,8DAA8D;IAC9D,IAAA,kBAAQ,EAAC,GAAG,EAAE;QACZ,cAAc,CAAC,IAAI;YACjB,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAO;YAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO;YAE9B,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,gBAAgB,CACnC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EACrB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EACrB,IAAI,CAAC,WAAW;aACjB,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,wEAAwE;IACxE,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAG,CAAC,IAAI;YACtB,EAAE,EAAE,CAAC,CAAC,kBAAkB,CACtB,IAAI,EACJ,IAAI,CAAC,IAAI,CAAC,MAAM,EAChB,IAAI,CAAC,IAAI,CAAC,IAAI,EACd,IAAI,CAAC,IAAI,CAAC,SAAS,EACnB,IAAI,CAAC,IAAI,CAAC,KAAK,CAChB;SACF,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,gDAAgD;IAChD,MAAM,gBAAgB,GAAG,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE;QACtD,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC3F,CAAC,CAAC;IAEF,GAAG,CAAC,OAAO,CAAC,IAAsB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -6,7 +6,11 @@ import type { MbaOptions } from "../types";
|
|
|
6
6
|
* Replaces simple numeric literals and binary expressions with equivalent
|
|
7
7
|
* MBA expressions, making static analysis significantly harder.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Identities applied:
|
|
10
|
+
* x + y → (x ^ y) + 2*(x & y)
|
|
11
|
+
* x - y → (x ^ y) - 2*(~x & y)
|
|
12
|
+
* x | y → (x ^ y) + (x & y) [bit-disjoint: no carry]
|
|
13
|
+
* x ^ y → (x | y) - (x & y)
|
|
10
14
|
*/
|
|
11
15
|
export declare function applyMba(ast: t.File, options?: MbaOptions): void;
|
|
12
16
|
//# sourceMappingURL=mba.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mba.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/mba.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C
|
|
1
|
+
{"version":3,"file":"mba.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/mba.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,UAAe,GAAG,IAAI,CA8EpE"}
|
|
@@ -45,7 +45,11 @@ const t = __importStar(require("@babel/types"));
|
|
|
45
45
|
* Replaces simple numeric literals and binary expressions with equivalent
|
|
46
46
|
* MBA expressions, making static analysis significantly harder.
|
|
47
47
|
*
|
|
48
|
-
*
|
|
48
|
+
* Identities applied:
|
|
49
|
+
* x + y → (x ^ y) + 2*(x & y)
|
|
50
|
+
* x - y → (x ^ y) - 2*(~x & y)
|
|
51
|
+
* x | y → (x ^ y) + (x & y) [bit-disjoint: no carry]
|
|
52
|
+
* x ^ y → (x | y) - (x & y)
|
|
49
53
|
*/
|
|
50
54
|
function applyMba(ast, options = {}) {
|
|
51
55
|
const rounds = options.rounds ?? 1;
|
|
@@ -56,8 +60,7 @@ function applyMba(ast, options = {}) {
|
|
|
56
60
|
const { operator, left, right } = path.node;
|
|
57
61
|
if (!t.isExpression(left) || !t.isExpression(right))
|
|
58
62
|
return;
|
|
59
|
-
|
|
60
|
-
if (operator !== "+" && operator !== "-")
|
|
63
|
+
if (operator !== "+" && operator !== "-" && operator !== "|" && operator !== "^")
|
|
61
64
|
return;
|
|
62
65
|
// Skip string concatenation — MBA identities only hold for integers
|
|
63
66
|
if (operator === "+" &&
|
|
@@ -74,10 +77,18 @@ function applyMba(ast, options = {}) {
|
|
|
74
77
|
// x + y ≡ (x ^ y) + 2 * (x & y)
|
|
75
78
|
replacement = t.binaryExpression("+", t.binaryExpression("^", t.cloneNode(left), t.cloneNode(right)), t.binaryExpression("*", t.numericLiteral(2), t.binaryExpression("&", t.cloneNode(left), t.cloneNode(right))));
|
|
76
79
|
}
|
|
77
|
-
else {
|
|
80
|
+
else if (operator === "-") {
|
|
78
81
|
// x - y ≡ (x ^ y) - 2 * (~x & y)
|
|
79
82
|
replacement = t.binaryExpression("-", t.binaryExpression("^", t.cloneNode(left), t.cloneNode(right)), t.binaryExpression("*", t.numericLiteral(2), t.binaryExpression("&", t.unaryExpression("~", t.cloneNode(left)), t.cloneNode(right))));
|
|
80
83
|
}
|
|
84
|
+
else if (operator === "|") {
|
|
85
|
+
// x | y ≡ (x ^ y) + (x & y)
|
|
86
|
+
replacement = t.binaryExpression("+", t.binaryExpression("^", t.cloneNode(left), t.cloneNode(right)), t.binaryExpression("&", t.cloneNode(left), t.cloneNode(right)));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// x ^ y ≡ (x | y) - (x & y)
|
|
90
|
+
replacement = t.binaryExpression("-", t.binaryExpression("|", t.cloneNode(left), t.cloneNode(right)), t.binaryExpression("&", t.cloneNode(left), t.cloneNode(right)));
|
|
91
|
+
}
|
|
81
92
|
if (!replacement.extra)
|
|
82
93
|
replacement.extra = {};
|
|
83
94
|
replacement.extra["mbaExpanded"] = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mba.js","sourceRoot":"","sources":["../../../src/obfuscation/mba.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"mba.js","sourceRoot":"","sources":["../../../src/obfuscation/mba.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import type { StringPoolOptions } from "../types";
|
|
|
8
8
|
* used in Google reCAPTCHA's string obfuscation.
|
|
9
9
|
*
|
|
10
10
|
* Before: "hello"
|
|
11
|
-
* After:
|
|
11
|
+
* After: __obscura_sp(0, 4, <seed>)
|
|
12
12
|
*/
|
|
13
13
|
export declare function applyStringPool(ast: t.File, options?: StringPoolOptions): void;
|
|
14
14
|
//# sourceMappingURL=stringPool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringPool.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/stringPool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqBlD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"stringPool.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/stringPool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqBlD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI,CA8IlF"}
|
|
@@ -39,8 +39,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.applyStringPool = applyStringPool;
|
|
40
40
|
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
41
41
|
const t = __importStar(require("@babel/types"));
|
|
42
|
-
const POOL_FN = "
|
|
43
|
-
const POOL_VAR = "
|
|
42
|
+
const POOL_FN = "__obscura_sp";
|
|
43
|
+
const POOL_VAR = "__obscura_pool";
|
|
44
44
|
/**
|
|
45
45
|
* XOR-based LCG string encryption matching reCAPTCHA's encrypted string pool.
|
|
46
46
|
* Each character depends on all previous characters (running key accumulation).
|
|
@@ -64,10 +64,11 @@ function encryptString(str, seed) {
|
|
|
64
64
|
* used in Google reCAPTCHA's string obfuscation.
|
|
65
65
|
*
|
|
66
66
|
* Before: "hello"
|
|
67
|
-
* After:
|
|
67
|
+
* After: __obscura_sp(0, 4, <seed>)
|
|
68
68
|
*/
|
|
69
69
|
function applyStringPool(ast, options = {}) {
|
|
70
|
-
|
|
70
|
+
// Randomize seed per invocation when not explicitly provided (avoids fixed-seed fingerprint)
|
|
71
|
+
const seed = options.seed ?? Math.floor(Math.random() * 0x7fffff) + 1;
|
|
71
72
|
const entries = [];
|
|
72
73
|
const allCiphertext = [];
|
|
73
74
|
const literalToIndex = new Map();
|
|
@@ -99,7 +100,7 @@ function applyStringPool(ast, options = {}) {
|
|
|
99
100
|
});
|
|
100
101
|
if (entries.length === 0)
|
|
101
102
|
return;
|
|
102
|
-
// Replace string literals with
|
|
103
|
+
// Replace string literals with __obscura_sp(start, len, seed) calls
|
|
103
104
|
for (const { path, entry } of replacements) {
|
|
104
105
|
path.replaceWith(t.callExpression(t.identifier(POOL_FN), [
|
|
105
106
|
t.numericLiteral(entry.start),
|
|
@@ -112,10 +113,10 @@ function applyStringPool(ast, options = {}) {
|
|
|
112
113
|
t.variableDeclarator(t.identifier(POOL_VAR), t.arrayExpression(allCiphertext.map((b) => t.numericLiteral(b)))),
|
|
113
114
|
]);
|
|
114
115
|
// Decryption function:
|
|
115
|
-
// function
|
|
116
|
+
// function __obscura_sp(start, len, seed) {
|
|
116
117
|
// let key = seed, out = '';
|
|
117
118
|
// for (let i = 0; i < len; i++) {
|
|
118
|
-
// const b = (
|
|
119
|
+
// const b = (__obscura_pool[start + i] ^ key) & 0x7f;
|
|
119
120
|
// out += String.fromCodePoint(b);
|
|
120
121
|
// key = (key + b) & 0x7f;
|
|
121
122
|
// }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringPool.js","sourceRoot":"","sources":["../../../src/obfuscation/stringPool.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,
|
|
1
|
+
{"version":3,"file":"stringPool.js","sourceRoot":"","sources":["../../../src/obfuscation/stringPool.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obscura-js",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "JavaScript code protection tool — obfuscation & anti-debugging inspired by Google reCAPTCHA",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"obscura-js": "dist/bin/haze.js"
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
|
-
"build": "tsc",
|
|
22
|
+
"build": "tsc && chmod +x dist/bin/haze.js",
|
|
23
23
|
"build:watch": "tsc --watch",
|
|
24
24
|
"prepublishOnly": "npm run build && npm test",
|
|
25
25
|
"test": "jest --coverage",
|