obscura-js 0.1.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.
Files changed (54) hide show
  1. package/README.md +156 -0
  2. package/dist/bin/haze.d.ts +3 -0
  3. package/dist/bin/haze.d.ts.map +1 -0
  4. package/dist/bin/haze.js +54 -0
  5. package/dist/bin/haze.js.map +1 -0
  6. package/dist/src/antiDebug/index.d.ts +11 -0
  7. package/dist/src/antiDebug/index.d.ts.map +1 -0
  8. package/dist/src/antiDebug/index.js +23 -0
  9. package/dist/src/antiDebug/index.js.map +1 -0
  10. package/dist/src/antiDebug/integrityTag.d.ts +21 -0
  11. package/dist/src/antiDebug/integrityTag.d.ts.map +1 -0
  12. package/dist/src/antiDebug/integrityTag.js +100 -0
  13. package/dist/src/antiDebug/integrityTag.js.map +1 -0
  14. package/dist/src/antiDebug/nativeBinding.d.ts +15 -0
  15. package/dist/src/antiDebug/nativeBinding.d.ts.map +1 -0
  16. package/dist/src/antiDebug/nativeBinding.js +89 -0
  17. package/dist/src/antiDebug/nativeBinding.js.map +1 -0
  18. package/dist/src/index.d.ts +12 -0
  19. package/dist/src/index.d.ts.map +1 -0
  20. package/dist/src/index.js +35 -0
  21. package/dist/src/index.js.map +1 -0
  22. package/dist/src/obfuscation/cff.d.ts +26 -0
  23. package/dist/src/obfuscation/cff.d.ts.map +1 -0
  24. package/dist/src/obfuscation/cff.js +129 -0
  25. package/dist/src/obfuscation/cff.js.map +1 -0
  26. package/dist/src/obfuscation/deadCode.d.ts +10 -0
  27. package/dist/src/obfuscation/deadCode.d.ts.map +1 -0
  28. package/dist/src/obfuscation/deadCode.js +70 -0
  29. package/dist/src/obfuscation/deadCode.js.map +1 -0
  30. package/dist/src/obfuscation/functionTable.d.ts +18 -0
  31. package/dist/src/obfuscation/functionTable.d.ts.map +1 -0
  32. package/dist/src/obfuscation/functionTable.js +105 -0
  33. package/dist/src/obfuscation/functionTable.js.map +1 -0
  34. package/dist/src/obfuscation/index.d.ts +15 -0
  35. package/dist/src/obfuscation/index.d.ts.map +1 -0
  36. package/dist/src/obfuscation/index.js +47 -0
  37. package/dist/src/obfuscation/index.js.map +1 -0
  38. package/dist/src/obfuscation/mba.d.ts +12 -0
  39. package/dist/src/obfuscation/mba.d.ts.map +1 -0
  40. package/dist/src/obfuscation/mba.js +91 -0
  41. package/dist/src/obfuscation/mba.js.map +1 -0
  42. package/dist/src/obfuscation/sequenceExpression.d.ts +16 -0
  43. package/dist/src/obfuscation/sequenceExpression.d.ts.map +1 -0
  44. package/dist/src/obfuscation/sequenceExpression.js +85 -0
  45. package/dist/src/obfuscation/sequenceExpression.js.map +1 -0
  46. package/dist/src/obfuscation/stringPool.d.ts +14 -0
  47. package/dist/src/obfuscation/stringPool.d.ts.map +1 -0
  48. package/dist/src/obfuscation/stringPool.js +142 -0
  49. package/dist/src/obfuscation/stringPool.js.map +1 -0
  50. package/dist/src/types.d.ts +65 -0
  51. package/dist/src/types.d.ts.map +1 -0
  52. package/dist/src/types.js +3 -0
  53. package/dist/src/types.js.map +1 -0
  54. package/package.json +71 -0
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.applySequenceExpression = applySequenceExpression;
40
+ const traverse_1 = __importDefault(require("@babel/traverse"));
41
+ const t = __importStar(require("@babel/types"));
42
+ /**
43
+ * Pass: Sequence Expression Flattening
44
+ *
45
+ * Converts block statements inside `if` / `else` branches into comma-separated
46
+ * sequence expressions, mirroring reCAPTCHA's code-flattening technique.
47
+ *
48
+ * Before:
49
+ * if (cond) { a = 1; b = 2; }
50
+ *
51
+ * After:
52
+ * cond && ((a = 1), (b = 2));
53
+ */
54
+ function applySequenceExpression(ast, options = {}) {
55
+ const probability = options.probability ?? 1.0;
56
+ (0, traverse_1.default)(ast, {
57
+ IfStatement(path) {
58
+ if (Math.random() > probability)
59
+ return;
60
+ const { test, consequent, alternate } = path.node;
61
+ // Only flatten simple BlockStatement bodies (no declarations)
62
+ const canFlatten = (node) => t.isBlockStatement(node) &&
63
+ node.body.every((s) => t.isExpressionStatement(s));
64
+ if (!canFlatten(consequent))
65
+ return;
66
+ if (alternate !== null && alternate !== undefined && !canFlatten(alternate))
67
+ return;
68
+ const toSeq = (block) => {
69
+ const exprs = block.body.map((s) => s.expression);
70
+ return exprs.length === 1 ? exprs[0] : t.sequenceExpression(exprs);
71
+ };
72
+ let replacement;
73
+ if (alternate === null || alternate === undefined) {
74
+ // if (cond) { ... } → cond && (...)
75
+ replacement = t.logicalExpression("&&", test, toSeq(consequent));
76
+ }
77
+ else {
78
+ // if (cond) { ... } else { ... } → cond ? (...) : (...)
79
+ replacement = t.conditionalExpression(test, toSeq(consequent), toSeq(alternate));
80
+ }
81
+ path.replaceWith(t.expressionStatement(replacement));
82
+ },
83
+ });
84
+ }
85
+ //# sourceMappingURL=sequenceExpression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequenceExpression.js","sourceRoot":"","sources":["../../../src/obfuscation/sequenceExpression.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,0DAyCC;AAzDD,+DAAuC;AACvC,gDAAkC;AAGlC;;;;;;;;;;;GAWG;AACH,SAAgB,uBAAuB,CACrC,GAAW,EACX,UAAqC,EAAE;IAEvC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;IAE/C,IAAA,kBAAQ,EAAC,GAAG,EAAE;QACZ,WAAW,CAAC,IAAI;YACd,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW;gBAAE,OAAO;YAExC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;YAElD,8DAA8D;YAC9D,MAAM,UAAU,GAAG,CAAC,IAAiB,EAA4B,EAAE,CACjE,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,OAAO;YACpC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO;YAEpF,MAAM,KAAK,GAAG,CAAC,KAAuB,EAAgB,EAAE;gBACtD,MAAM,KAAK,GAAI,KAAK,CAAC,IAAgC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC/E,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACrE,CAAC,CAAC;YAEF,IAAI,WAAyB,CAAC;YAC9B,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAClD,sCAAsC;gBACtC,WAAW,GAAG,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,UAA8B,CAAC,CAAC,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACN,0DAA0D;gBAC1D,WAAW,GAAG,CAAC,CAAC,qBAAqB,CACnC,IAAI,EACJ,KAAK,CAAC,UAA8B,CAAC,EACrC,KAAK,CAAC,SAA6B,CAAC,CACrC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;QACvD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ import * as t from "@babel/types";
2
+ import type { StringPoolOptions } from "../types";
3
+ /**
4
+ * Pass: Encrypted String Pool
5
+ *
6
+ * Moves all string literals into an encrypted pool and replaces each
7
+ * occurrence with a runtime decryption call, mirroring the LCG-XOR approach
8
+ * used in Google reCAPTCHA's string obfuscation.
9
+ *
10
+ * Before: "hello"
11
+ * After: __haze_sp(0, 4, <seed>)
12
+ */
13
+ export declare function applyStringPool(ast: t.File, options?: StringPoolOptions): void;
14
+ //# sourceMappingURL=stringPool.d.ts.map
@@ -0,0 +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,CA6IlF"}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.applyStringPool = applyStringPool;
40
+ const traverse_1 = __importDefault(require("@babel/traverse"));
41
+ const t = __importStar(require("@babel/types"));
42
+ const POOL_FN = "__haze_sp";
43
+ const POOL_VAR = "__haze_pool";
44
+ /**
45
+ * XOR-based LCG string encryption matching reCAPTCHA's encrypted string pool.
46
+ * Each character depends on all previous characters (running key accumulation).
47
+ */
48
+ function encryptString(str, seed) {
49
+ let key = seed;
50
+ const ciphertext = [];
51
+ for (let i = 0; i < str.length; i++) {
52
+ const cp = str.codePointAt(i) ?? 0;
53
+ const encrypted = (cp ^ key) & 0x7f;
54
+ ciphertext.push(encrypted);
55
+ key = (key + encrypted) & 0x7f;
56
+ }
57
+ return { ciphertext, seed };
58
+ }
59
+ /**
60
+ * Pass: Encrypted String Pool
61
+ *
62
+ * Moves all string literals into an encrypted pool and replaces each
63
+ * occurrence with a runtime decryption call, mirroring the LCG-XOR approach
64
+ * used in Google reCAPTCHA's string obfuscation.
65
+ *
66
+ * Before: "hello"
67
+ * After: __haze_sp(0, 4, <seed>)
68
+ */
69
+ function applyStringPool(ast, options = {}) {
70
+ const seed = options.seed ?? 42;
71
+ const entries = [];
72
+ const allCiphertext = [];
73
+ const literalToIndex = new Map();
74
+ function getOrAdd(str) {
75
+ if (literalToIndex.has(str)) {
76
+ return entries[literalToIndex.get(str)];
77
+ }
78
+ const { ciphertext } = encryptString(str, seed);
79
+ const start = allCiphertext.length;
80
+ allCiphertext.push(...ciphertext);
81
+ const entry = { start, len: str.length, seed };
82
+ literalToIndex.set(str, entries.length);
83
+ entries.push(entry);
84
+ return entry;
85
+ }
86
+ const replacements = [];
87
+ (0, traverse_1.default)(ast, {
88
+ StringLiteral(path) {
89
+ // Skip import/export specifiers and require calls
90
+ if (t.isImportDeclaration(path.parent) ||
91
+ t.isExportDeclaration(path.parent) ||
92
+ (t.isCallExpression(path.parent) &&
93
+ t.isIdentifier(path.parent.callee, { name: "require" }))) {
94
+ return;
95
+ }
96
+ const entry = getOrAdd(path.node.value);
97
+ replacements.push({ path, entry });
98
+ },
99
+ });
100
+ if (entries.length === 0)
101
+ return;
102
+ // Replace string literals with __haze_sp(start, len, seed) calls
103
+ for (const { path, entry } of replacements) {
104
+ path.replaceWith(t.callExpression(t.identifier(POOL_FN), [
105
+ t.numericLiteral(entry.start),
106
+ t.numericLiteral(entry.len),
107
+ t.numericLiteral(seed),
108
+ ]));
109
+ }
110
+ // Prepend the pool array and decryption function
111
+ const poolArray = t.variableDeclaration("const", [
112
+ t.variableDeclarator(t.identifier(POOL_VAR), t.arrayExpression(allCiphertext.map((b) => t.numericLiteral(b)))),
113
+ ]);
114
+ // Decryption function:
115
+ // function __haze_sp(start, len, seed) {
116
+ // let key = seed, out = '';
117
+ // for (let i = 0; i < len; i++) {
118
+ // const b = (__haze_pool[start + i] ^ key) & 0x7f;
119
+ // out += String.fromCodePoint(b);
120
+ // key = (key + b) & 0x7f;
121
+ // }
122
+ // return out;
123
+ // }
124
+ const decryptFn = t.functionDeclaration(t.identifier(POOL_FN), [t.identifier("start"), t.identifier("len"), t.identifier("seed")], t.blockStatement([
125
+ t.variableDeclaration("let", [
126
+ t.variableDeclarator(t.identifier("key"), t.identifier("seed")),
127
+ t.variableDeclarator(t.identifier("out"), t.stringLiteral("")),
128
+ ]),
129
+ t.forStatement(t.variableDeclaration("let", [
130
+ t.variableDeclarator(t.identifier("i"), t.numericLiteral(0)),
131
+ ]), t.binaryExpression("<", t.identifier("i"), t.identifier("len")), t.updateExpression("++", t.identifier("i")), t.blockStatement([
132
+ t.variableDeclaration("const", [
133
+ t.variableDeclarator(t.identifier("b"), t.binaryExpression("&", t.binaryExpression("^", t.memberExpression(t.identifier(POOL_VAR), t.binaryExpression("+", t.identifier("start"), t.identifier("i")), true), t.identifier("key")), t.numericLiteral(0x7f))),
134
+ ]),
135
+ t.expressionStatement(t.assignmentExpression("+=", t.identifier("out"), t.callExpression(t.memberExpression(t.identifier("String"), t.identifier("fromCodePoint")), [t.identifier("b")]))),
136
+ t.expressionStatement(t.assignmentExpression("=", t.identifier("key"), t.binaryExpression("&", t.binaryExpression("+", t.identifier("key"), t.memberExpression(t.identifier(POOL_VAR), t.binaryExpression("+", t.identifier("start"), t.identifier("i")), true)), t.numericLiteral(0x7f)))),
137
+ ])),
138
+ t.returnStatement(t.identifier("out")),
139
+ ]));
140
+ ast.program.body.unshift(decryptFn, poolArray);
141
+ }
142
+ //# sourceMappingURL=stringPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringPool.js","sourceRoot":"","sources":["../../../src/obfuscation/stringPool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import * as t from "@babel/types";
2
+ /** A single AST transformation pass */
3
+ export interface Pass<TOptions> {
4
+ /** Human-readable name of the pass */
5
+ readonly name: string;
6
+ /** Apply the pass to the given AST node in-place */
7
+ apply(ast: t.File, options?: TOptions): void;
8
+ }
9
+ export interface SequenceExpressionOptions {
10
+ /** Probability (0–1) of converting a block to a sequence expression */
11
+ probability?: number;
12
+ }
13
+ export interface MbaOptions {
14
+ /** Number of MBA expansion rounds (default: 1) */
15
+ rounds?: number;
16
+ }
17
+ export interface FunctionTableOptions {
18
+ /** Minimum number of functions before building an indirect table */
19
+ minFunctions?: number;
20
+ }
21
+ export interface StringPoolOptions {
22
+ /** XOR seed for the encrypted string pool */
23
+ seed?: number;
24
+ }
25
+ export interface ControlFlowFlatteningOptions {
26
+ /** Number of state-machine passes (default: 1) */
27
+ passes?: number;
28
+ }
29
+ export interface DeadCodeOptions {
30
+ /** Target lines of dead code to inject (default: 50) */
31
+ targetLines?: number;
32
+ }
33
+ export interface ObfuscationOptions {
34
+ sequenceExpression?: SequenceExpressionOptions | false;
35
+ mba?: MbaOptions | false;
36
+ functionTable?: FunctionTableOptions | false;
37
+ stringPool?: StringPoolOptions | false;
38
+ controlFlowFlattening?: ControlFlowFlatteningOptions | false;
39
+ deadCode?: DeadCodeOptions | false;
40
+ }
41
+ export interface IntegrityTagOptions {
42
+ /** Symbol description string (default: 'jas') */
43
+ tagDescription?: string;
44
+ }
45
+ export interface NativeBindingOptions {
46
+ /** List of native methods to pre-bind (e.g. 'Math.floor') */
47
+ methods?: string[];
48
+ }
49
+ export interface AntiDebugOptions {
50
+ integrityTag?: IntegrityTagOptions | false;
51
+ nativeBinding?: NativeBindingOptions | false;
52
+ }
53
+ export interface HazeOptions {
54
+ obfuscation?: ObfuscationOptions;
55
+ antiDebug?: AntiDebugOptions;
56
+ /** Minify the output (removes whitespace and shortens literals). Default: false */
57
+ minify?: boolean;
58
+ }
59
+ export interface ProtectResult {
60
+ /** Protected source code */
61
+ code: string;
62
+ /** Applied pass names in order */
63
+ appliedPasses: string[];
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAIlC,uCAAuC;AACvC,MAAM,WAAW,IAAI,CAAC,QAAQ;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC9C;AAID,MAAM,WAAW,yBAAyB;IACxC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,4BAA4B;IAC3C,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,CAAC,EAAE,yBAAyB,GAAG,KAAK,CAAC;IACvD,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IACzB,aAAa,CAAC,EAAE,oBAAoB,GAAG,KAAK,CAAC;IAC7C,UAAU,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC;IACvC,qBAAqB,CAAC,EAAE,4BAA4B,GAAG,KAAK,CAAC;IAC7D,QAAQ,CAAC,EAAE,eAAe,GAAG,KAAK,CAAC;CACpC;AAID,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAC;IAC3C,aAAa,CAAC,EAAE,oBAAoB,GAAG,KAAK,CAAC;CAC9C;AAID,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "obscura-js",
3
+ "version": "0.1.0",
4
+ "description": "JavaScript code protection tool — obfuscation & anti-debugging inspired by Google reCAPTCHA",
5
+ "main": "dist/src/index.js",
6
+ "types": "dist/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "require": "./dist/src/index.js",
10
+ "types": "./dist/src/index.d.ts"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist/",
15
+ "README.md"
16
+ ],
17
+ "sideEffects": false,
18
+ "bin": {
19
+ "obscura-js": "dist/bin/haze.js"
20
+ },
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "build:watch": "tsc --watch",
24
+ "prepublishOnly": "npm run build && npm test",
25
+ "test": "jest --coverage",
26
+ "lint": "eslint src/ bin/",
27
+ "lint:fix": "eslint src/ bin/ --fix",
28
+ "format": "prettier --write \"src/**/*.ts\" \"bin/**/*.ts\" \"tests/**/*.ts\"",
29
+ "format:check": "prettier --check \"src/**/*.ts\" \"bin/**/*.ts\" \"tests/**/*.ts\"",
30
+ "dev": "ts-node bin/haze.ts"
31
+ },
32
+ "keywords": [
33
+ "obfuscation",
34
+ "javascript",
35
+ "security",
36
+ "anti-debug",
37
+ "anti-tamper",
38
+ "code-protection",
39
+ "ast",
40
+ "babel"
41
+ ],
42
+ "author": "vientorepublic",
43
+ "license": "MIT",
44
+ "engines": {
45
+ "node": ">=18.0.0"
46
+ },
47
+ "dependencies": {
48
+ "@babel/core": "^7.24.0",
49
+ "@babel/generator": "^7.24.0",
50
+ "@babel/parser": "^7.24.0",
51
+ "@babel/traverse": "^7.24.0",
52
+ "@babel/types": "^7.24.0",
53
+ "commander": "^12.0.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/babel__core": "^7.20.5",
57
+ "@types/babel__generator": "^7.6.8",
58
+ "@types/babel__traverse": "^7.20.6",
59
+ "@types/jest": "^29.5.12",
60
+ "@types/node": "^20.12.0",
61
+ "@typescript-eslint/eslint-plugin": "^8.59.4",
62
+ "@typescript-eslint/parser": "^8.59.4",
63
+ "eslint": "^8.57.0",
64
+ "eslint-config-prettier": "^10.1.8",
65
+ "jest": "^29.7.0",
66
+ "prettier": "^3.8.3",
67
+ "ts-jest": "^29.1.2",
68
+ "ts-node": "^10.9.2",
69
+ "typescript": "^5.4.5"
70
+ }
71
+ }