
क्रिप्टोग्राफ़िक इंडिस्टिंगुइशेबिलिटी ऑबफस्केशन तकनीकों पर आधारित एक JavaScript ऑबफस्केटर
यह परियोजना अविभेद्यता अस्पष्टीकरण (indistinguishability obfuscation) प्राप्त नहीं करती है। आपको इस उत्पाद का उपयोग रहस्यों की सुरक्षा के लिए नहीं करना चाहिए। यह रिवर्स इंजीनियरिंग को रोकने के लिए नहीं, बल्कि हतोत्साहित करने के लिए मौजूद है।
एक JavaScript अस्पष्टीकरणकर्ता (obfuscator) जो मनुष्यों और LLM दोनों के लिए कोड को पढ़ने और विश्लेषण करने में अत्यंत कठिन बनाने के लिए डिज़ाइन किया गया है। TypeScript में लिखा गया। सहकर्मी-समीक्षित क्रिप्टोग्राफ़िक अस्पष्टीकरण अनुसंधान से तकनीकों को लागू करता है।
npm install
npm run build
# Basic usage
node dist/index.js input.js > output.js
# With target token budget (default: 2,000,000)
node dist/index.js --target-tokens 500000 input.js > output.js
# Minimal obfuscation (small output)
node dist/index.js --target-tokens 10000 input.js > output.js
# Maximum bloat (10M tokens)
node dist/index.js --target-tokens 10000000 input.js > output.js
# Using environment variable
INPUT_FILE=input.js node dist/index.js > output.js
# Help
node dist/index.js --help
| Option | Default | Description |
|---|---|---|
--target-tokens <n> | 2000000 | टोकनों में लक्ष्य आउटपुट आकार। छोटे इनपुट इस सीमा तक फुलाए जाते हैं। बड़े इनपुट बजट के भीतर रहने के लिए कम फुलाव उत्पन्न करते हैं। |
--help, -h | सहायता संदेश दिखाएँ |
npm run build # Compile TypeScript to dist/
npm run start # Run the obfuscator (reads input.js)
npm run test # Run the test suite
npm run obfuscate-package # Run compatibility tests against npm packages
const { obfuscate } = require('./dist/obfuscator');
const code = 'function add(a, b) { return a + b; }';
const obfuscated = obfuscate(code);
// With options
const obfuscated = obfuscate(code, { targetTokens: 500000 });
अस्पष्टीकरणकर्ता 4 चरणों में 20 ट्रांसफ़ॉर्म लागू करता है। प्रत्येक चरण पिछले चरण पर आधारित होता है।
| Order | Transform | File | Description |
|---|---|---|---|
| 1 | Anti-Debug Traps | transforms/antiDebug.ts | eval("debugger") कथनों और अभाज्य-संख्या अंतराल (5s-600s) वाले 10-20 setInterval लूप इंजेक्ट करता है जो बार-बार डिबगर ब्रेकपॉइंट ट्रिगर करते हैं। प्रत्येक उदाहरण अद्वितीय एन्कोडेड स्ट्रिंग्स का उपयोग करता है। |
| 2 | Punctured Program Tripwires | transforms/tripwires.ts | पैरामीटर हैश की तुलना गुप्त मानों से करने वाले छिपे हुए चेक एम्बेड करता है। 5 हैश पैटर्न (बिटवाइज़ फ़िंगरप्रिंट, मॉड्यूलर अंकगणित, charCodeAt, संख्यात्मक हैश, typeof+length)। गुप्त इनपुट पर मौन स्थिति भ्रष्टाचार, व्यस्त लूप, या थ्रो ट्रिगर करता है। [पेपर 4] |
| 3 | LPN Noise Injection | transforms/noiseInjection.ts | अंकगणितीय गणनाओं में विभाजित पथों के माध्यम से यादृच्छिक शोर जोड़ता और रद्द करता है। 6 पैटर्न: जोड़/घटाव, XOR, गुणा/भाग, विभाजित द्वि-चर, गणना हैश-श्रृंखला, बिट-रोटेट। पूर्ण रद्दीकरण का पता लगाए बिना मध्यवर्ती मान अर्थहीन होते हैं। [पेपर 7] |
| Order | Transform | File | Description |
|---|---|---|---|
| 4 | Control Flow Flattening | transforms/controlFlowFlattening.ts | फ़ंक्शन बॉडी को while(true) { switch((_s * P) % M) { ... } } स्टेट मशीनों में परिवर्तित करता है, मॉड्यूलर अंकगणित डिस्पैच के साथ — केस मान यादृच्छिक अभाज्य पैरामीटरों का उपयोग करके (stateId * multiplier) % modulus के माध्यम से एन्कोड किए जाते हैं। [पेपर 3] |
| 5 | Opaque Predicates | transforms/opaquePredicates.ts | ऐसी if शर्तें इंजेक्ट करता है जो हमेशा सही या गलत निकलती हैं लेकिन गणितीय रूप से सिद्ध करना कठिन होता है (जैसे (x*x+x)%2===0)। मॉड्यूलर अंकगणित, बिटवाइज़ और टाइप-चेक श्रेणियों में 15 प्रेडिकेट सूत्र। |
| 6 | Proxy Functions | transforms/proxyFunctions.ts | सभी फ़ंक्शन कॉल्स को दो डिस्पैचरों के माध्यम से रूट करता है: सरल कॉल्स के लिए _fc(fn, ...args), मेथड कॉल्स के लिए _mc(obj, prop, ...args)। लचीलेपन के लिए स्थानीय चर में कैप्चर किए गए Function.prototype.apply का उपयोग करता है। |
| 7 | Context Window Exhaustion | transforms/contextExhaustion.ts | एक्सप्रेशन को गहरे नेस्टेड टर्नरी, अपारदर्शी शर्तों, void-एक्सप्रेशन श्रृंखलाओं और सशर्त void पैडिंग के साथ लपेटता है। LLM को शोर पर कॉन्टेक्स्ट विंडो टोकन बर्बाद करने के लिए मजबूर करता है। |
| 8 | Comma Expression Merging | transforms/commaExpressions.ts | क्रमिक एक्सप्रेशन स्टेटमेंट्स को एकल कॉमा एक्सप्रेशन में संक्षिप्त करता है: a(); b(); return c() बन जाता है return a(), b(), c()। |
| Order | Pass | File | Description |
|---|---|---|---|
| 9 | Pass 1: Catalog | passes/firstPass.ts | AST को ट्रैवर्स करता है और हर पहचानकर्ता को सूचीबद्ध करता है, एक ग्लोबल्स मैप बनाता है जो प्रत्येक को 16 स्क्रिप्ट रेंज (CJK, हंगुल, ग्रीक, सिरिलिक, देवनागरी, थाई, अरबी, काताकाना, आदि) से लिया गया यादृच्छिक 6-16 वर्णों वाला यूनिकोड नाम प्रदान करता है। |
| 10 | Pass 2: Substitute | passes/secondPass.ts | सभी पहचानकर्ता नामों को उनके अस्पष्टीकृत यूनिकोड समकक्षों से बदलता है। require() तर्कों को String.fromCharCode(...) के रूप में एन्कोड करता है। स्थिर import/export स्रोतों को यूनिकोड-एस्केप्ड स्ट्रिंग लिटरल के रूप में एन्कोड करता है। क्लास superClass संदर्भों, टेम्पलेट लिटरल एक्सप्रेशन, डिस्ट्रक्चरिंग पैटर्न को प्रतिस्थापित करता है। |
| 11 | Pass 3: Dummy Parameters | passes/thirdPass.ts | हर फ़ंक्शन घोषणा और एक्सप्रेशन में 0-15 यादृच्छिक अप्रयुक्त पैरामीटर इंजेक्ट करता है। रेस्ट पैरामीटर वाले फ़ंक्शन छोड़ देता है। सभी टिप्पणियाँ हटा देता है। |
| Order | Transform | File | Description |
|---|---|---|---|
| 12 | Global Variable Encoding | transforms/globalVariableEncoding.ts | ग्लोबल्स के संदर्भों (डायनामिक रूप से globalThis + window पैकेज से खोजे गए) को eval("Name<suffix>".replace(new RegExp("<suffix>$"), "")) से बदलता है। दोनों स्ट्रिंग्स स्ट्रिंग ऐरे से होकर गुजरती हैं। |
| 13 | Property Key Encoding | transforms/propertyKeyEncoding.ts | डॉट एक्सेस को प्रति-स्कोप रजिस्ट्रियों के साथ कंप्यूटेड एक्सेस में परिवर्तित करता है। क्रॉस-स्कोप एक्सेस काम करता है क्योंकि सभी सफिक्स रनटाइम पर .replace() के माध्यम से एक ही प्रॉपर्टी नाम पर हल होते हैं। |
| 14 | Number Encoding | transforms/numberEncoding.ts | 11 एन्कोडिंग रणनीतियाँ: shift+add, XOR आइडेंटिटी, कॉम्प्लिमेंट, डिवीज़न, नेस्टेड शिफ्ट, डबल-NOT, मॉड्यूलर, आदि। प्रत्येक उदाहरण विशिष्ट रूप से उत्पन्न होता है। प्रॉपर्टी कुंजियाँ और स्विच केस मान छोड़ देता है। |
| 15 | Self-Integrity Verification | transforms/selfIntegrity.ts | 2-4 रनटाइम चेक इंजेक्ट करता है: eval नेटिव-कोड सत्यापन, Function.prototype.toString अखंडता, समय विसंगति का पता लगाना, कोड संरचना सत्यापन। एंटी-टैम्पर प्रतिक्रियाएँ: व्यस्त प्रतीक्षा, थ्रो, मौन भ्रष्टाचार। [पेपर 10] |
| 16 | String Array Extraction | transforms/stringArrayExtraction.ts | सभी स्ट्रिंग्स को एक ही ऐरे में एकत्र करता है जिसमें श्रृंखलाबद्ध XOR डिक्रिप्शन (प्रविष्टि N की कुंजी प्रविष्टि N-1 की डिकोड की गई सामग्री पर निर्भर करती है) और स्पार्स स्थिति-निर्भर त्रुटि पैटर्न (प्रत्येक वर्ण को एक अलग XOR कुंजी मिलती है, चुनिंदा स्थितियों पर LPN-प्रेरित स्पार्स त्रुटियों के साथ)। [पेपर 2, 9] |
| 17 | Console Stubs | obfuscator.ts | डायनामिक रूप से सभी console मेथड खोजता है और प्रत्येक को no-op फ़ंक्शन पर सेट करता है। |
| 18 | Terser Minification | obfuscator.ts | terser के माध्यम से व्हाइटस्पेस/फ़ॉर्मेटिंग हटाता है (mangle: false, compress: false)। यदि terser आउटपुट पार्स नहीं कर सकता तो regex-आधारित स्ट्रिपिंग पर वापस चला जाता है। |
डेड कोड को दो जनरेशन रणनीतियों के साथ कई बिंदुओं पर इंजेक्ट किया जाता है: