obscura-js 1.1.1 → 1.2.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/README.md +4 -3
- package/dist/bin/obscura_cli.js +1 -1
- package/dist/src/antiDebug/integrityTag.d.ts.map +1 -1
- package/dist/src/antiDebug/integrityTag.js +3 -2
- package/dist/src/antiDebug/integrityTag.js.map +1 -1
- package/dist/src/antiDebug/nativeBinding.d.ts.map +1 -1
- package/dist/src/antiDebug/nativeBinding.js +2 -1
- package/dist/src/antiDebug/nativeBinding.js.map +1 -1
- package/dist/src/genId.d.ts +9 -0
- package/dist/src/genId.d.ts.map +1 -0
- package/dist/src/genId.js +20 -0
- package/dist/src/genId.js.map +1 -0
- package/dist/src/obfuscation/cff.d.ts.map +1 -1
- package/dist/src/obfuscation/cff.js +2 -1
- package/dist/src/obfuscation/cff.js.map +1 -1
- package/dist/src/obfuscation/functionTable.d.ts.map +1 -1
- package/dist/src/obfuscation/functionTable.js +69 -2
- package/dist/src/obfuscation/functionTable.js.map +1 -1
- package/dist/src/obfuscation/stringPool.d.ts.map +1 -1
- package/dist/src/obfuscation/stringPool.js +7 -12
- package/dist/src/obfuscation/stringPool.js.map +1 -1
- package/package.json +11 -3
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
A JavaScript code protection library inspired by the obfuscation and anti-debugging techniques used in Google reCAPTCHA.
|
|
8
8
|
|
|
9
|
+
[](https://github.com/vientorepublic/obscura-js/actions/workflows/ci.yml)
|
|
9
10
|
[](https://www.npmjs.com/package/obscura-js)
|
|
10
11
|
[](LICENSE)
|
|
11
12
|
[](package.json)
|
|
@@ -67,9 +68,9 @@ console.log(appliedPasses);
|
|
|
67
68
|
|
|
68
69
|
### `protect(source, options?)`
|
|
69
70
|
|
|
70
|
-
| Parameter | Type
|
|
71
|
-
| --------- |
|
|
72
|
-
| `source` | `string`
|
|
71
|
+
| Parameter | Type | Description |
|
|
72
|
+
| --------- | ---------------- | --------------------------------- |
|
|
73
|
+
| `source` | `string` | JavaScript source code to protect |
|
|
73
74
|
| `options` | `ObscuraOptions` | Optional configuration |
|
|
74
75
|
|
|
75
76
|
Returns `ProtectResult`:
|
package/dist/bin/obscura_cli.js
CHANGED
|
@@ -128,7 +128,7 @@ const program = new commander_1.Command();
|
|
|
128
128
|
program
|
|
129
129
|
.name("obscura-js")
|
|
130
130
|
.description("JavaScript code protection tool — obfuscation & anti-debugging")
|
|
131
|
-
.version("1.
|
|
131
|
+
.version("1.2.0");
|
|
132
132
|
program
|
|
133
133
|
.command("protect <input>")
|
|
134
134
|
.description("Protect a JavaScript file")
|
|
@@ -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;
|
|
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;AAGpD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAqEtF"}
|
|
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.applyIntegrityTag = applyIntegrityTag;
|
|
40
40
|
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
41
41
|
const t = __importStar(require("@babel/types"));
|
|
42
|
+
const genId_1 = require("../genId");
|
|
42
43
|
/**
|
|
43
44
|
* Pass: Symbol-based Integrity Tag
|
|
44
45
|
*
|
|
@@ -62,8 +63,8 @@ function applyIntegrityTag(ast, options = {}) {
|
|
|
62
63
|
.toString(36)
|
|
63
64
|
.slice(0, 6);
|
|
64
65
|
const description = options.tagDescription ?? defaultDesc;
|
|
65
|
-
const symVar =
|
|
66
|
-
const tagFn =
|
|
66
|
+
const symVar = (0, genId_1.genId)();
|
|
67
|
+
const tagFn = (0, genId_1.genId)();
|
|
67
68
|
// Randomized mixing constants for checksum computation
|
|
68
69
|
const K1 = (Math.floor(Math.random() * 0xffff) | 1) >>> 0; // odd, non-zero
|
|
69
70
|
const K2 = (Math.floor(Math.random() * 0xffff) | 1) >>> 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrityTag.js","sourceRoot":"","sources":["../../../src/antiDebug/integrityTag.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"integrityTag.js","sourceRoot":"","sources":["../../../src/antiDebug/integrityTag.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeBinding.d.ts","sourceRoot":"","sources":["../../../src/antiDebug/nativeBinding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"nativeBinding.d.ts","sourceRoot":"","sources":["../../../src/antiDebug/nativeBinding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAerD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,oBAAyB,GAAG,IAAI,CAsCxF"}
|
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.applyNativeBinding = applyNativeBinding;
|
|
37
37
|
const t = __importStar(require("@babel/types"));
|
|
38
|
+
const genId_1 = require("../genId");
|
|
38
39
|
/** Default set of native methods to pre-bind */
|
|
39
40
|
const DEFAULT_METHODS = [
|
|
40
41
|
"Math.floor",
|
|
@@ -63,7 +64,7 @@ function applyNativeBinding(ast, options = {}) {
|
|
|
63
64
|
const parts = methodPath.split(".");
|
|
64
65
|
// receiver is the object before the last segment (e.g. Math for Math.floor)
|
|
65
66
|
const receiverPath = parts.slice(0, -1).join(".");
|
|
66
|
-
const constName =
|
|
67
|
+
const constName = (0, genId_1.genId)();
|
|
67
68
|
// Build member expression: Math.floor
|
|
68
69
|
const memberExpr = parts.reduce((acc, part) => t.memberExpression(acc, t.identifier(part)), t.identifier(parts[0]));
|
|
69
70
|
// Actually rebuild correctly:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeBinding.js","sourceRoot":"","sources":["../../../src/antiDebug/nativeBinding.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"nativeBinding.js","sourceRoot":"","sources":["../../../src/antiDebug/nativeBinding.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,gDAsCC;AAjED,gDAAkC;AAElC,oCAAiC;AAEjC,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,IAAA,aAAK,GAAE,CAAC;QAE1B,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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a random 8-digit hex identifier that matches the style already
|
|
3
|
+
* used by the dead-code pass (_0xAAAABBBB). Injected runtime helpers
|
|
4
|
+
* (string pool, function table, CFF state, integrity tag, native bindings)
|
|
5
|
+
* use these names so they are visually indistinguishable from obfuscated
|
|
6
|
+
* user variables produced by other passes.
|
|
7
|
+
*/
|
|
8
|
+
export declare function genId(): string;
|
|
9
|
+
//# sourceMappingURL=genId.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genId.d.ts","sourceRoot":"","sources":["../../src/genId.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,KAAK,IAAI,MAAM,CAQ9B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.genId = genId;
|
|
4
|
+
/**
|
|
5
|
+
* Generates a random 8-digit hex identifier that matches the style already
|
|
6
|
+
* used by the dead-code pass (_0xAAAABBBB). Injected runtime helpers
|
|
7
|
+
* (string pool, function table, CFF state, integrity tag, native bindings)
|
|
8
|
+
* use these names so they are visually indistinguishable from obfuscated
|
|
9
|
+
* user variables produced by other passes.
|
|
10
|
+
*/
|
|
11
|
+
function genId() {
|
|
12
|
+
const a = Math.floor(Math.random() * 0xffff)
|
|
13
|
+
.toString(16)
|
|
14
|
+
.padStart(4, "0");
|
|
15
|
+
const b = Math.floor(Math.random() * 0xffff)
|
|
16
|
+
.toString(16)
|
|
17
|
+
.padStart(4, "0");
|
|
18
|
+
return `_0x${a}${b}`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=genId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genId.js","sourceRoot":"","sources":["../../src/genId.ts"],"names":[],"mappings":";;AAOA,sBAQC;AAfD;;;;;;GAMG;AACH,SAAgB,KAAK;IACnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC;SACzC,QAAQ,CAAC,EAAE,CAAC;SACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC;SACzC,QAAQ,CAAC,EAAE,CAAC;SACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpB,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,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;
|
|
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;AAG7D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,CAAC,CAAC,IAAI,EACX,OAAO,GAAE,4BAAiC,GACzC,IAAI,CA2FN"}
|
|
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.applyControlFlowFlattening = applyControlFlowFlattening;
|
|
40
40
|
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
41
41
|
const t = __importStar(require("@babel/types"));
|
|
42
|
+
const genId_1 = require("../genId");
|
|
42
43
|
/**
|
|
43
44
|
* Pass: Control Flow Flattening (CFF)
|
|
44
45
|
*
|
|
@@ -63,7 +64,7 @@ const t = __importStar(require("@babel/types"));
|
|
|
63
64
|
*/
|
|
64
65
|
function applyControlFlowFlattening(ast, options = {}) {
|
|
65
66
|
const passes = options.passes ?? 1;
|
|
66
|
-
const stateVar =
|
|
67
|
+
const stateVar = (0, genId_1.genId)();
|
|
67
68
|
/**
|
|
68
69
|
* If `stmt` is a let/const VariableDeclaration, extract the declarators into
|
|
69
70
|
* `hoisted` (as var-declared names only) and return ExpressionStatements for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cff.js","sourceRoot":"","sources":["../../../src/obfuscation/cff.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"cff.js","sourceRoot":"","sources":["../../../src/obfuscation/cff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functionTable.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/functionTable.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"functionTable.d.ts","sourceRoot":"","sources":["../../../src/obfuscation/functionTable.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGrD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,oBAAyB,GAAG,IAAI,CAoGxF"}
|
|
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.applyFunctionTable = applyFunctionTable;
|
|
40
40
|
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
41
41
|
const t = __importStar(require("@babel/types"));
|
|
42
|
+
const genId_1 = require("../genId");
|
|
42
43
|
/**
|
|
43
44
|
* Pass: Indirect Function Table
|
|
44
45
|
*
|
|
@@ -55,7 +56,46 @@ const t = __importStar(require("@babel/types"));
|
|
|
55
56
|
*/
|
|
56
57
|
function applyFunctionTable(ast, options = {}) {
|
|
57
58
|
const minFunctions = options.minFunctions ?? 2;
|
|
58
|
-
const tableId =
|
|
59
|
+
const tableId = (0, genId_1.genId)();
|
|
60
|
+
// ── Step 1: collect names that "leak" out of this module ──────────────────
|
|
61
|
+
// Removing the declaration of a leaked function would silently break callers
|
|
62
|
+
// outside the module (ESM consumers) or property accesses (CJS consumers).
|
|
63
|
+
const leakedNames = new Set();
|
|
64
|
+
(0, traverse_1.default)(ast, {
|
|
65
|
+
// ESM: export { foo }, export { foo as bar }
|
|
66
|
+
ExportNamedDeclaration(path) {
|
|
67
|
+
if (path.node.source)
|
|
68
|
+
return; // re-export from another file — no local binding
|
|
69
|
+
for (const spec of path.node.specifiers) {
|
|
70
|
+
if (t.isExportSpecifier(spec) && t.isIdentifier(spec.local)) {
|
|
71
|
+
leakedNames.add(spec.local.name);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
// ESM: export default foo (identifier, not an inline declaration)
|
|
76
|
+
ExportDefaultDeclaration(path) {
|
|
77
|
+
if (t.isIdentifier(path.node.declaration)) {
|
|
78
|
+
leakedNames.add(path.node.declaration.name);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
// CJS: module.exports = foo | module.exports.x = foo | exports.x = foo
|
|
82
|
+
// module.exports = { foo } | module.exports = { x: foo }
|
|
83
|
+
AssignmentExpression(path) {
|
|
84
|
+
const { left, right } = path.node;
|
|
85
|
+
if (!isExportsTarget(left))
|
|
86
|
+
return;
|
|
87
|
+
if (t.isIdentifier(right)) {
|
|
88
|
+
leakedNames.add(right.name);
|
|
89
|
+
}
|
|
90
|
+
else if (t.isObjectExpression(right)) {
|
|
91
|
+
for (const prop of right.properties) {
|
|
92
|
+
if (t.isObjectProperty(prop) && t.isIdentifier(prop.value)) {
|
|
93
|
+
leakedNames.add(prop.value.name);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
});
|
|
59
99
|
// Collect top-level named function declarations first, then remove only if threshold is met
|
|
60
100
|
const functions = [];
|
|
61
101
|
const nameToIndex = new Map();
|
|
@@ -66,6 +106,8 @@ function applyFunctionTable(ast, options = {}) {
|
|
|
66
106
|
return;
|
|
67
107
|
if (!t.isProgram(path.parent) && !t.isBlockStatement(path.parent))
|
|
68
108
|
return;
|
|
109
|
+
if (leakedNames.has(path.node.id.name))
|
|
110
|
+
return; // preserve exported/leaked functions
|
|
69
111
|
functionPaths.push(path);
|
|
70
112
|
},
|
|
71
113
|
});
|
|
@@ -96,10 +138,35 @@ function applyFunctionTable(ast, options = {}) {
|
|
|
96
138
|
});
|
|
97
139
|
path.remove();
|
|
98
140
|
}
|
|
99
|
-
// Prepend: const
|
|
141
|
+
// Prepend: const <tableId> = [fn0, fn1, ...]
|
|
100
142
|
const tableDeclaration = t.variableDeclaration("const", [
|
|
101
143
|
t.variableDeclarator(t.identifier(tableId), t.arrayExpression(functions.map((f) => f.fn))),
|
|
102
144
|
]);
|
|
103
145
|
ast.program.body.unshift(tableDeclaration);
|
|
104
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Returns true if `node` is an assignment target that exposes a value as a
|
|
149
|
+
* CJS export: `exports`, `module.exports`, or any member of `module.exports`.
|
|
150
|
+
*/
|
|
151
|
+
function isExportsTarget(node) {
|
|
152
|
+
// bare `exports`
|
|
153
|
+
if (t.isIdentifier(node, { name: "exports" }))
|
|
154
|
+
return true;
|
|
155
|
+
if (!t.isMemberExpression(node) || node.computed)
|
|
156
|
+
return false;
|
|
157
|
+
// `exports.foo`
|
|
158
|
+
if (t.isIdentifier(node.object, { name: "exports" }))
|
|
159
|
+
return true;
|
|
160
|
+
// `module.exports`
|
|
161
|
+
if (t.isIdentifier(node.object, { name: "module" }) &&
|
|
162
|
+
t.isIdentifier(node.property, { name: "exports" }))
|
|
163
|
+
return true;
|
|
164
|
+
// `module.exports.foo`
|
|
165
|
+
if (t.isMemberExpression(node.object) &&
|
|
166
|
+
!node.object.computed &&
|
|
167
|
+
t.isIdentifier(node.object.object, { name: "module" }) &&
|
|
168
|
+
t.isIdentifier(node.object.property, { name: "exports" }))
|
|
169
|
+
return true;
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
105
172
|
//# sourceMappingURL=functionTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functionTable.js","sourceRoot":"","sources":["../../../src/obfuscation/functionTable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"functionTable.js","sourceRoot":"","sources":["../../../src/obfuscation/functionTable.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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;AAkClD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI,CAwIlF"}
|
|
@@ -39,8 +39,7 @@ 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
|
|
43
|
-
const POOL_VAR = "__obscura_pool";
|
|
42
|
+
const genId_1 = require("../genId");
|
|
44
43
|
/**
|
|
45
44
|
* XOR-based LCG string encryption matching reCAPTCHA's encrypted string pool.
|
|
46
45
|
* Each character depends on all previous characters (running key accumulation).
|
|
@@ -83,6 +82,9 @@ function isRequireLikeCall(node) {
|
|
|
83
82
|
* After: __obscura_sp(0, 4, <seed>)
|
|
84
83
|
*/
|
|
85
84
|
function applyStringPool(ast, options = {}) {
|
|
85
|
+
// Per-call random identifiers — indistinguishable from dead-code variables.
|
|
86
|
+
const POOL_FN = (0, genId_1.genId)();
|
|
87
|
+
const POOL_VAR = (0, genId_1.genId)();
|
|
86
88
|
// Normalize to 1..0xffff — the effective XOR key must never be zero,
|
|
87
89
|
// and seeds above 0xffff carry no extra entropy (only lower 16 bits matter).
|
|
88
90
|
const masterSeed = options.seed !== undefined
|
|
@@ -94,6 +96,8 @@ function applyStringPool(ast, options = {}) {
|
|
|
94
96
|
StringLiteral(path) {
|
|
95
97
|
// Skip import/export specifiers and all require-family calls
|
|
96
98
|
if (t.isImportDeclaration(path.parent) ||
|
|
99
|
+
// dynamic import('./path') — parsed as CallExpression { callee: Import }
|
|
100
|
+
(t.isCallExpression(path.parent) && t.isImport(path.parent.callee)) ||
|
|
97
101
|
t.isExportDeclaration(path.parent) ||
|
|
98
102
|
isRequireLikeCall(path.parent)) {
|
|
99
103
|
return;
|
|
@@ -122,16 +126,7 @@ function applyStringPool(ast, options = {}) {
|
|
|
122
126
|
const poolArray = t.variableDeclaration("const", [
|
|
123
127
|
t.variableDeclarator(t.identifier(POOL_VAR), t.arrayExpression(allCiphertext.map((b) => t.numericLiteral(b)))),
|
|
124
128
|
]);
|
|
125
|
-
// Decryption function:
|
|
126
|
-
// function __obscura_sp(start, len, seed) {
|
|
127
|
-
// let key = seed, out = '';
|
|
128
|
-
// for (let i = 0; i < len; i++) {
|
|
129
|
-
// const b = (__obscura_pool[start + i] ^ key) & 0xffff;
|
|
130
|
-
// out += String.fromCharCode(b);
|
|
131
|
-
// key = (key + pool[start+i]) & 0xffff;
|
|
132
|
-
// }
|
|
133
|
-
// return out;
|
|
134
|
-
// }
|
|
129
|
+
// Decryption function (name is randomised per call):
|
|
135
130
|
const decryptFn = t.functionDeclaration(t.identifier(POOL_FN), [t.identifier("start"), t.identifier("len"), t.identifier("seed")], t.blockStatement([
|
|
136
131
|
t.variableDeclaration("let", [
|
|
137
132
|
t.variableDeclarator(t.identifier("key"), t.identifier("seed")),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringPool.js","sourceRoot":"","sources":["../../../src/obfuscation/stringPool.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"stringPool.js","sourceRoot":"","sources":["../../../src/obfuscation/stringPool.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obscura-js",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "JavaScript code protection tool — obfuscation & anti-debugging inspired by Google reCAPTCHA",
|
|
5
|
+
"type": "commonjs",
|
|
5
6
|
"main": "dist/src/index.js",
|
|
6
7
|
"types": "dist/src/index.d.ts",
|
|
7
8
|
"exports": {
|
|
8
9
|
".": {
|
|
9
|
-
"require":
|
|
10
|
-
|
|
10
|
+
"require": {
|
|
11
|
+
"types": "./dist/src/index.d.ts",
|
|
12
|
+
"default": "./dist/src/index.js"
|
|
13
|
+
},
|
|
14
|
+
"import": {
|
|
15
|
+
"types": "./dist/src/index.d.ts",
|
|
16
|
+
"default": "./dist/src/index.js"
|
|
17
|
+
},
|
|
18
|
+
"default": "./dist/src/index.js"
|
|
11
19
|
}
|
|
12
20
|
},
|
|
13
21
|
"files": [
|